summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Fischer <joeljfischer@gmail.com>2021-04-14 13:03:29 -0400
committerJoel Fischer <joeljfischer@gmail.com>2021-04-14 13:03:29 -0400
commitf6b70997eb2f70384afcddf46d3ec27edfd2a113 (patch)
tree72907c0796bef747fdeb28a64f3904a580314fc2
parent8b1bc1f9ba4df6a722c58ed376dff9fd0f28444c (diff)
parent629ce735915527b4f19f42ba3df62cabd194c9dd (diff)
downloadsdl_ios-f6b70997eb2f70384afcddf46d3ec27edfd2a113.tar.gz
Merge branch 'develop'7.1.0
-rw-r--r--.github/workflows/test.yml28
-rw-r--r--CHANGELOG.md78
-rw-r--r--Cartfile.private3
-rw-r--r--Cartfile.resolved5
-rw-r--r--DEPENDENCIES.md31
-rw-r--r--Example Apps/Example ObjC/AlertManager.m26
-rw-r--r--Example Apps/Example ObjC/ConnectionIAPTableViewController.m6
-rw-r--r--Example Apps/Example ObjC/ConnectionTCPTableViewController.m6
-rw-r--r--Example Apps/Example ObjC/MenuManager.m28
-rw-r--r--Example Apps/Example ObjC/ProxyManager.m23
-rw-r--r--Example Apps/Example ObjC/VehicleDataManager.m4
-rw-r--r--Example Apps/Example Swift/AlertManager.swift23
-rw-r--r--Example Apps/Example Swift/ConnectionIAPTableViewController.swift8
-rw-r--r--Example Apps/Example Swift/ConnectionTCPTableViewController.swift8
-rw-r--r--Example Apps/Example Swift/MenuManager.swift28
-rw-r--r--Example Apps/Example Swift/ProxyManager.swift29
-rw-r--r--Example Apps/Example Swift/VehicleDataManager.swift4
-rw-r--r--Example Apps/Shared/AppConstants.h1
-rw-r--r--Example Apps/Shared/AppConstants.m1
-rw-r--r--Package.swift2
-rw-r--r--README.md16
-rw-r--r--SmartDeviceLink-iOS.podspec4
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj525
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme2
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme2
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme2
-rw-r--r--SmartDeviceLink.podspec4
-rw-r--r--SmartDeviceLink/private/NSArray+Extensions.h20
-rw-r--r--SmartDeviceLink/private/NSArray+Extensions.m26
-rw-r--r--SmartDeviceLink/private/SDLAlertManager.h52
-rw-r--r--SmartDeviceLink/private/SDLAlertManager.m171
-rwxr-xr-xSmartDeviceLink/private/SDLCarWindow.h7
-rw-r--r--SmartDeviceLink/private/SDLCarWindow.m89
-rw-r--r--SmartDeviceLink/private/SDLChoiceSetManager.m92
-rw-r--r--SmartDeviceLink/private/SDLConnectionManagerType.h5
-rw-r--r--SmartDeviceLink/private/SDLControlFramePayloadConstants.h22
-rw-r--r--SmartDeviceLink/private/SDLControlFramePayloadConstants.m22
-rw-r--r--SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.h46
-rw-r--r--SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.m74
-rw-r--r--SmartDeviceLink/private/SDLEncryptionLifecycleManager.m20
-rw-r--r--SmartDeviceLink/private/SDLError.h9
-rw-r--r--SmartDeviceLink/private/SDLError.m50
-rw-r--r--SmartDeviceLink/private/SDLGlobals.h2
-rw-r--r--SmartDeviceLink/private/SDLGlobals.m14
-rw-r--r--SmartDeviceLink/private/SDLIAPControlSession.h24
-rw-r--r--SmartDeviceLink/private/SDLIAPControlSession.m209
-rw-r--r--SmartDeviceLink/private/SDLIAPControlSessionDelegate.h2
-rw-r--r--SmartDeviceLink/private/SDLIAPDataSession.h23
-rw-r--r--SmartDeviceLink/private/SDLIAPDataSession.m357
-rw-r--r--SmartDeviceLink/private/SDLIAPDataSessionDelegate.h3
-rw-r--r--SmartDeviceLink/private/SDLIAPSession.h85
-rw-r--r--SmartDeviceLink/private/SDLIAPSession.m282
-rw-r--r--SmartDeviceLink/private/SDLIAPTransport.m105
-rw-r--r--SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.h40
-rw-r--r--SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.m46
-rw-r--r--SmartDeviceLink/private/SDLLifecycleManager.h2
-rw-r--r--SmartDeviceLink/private/SDLLifecycleManager.m59
-rw-r--r--SmartDeviceLink/private/SDLLifecycleProtocolHandler.m1
-rw-r--r--SmartDeviceLink/private/SDLLockScreenManager.m11
-rw-r--r--SmartDeviceLink/private/SDLLogFileModuleMap.m7
-rw-r--r--SmartDeviceLink/private/SDLMacros.h16
-rw-r--r--SmartDeviceLink/private/SDLMacros.m14
-rw-r--r--SmartDeviceLink/private/SDLMenuManager.m203
-rw-r--r--SmartDeviceLink/private/SDLPreloadChoicesOperation.h2
-rw-r--r--SmartDeviceLink/private/SDLPreloadChoicesOperation.m12
-rw-r--r--SmartDeviceLink/private/SDLPresentAlertOperation.h38
-rw-r--r--SmartDeviceLink/private/SDLPresentAlertOperation.m451
-rw-r--r--SmartDeviceLink/private/SDLPresentChoiceSetOperation.h3
-rw-r--r--SmartDeviceLink/private/SDLPresentChoiceSetOperation.m21
-rw-r--r--SmartDeviceLink/private/SDLPresentKeyboardOperation.h4
-rw-r--r--SmartDeviceLink/private/SDLPresentKeyboardOperation.m24
-rw-r--r--SmartDeviceLink/private/SDLProtocol.h4
-rw-r--r--SmartDeviceLink/private/SDLProtocol.m17
-rw-r--r--SmartDeviceLink/private/SDLRPCParameterNames.h32
-rw-r--r--SmartDeviceLink/private/SDLRPCParameterNames.m24
-rw-r--r--SmartDeviceLink/private/SDLSoftButtonManager.m40
-rw-r--r--SmartDeviceLink/private/SDLSoftButtonReplaceOperation.m13
-rw-r--r--SmartDeviceLink/private/SDLSoftButtonTransitionOperation.m3
-rw-r--r--SmartDeviceLink/private/SDLStreamingAudioLifecycleManager.m22
-rw-r--r--SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.h1
-rw-r--r--SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m582
-rw-r--r--SmartDeviceLink/private/SDLTextAndGraphicManager.m31
-rw-r--r--SmartDeviceLink/private/SDLTextAndGraphicUpdateOperation.m24
-rw-r--r--SmartDeviceLink/private/SDLTextField+ScreenManagerExtensions.m5
-rw-r--r--SmartDeviceLink/private/SDLUploadFileOperation.m63
-rw-r--r--SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.h48
-rw-r--r--SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.m156
-rw-r--r--SmartDeviceLink/private/SDLVoiceCommandManager.h7
-rw-r--r--SmartDeviceLink/private/SDLVoiceCommandManager.m192
-rw-r--r--SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.h38
-rw-r--r--SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m227
-rw-r--r--SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h15
-rw-r--r--SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m65
-rw-r--r--SmartDeviceLink/public/SDLAddCommand.h35
-rw-r--r--SmartDeviceLink/public/SDLAddCommand.m29
-rw-r--r--SmartDeviceLink/public/SDLAddSubMenu.h41
-rw-r--r--SmartDeviceLink/public/SDLAddSubMenu.m31
-rw-r--r--SmartDeviceLink/public/SDLAlertAudioData.h22
-rw-r--r--SmartDeviceLink/public/SDLAlertAudioData.m25
-rw-r--r--SmartDeviceLink/public/SDLAlertManeuver.h6
-rw-r--r--SmartDeviceLink/public/SDLAlertView.h76
-rw-r--r--SmartDeviceLink/public/SDLAlertView.m146
-rw-r--r--SmartDeviceLink/public/SDLAppCapability.h70
-rw-r--r--SmartDeviceLink/public/SDLAppCapability.m79
-rw-r--r--SmartDeviceLink/public/SDLAppCapabilityType.h42
-rw-r--r--SmartDeviceLink/public/SDLAppCapabilityType.m35
-rw-r--r--SmartDeviceLink/public/SDLArtwork.m14
-rw-r--r--SmartDeviceLink/public/SDLAudioData.h55
-rw-r--r--SmartDeviceLink/public/SDLAudioData.m135
-rwxr-xr-xSmartDeviceLink/public/SDLAudioFile.h2
-rw-r--r--SmartDeviceLink/public/SDLBodyInformation.h81
-rw-r--r--SmartDeviceLink/public/SDLBodyInformation.m52
-rw-r--r--SmartDeviceLink/public/SDLCancelInteraction.h2
-rw-r--r--SmartDeviceLink/public/SDLChoiceCell.h4
-rw-r--r--SmartDeviceLink/public/SDLChoiceCell.m7
-rw-r--r--SmartDeviceLink/public/SDLChoiceSet.h30
-rw-r--r--SmartDeviceLink/public/SDLChoiceSet.m97
-rw-r--r--SmartDeviceLink/public/SDLChoiceSetDelegate.h2
-rw-r--r--SmartDeviceLink/public/SDLClimateControlCapabilities.h2
-rw-r--r--SmartDeviceLink/public/SDLClimateData.h70
-rw-r--r--SmartDeviceLink/public/SDLClimateData.m78
-rw-r--r--SmartDeviceLink/public/SDLConfiguration.h2
-rw-r--r--SmartDeviceLink/public/SDLDisplayCapabilities.h2
-rw-r--r--SmartDeviceLink/public/SDLDisplayCapabilities.m3
-rw-r--r--SmartDeviceLink/public/SDLDisplayCapability.h4
-rw-r--r--SmartDeviceLink/public/SDLDoorStatus.h60
-rw-r--r--SmartDeviceLink/public/SDLDoorStatus.m73
-rw-r--r--SmartDeviceLink/public/SDLDoorStatusType.h46
-rw-r--r--SmartDeviceLink/public/SDLDoorStatusType.m39
-rw-r--r--SmartDeviceLink/public/SDLErrorConstants.h21
-rw-r--r--SmartDeviceLink/public/SDLErrorConstants.m1
-rw-r--r--SmartDeviceLink/public/SDLFile.m2
-rw-r--r--SmartDeviceLink/public/SDLFileManager.h20
-rw-r--r--SmartDeviceLink/public/SDLFileManager.m19
-rw-r--r--SmartDeviceLink/public/SDLFileManagerConstants.h14
-rw-r--r--SmartDeviceLink/public/SDLFunctionID.m1
-rw-r--r--SmartDeviceLink/public/SDLGateStatus.h60
-rw-r--r--SmartDeviceLink/public/SDLGateStatus.m72
-rw-r--r--SmartDeviceLink/public/SDLGetInteriorVehicleDataConsent.h2
-rw-r--r--SmartDeviceLink/public/SDLGetVehicleData.h63
-rw-r--r--SmartDeviceLink/public/SDLGetVehicleData.m35
-rw-r--r--SmartDeviceLink/public/SDLGetVehicleDataResponse.h66
-rw-r--r--SmartDeviceLink/public/SDLGetVehicleDataResponse.m35
-rw-r--r--SmartDeviceLink/public/SDLHapticRect.m4
-rw-r--r--SmartDeviceLink/public/SDLImageField.h2
-rw-r--r--SmartDeviceLink/public/SDLImageFieldName.h14
-rw-r--r--SmartDeviceLink/public/SDLImageFieldName.m2
-rw-r--r--SmartDeviceLink/public/SDLImageResolution.h14
-rw-r--r--SmartDeviceLink/public/SDLImageResolution.m27
-rw-r--r--SmartDeviceLink/public/SDLKeyboardCapabilities.h64
-rw-r--r--SmartDeviceLink/public/SDLKeyboardCapabilities.m70
-rw-r--r--SmartDeviceLink/public/SDLKeyboardDelegate.h8
-rw-r--r--SmartDeviceLink/public/SDLKeyboardEvent.h10
-rw-r--r--SmartDeviceLink/public/SDLKeyboardEvent.m2
-rw-r--r--SmartDeviceLink/public/SDLKeyboardInputMask.h46
-rw-r--r--SmartDeviceLink/public/SDLKeyboardInputMask.m37
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayout.h5
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayout.m1
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayoutCapability.h62
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayoutCapability.m72
-rw-r--r--SmartDeviceLink/public/SDLKeyboardProperties.h55
-rw-r--r--SmartDeviceLink/public/SDLKeyboardProperties.m37
-rw-r--r--SmartDeviceLink/public/SDLLockScreenViewController.h2
-rw-r--r--SmartDeviceLink/public/SDLMaintenanceModeStatus.h2
-rw-r--r--SmartDeviceLink/public/SDLManager.h2
-rw-r--r--SmartDeviceLink/public/SDLManagerDelegate.h8
-rw-r--r--SmartDeviceLink/public/SDLMenuCell.h53
-rw-r--r--SmartDeviceLink/public/SDLMenuCell.m39
-rw-r--r--SmartDeviceLink/public/SDLMenuConfiguration.h2
-rw-r--r--SmartDeviceLink/public/SDLMenuParams.h28
-rw-r--r--SmartDeviceLink/public/SDLMenuParams.m28
-rw-r--r--SmartDeviceLink/public/SDLMsgVersion.m2
-rw-r--r--SmartDeviceLink/public/SDLOnAppCapabilityUpdated.h59
-rw-r--r--SmartDeviceLink/public/SDLOnAppCapabilityUpdated.m73
-rw-r--r--SmartDeviceLink/public/SDLOnHMIStatus.h4
-rw-r--r--SmartDeviceLink/public/SDLOnVehicleData.h65
-rw-r--r--SmartDeviceLink/public/SDLOnVehicleData.m34
-rw-r--r--SmartDeviceLink/public/SDLPermissionManager.h2
-rw-r--r--SmartDeviceLink/public/SDLPutFile.h2
-rw-r--r--SmartDeviceLink/public/SDLRPCFunctionNames.h3
-rw-r--r--SmartDeviceLink/public/SDLRPCFunctionNames.m1
-rw-r--r--SmartDeviceLink/public/SDLRectangle.m15
-rw-r--r--SmartDeviceLink/public/SDLRegisterAppInterface.h2
-rw-r--r--SmartDeviceLink/public/SDLRegisterAppInterfaceResponse.h16
-rw-r--r--SmartDeviceLink/public/SDLRoofStatus.h71
-rw-r--r--SmartDeviceLink/public/SDLRoofStatus.m91
-rw-r--r--SmartDeviceLink/public/SDLScreenManager.h39
-rw-r--r--SmartDeviceLink/public/SDLScreenManager.m25
-rw-r--r--SmartDeviceLink/public/SDLSeatControlCapabilities.h2
-rw-r--r--SmartDeviceLink/public/SDLSeatMemoryActionType.h2
-rw-r--r--SmartDeviceLink/public/SDLSeatOccupancy.h65
-rw-r--r--SmartDeviceLink/public/SDLSeatOccupancy.m70
-rw-r--r--SmartDeviceLink/public/SDLSeatStatus.h59
-rw-r--r--SmartDeviceLink/public/SDLSeatStatus.m72
-rw-r--r--SmartDeviceLink/public/SDLSeekIndicatorType.h41
-rw-r--r--SmartDeviceLink/public/SDLSeekIndicatorType.m36
-rw-r--r--SmartDeviceLink/public/SDLSeekStreamingIndicator.h74
-rw-r--r--SmartDeviceLink/public/SDLSeekStreamingIndicator.m82
-rw-r--r--SmartDeviceLink/public/SDLServiceEncryptionDelegate.h2
-rw-r--r--SmartDeviceLink/public/SDLSetMediaClockTimer.h124
-rw-r--r--SmartDeviceLink/public/SDLSetMediaClockTimer.m87
-rw-r--r--SmartDeviceLink/public/SDLShow.h52
-rw-r--r--SmartDeviceLink/public/SDLShow.m55
-rw-r--r--SmartDeviceLink/public/SDLShowConstantTBT.h8
-rw-r--r--SmartDeviceLink/public/SDLStaticIconName.h9
-rw-r--r--SmartDeviceLink/public/SDLStaticIconName.m1
-rw-r--r--SmartDeviceLink/public/SDLStreamingMediaConfiguration.h40
-rw-r--r--SmartDeviceLink/public/SDLStreamingMediaConfiguration.m29
-rw-r--r--SmartDeviceLink/public/SDLStreamingVideoDelegate.h18
-rw-r--r--SmartDeviceLink/public/SDLStreamingVideoScaleManager.h15
-rw-r--r--SmartDeviceLink/public/SDLStreamingVideoScaleManager.m36
-rw-r--r--SmartDeviceLink/public/SDLSubscribeVehicleData.h63
-rw-r--r--SmartDeviceLink/public/SDLSubscribeVehicleData.m36
-rw-r--r--SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.h62
-rw-r--r--SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.m33
-rwxr-xr-xSmartDeviceLink/public/SDLSystemCapability.m9
-rw-r--r--SmartDeviceLink/public/SDLSystemCapabilityManager.h2
-rw-r--r--SmartDeviceLink/public/SDLSystemCapabilityManager.m35
-rw-r--r--SmartDeviceLink/public/SDLSystemInfo.h43
-rw-r--r--SmartDeviceLink/public/SDLSystemInfo.m49
-rw-r--r--SmartDeviceLink/public/SDLTTSChunk.h2
-rw-r--r--SmartDeviceLink/public/SDLTemplateConfiguration.h2
-rw-r--r--SmartDeviceLink/public/SDLTextField.h2
-rw-r--r--SmartDeviceLink/public/SDLTextFieldName.h47
-rw-r--r--SmartDeviceLink/public/SDLTextFieldName.m6
-rw-r--r--SmartDeviceLink/public/SDLTireStatus.h2
-rw-r--r--SmartDeviceLink/public/SDLTouch.h2
-rw-r--r--SmartDeviceLink/public/SDLTouchManager.m18
-rw-r--r--SmartDeviceLink/public/SDLTouchManagerDelegate.h2
-rw-r--r--SmartDeviceLink/public/SDLUnsubscribeVehicleData.h63
-rw-r--r--SmartDeviceLink/public/SDLUnsubscribeVehicleData.m37
-rw-r--r--SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.h61
-rw-r--r--SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.m32
-rw-r--r--SmartDeviceLink/public/SDLVehicleDataStatus.h2
-rw-r--r--SmartDeviceLink/public/SDLVehicleDataType.h18
-rw-r--r--SmartDeviceLink/public/SDLVehicleDataType.m2
-rw-r--r--SmartDeviceLink/public/SDLVehicleType.h11
-rw-r--r--SmartDeviceLink/public/SDLVehicleType.m12
-rw-r--r--SmartDeviceLink/public/SDLVideoStreamingCapability.h36
-rw-r--r--SmartDeviceLink/public/SDLVideoStreamingCapability.m40
-rw-r--r--SmartDeviceLink/public/SDLVideoStreamingFormat.m4
-rw-r--r--SmartDeviceLink/public/SDLVideoStreamingRange.h44
-rw-r--r--SmartDeviceLink/public/SDLVideoStreamingRange.m97
-rw-r--r--SmartDeviceLink/public/SDLWeatherServiceManifest.h4
-rw-r--r--SmartDeviceLink/public/SDLWindowCapability.h27
-rw-r--r--SmartDeviceLink/public/SDLWindowCapability.m14
-rw-r--r--SmartDeviceLink/public/SmartDeviceLink.h58
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/NSArray+ExtensionsSpec.m60
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m33
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLAsynchronousRPCRequestOperationSpec.m8
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m14
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceCellSpec.m3
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m105
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m107
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m92
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m300
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m11
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m80
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m88
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m159
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m34
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m32
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m39
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLSequentialRPCRequestOperationSpec.m15
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m157
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m25
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingMediaConfigurationSpec.m52
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m1111
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLSystemInfoSpec.m83
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m16
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m29
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m208
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandManagerSpec.m127
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m249
-rw-r--r--SmartDeviceLinkTests/Notifications/SDLResponseDispatcherSpec.m10
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLControlFramePayloadConstantsSpec.m27
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m105
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m173
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m2
-rw-r--r--SmartDeviceLinkTests/ProxySpecs/SDLHapticManagerSpec.m104
-rw-r--r--SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m32
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppCapabilityTypeSpec.m21
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLDoorStatusTypeSpec.m24
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLImageFieldNameSpec.m2
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m6
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m23
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m5
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSeekIndicatorTypeSpec.m23
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m4
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTextFieldNameSpec.m9
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m5
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppCapabilityUpdatedSpec.m80
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m84
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m75
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m42
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m183
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m95
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m138
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m273
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m122
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m78
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m70
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m23
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatOccupancySpec.m64
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatStatusSpec.m66
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m3
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m70
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m71
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppCapabilitySpec.m94
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m213
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateDataSpec.m73
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m92
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m93
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m32
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m75
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m75
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m223
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m24
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m15
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m114
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeekStreamingIndicatorSpec.m80
-rwxr-xr-xSmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m4
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m58
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m293
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m392
-rw-r--r--SmartDeviceLinkTests/SDLAlertAudioDataSpec.m98
-rw-r--r--SmartDeviceLinkTests/SDLAlertManagerSpec.m316
-rw-r--r--SmartDeviceLinkTests/SDLAlertViewSpec.m307
-rw-r--r--SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m6
-rw-r--r--SmartDeviceLinkTests/SDLAudioDataSpec.m301
-rw-r--r--SmartDeviceLinkTests/SDLCarWindowSpec.m172
-rw-r--r--SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m206
-rw-r--r--SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m26
-rw-r--r--SmartDeviceLinkTests/SDLPresentAlertOperationSpec.m1147
-rw-r--r--SmartDeviceLinkTests/SDLScreenManagerSpec.m32
-rw-r--r--SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m30
-rw-r--r--SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m10
-rw-r--r--SmartDeviceLinkTests/SDLStreamingVideoScaleManagerSpec.m65
-rw-r--r--SmartDeviceLinkTests/SDLSupportedStreamingRangeSpec.m118
-rw-r--r--SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m39
-rw-r--r--SmartDeviceLinkTests/TestConnectionRequestObject.h23
-rw-r--r--SmartDeviceLinkTests/TestConnectionRequestObject.m23
-rw-r--r--SmartDeviceLinkTests/TestSmartConnection.h21
-rw-r--r--SmartDeviceLinkTests/TestSmartConnection.m34
-rw-r--r--SmartDeviceLinkTests/TestSmartConnectionManager.h24
-rw-r--r--SmartDeviceLinkTests/TestSmartConnectionManager.m61
-rw-r--r--SmartDeviceLinkTests/TestStreamingMediaDelegate.h20
-rw-r--r--SmartDeviceLinkTests/TestStreamingMediaDelegate.m41
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h10
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m44
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m21
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m25
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m15
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m48
-rw-r--r--SmartDeviceLinkTests/UtilitiesSpecs/SDLGlobalsSpec.m13
-rwxr-xr-x[-rw-r--r--]carthage-build.sh2
-rw-r--r--docs/Classes.html503
-rw-r--r--docs/Classes/SDLAddCommand.html89
-rw-r--r--docs/Classes/SDLAddSubMenu.html118
-rw-r--r--docs/Classes/SDLAlertAudioData.html49
-rw-r--r--docs/Classes/SDLAlertManeuver.html6
-rw-r--r--docs/Classes/SDLAlertView.html299
-rw-r--r--docs/Classes/SDLAppCapability.html112
-rw-r--r--docs/Classes/SDLAudioData.html206
-rw-r--r--docs/Classes/SDLAudioFile.html2
-rw-r--r--docs/Classes/SDLBodyInformation.html179
-rw-r--r--docs/Classes/SDLCancelInteraction.html2
-rw-r--r--docs/Classes/SDLChoiceCell.html19
-rw-r--r--docs/Classes/SDLChoiceSet.html48
-rw-r--r--docs/Classes/SDLClimateControlCapabilities.html2
-rw-r--r--docs/Classes/SDLClimateData.html107
-rw-r--r--docs/Classes/SDLConfiguration.html2
-rw-r--r--docs/Classes/SDLDisplayCapability.html4
-rw-r--r--docs/Classes/SDLDoorStatus.html84
-rw-r--r--docs/Classes/SDLFileManager.html40
-rw-r--r--docs/Classes/SDLGateStatus.html84
-rw-r--r--docs/Classes/SDLGetInteriorVehicleDataConsent.html2
-rw-r--r--docs/Classes/SDLGetVehicleData.html168
-rw-r--r--docs/Classes/SDLGetVehicleDataResponse.html174
-rw-r--r--docs/Classes/SDLImageField.html2
-rw-r--r--docs/Classes/SDLKeyboardCapabilities.html87
-rw-r--r--docs/Classes/SDLKeyboardLayoutCapability.html86
-rw-r--r--docs/Classes/SDLKeyboardProperties.html136
-rw-r--r--docs/Classes/SDLLockScreenViewController.html2
-rw-r--r--docs/Classes/SDLManager.html2
-rw-r--r--docs/Classes/SDLMenuCell.html172
-rw-r--r--docs/Classes/SDLMenuConfiguration.html2
-rw-r--r--docs/Classes/SDLMenuParams.html83
-rw-r--r--docs/Classes/SDLOnAppCapabilityUpdated.html63
-rw-r--r--docs/Classes/SDLOnHMIStatus.html4
-rw-r--r--docs/Classes/SDLOnVehicleData.html174
-rw-r--r--docs/Classes/SDLPermissionManager.html2
-rw-r--r--docs/Classes/SDLPutFile.html2
-rw-r--r--docs/Classes/SDLRegisterAppInterface.html2
-rw-r--r--docs/Classes/SDLRegisterAppInterfaceResponse.html12
-rw-r--r--docs/Classes/SDLRoofStatus.html136
-rw-r--r--docs/Classes/SDLScreenManager.html89
-rw-r--r--docs/Classes/SDLSeatControlCapabilities.html2
-rw-r--r--docs/Classes/SDLSeatOccupancy.html85
-rw-r--r--docs/Classes/SDLSeatStatus.html85
-rw-r--r--docs/Classes/SDLSeekStreamingIndicator.html139
-rw-r--r--docs/Classes/SDLSetMediaClockTimer.html375
-rw-r--r--docs/Classes/SDLShow.html88
-rw-r--r--docs/Classes/SDLShowConstantTBT.html8
-rw-r--r--docs/Classes/SDLStreamingMediaConfiguration.html114
-rw-r--r--docs/Classes/SDLStreamingVideoScaleManager.html53
-rw-r--r--docs/Classes/SDLSubscribeVehicleData.html169
-rw-r--r--docs/Classes/SDLSubscribeVehicleDataResponse.html170
-rw-r--r--docs/Classes/SDLSystemCapabilityManager.html2
-rw-r--r--docs/Classes/SDLSystemInfo.html141
-rw-r--r--docs/Classes/SDLTTSChunk.html2
-rw-r--r--docs/Classes/SDLTemplateConfiguration.html2
-rw-r--r--docs/Classes/SDLTextField.html2
-rw-r--r--docs/Classes/SDLTireStatus.html2
-rw-r--r--docs/Classes/SDLTouch.html2
-rw-r--r--docs/Classes/SDLUnsubscribeVehicleData.html169
-rw-r--r--docs/Classes/SDLUnsubscribeVehicleDataResponse.html170
-rw-r--r--docs/Classes/SDLVehicleType.html37
-rw-r--r--docs/Classes/SDLVideoStreamingCapability.html102
-rw-r--r--docs/Classes/SDLVideoStreamingRange.html185
-rw-r--r--docs/Classes/SDLWeatherServiceManifest.html4
-rw-r--r--docs/Classes/SDLWindowCapability.html86
-rw-r--r--docs/Constants.html525
-rw-r--r--docs/Enums.html24
-rw-r--r--docs/Enums/SDLAlertManagerError.html52
-rw-r--r--docs/Enums/SDLChoiceSetManagerError.html2
-rw-r--r--docs/Enums/SDLMenuManagerError.html21
-rw-r--r--docs/Enums/SDLSystemCapabilityManagerError.html2
-rw-r--r--docs/Protocols.html26
-rw-r--r--docs/Protocols/SDLChoiceSetDelegate.html2
-rw-r--r--docs/Protocols/SDLKeyboardDelegate.html25
-rw-r--r--docs/Protocols/SDLManagerDelegate.html28
-rw-r--r--docs/Protocols/SDLServiceEncryptionDelegate.html2
-rw-r--r--docs/Protocols/SDLStreamingVideoDelegate.html33
-rw-r--r--docs/Protocols/SDLTouchManagerDelegate.html2
-rw-r--r--docs/Type Definitions.html115
-rw-r--r--docs/badge.svg16
-rw-r--r--docs/index.html98
-rw-r--r--docs/search.json2
-rw-r--r--docs/undocumented.json290
-rw-r--r--generator/generator.py4
m---------generator/rpc_spec0
-rw-r--r--generator/templates/SDLRPCFunctionNames.h.jinja22
-rw-r--r--generator/templates/SDLRPCParameterNames.h.jinja22
-rw-r--r--generator/templates/enums/template.h.jinja22
-rw-r--r--generator/templates/enums/template.m.jinja22
-rw-r--r--generator/test/runner.py7
-rwxr-xr-xgenerator/test/test_CodeFormatAndQuality.py2
-rw-r--r--generator/test/test_enums.py26
-rw-r--r--generator/test/test_functions.py160
-rw-r--r--generator/test/test_structs.py39
-rw-r--r--generator/transformers/common_producer.py50
-rw-r--r--generator/transformers/functions_producer.py6
455 files changed, 24392 insertions, 3660 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 0b7318596..45d857d1b 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -5,7 +5,7 @@ on: [push, pull_request]
env:
PROJECT: 'SmartDeviceLink-iOS.xcodeproj'
- DESTINATION: 'platform=iOS Simulator,name=iPhone 11,OS=14.1'
+ DESTINATION: 'platform=iOS Simulator,name=iPhone 12,OS=14.4'
jobs:
build:
@@ -27,7 +27,7 @@ jobs:
# Select the Xcode version (the platform/simulator/OS available for testing depend on the Xcode version)
- name: Select Xcode version
- run: sudo xcode-select -switch /Applications/Xcode_12.1.app
+ run: sudo xcode-select -switch /Applications/Xcode_12.4.app
- name: Build
run: set -o pipefail && xcodebuild -scheme "${{ matrix.scheme }}" -destination "$DESTINATION" build | xcpretty --color --simple
@@ -46,7 +46,7 @@ jobs:
# Select the Xcode version (the platform/simulator/OS available for testing depend on the Xcode version)
- name: Select Xcode version
- run: sudo xcode-select -switch /Applications/Xcode_12.1.app
+ run: sudo xcode-select -switch /Applications/Xcode_12.4.app
- name: Checkout repository
uses: actions/checkout@v2.3.1
@@ -63,8 +63,7 @@ jobs:
- name: Installing dependencies
if: steps.carthage-cache.outputs.cache-hit != 'true'
- run: bash carthage-build.sh --no-use-binaries --platform iOS --cache-builds
- # run: carthage bootstrap --no-use-binaries --platform iOS --cache-builds
+ run: bash carthage-build.sh bootstrap --no-use-binaries --platform ios --cache-builds
# Split build into build-only and test-only as it is faster than building and running in one step
- name: Building unit tests
@@ -76,5 +75,20 @@ jobs:
# Upload coverage reports to Codecov
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1.0.10
- with:
- yml: ./codecov.yml
+
+ rpcTest:
+ name: RPC Generator Tests
+ runs-on: ubuntu-20.04
+ strategy:
+ fail-fast: false
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2.3.1
+ with:
+ submodules: true
+
+ - name: Install dependencies
+ run: python3 -m pip install -r generator/requirements.txt
+
+ - name: Run RPC generator tests
+ run: python3 generator/test/runner.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 45e312fa6..a771f9411 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,82 @@
# Changelog
+## 7.1.0 (Since RC 1)
+### Versions
+* Supports [SDL RPC Spec 7.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/7.1.0) and [SDL Protocol Spec 5.4.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.4.0).
+
+### Testing
+* Xcode 12.4
+* iOS 13.7 and 14.4.1
+* Core:
+ * Manticore (Core v7.0.0, Generic HMI v0.9.0)
+ * Ford Sync 3.4 (19353_DEVTEST)
+ * Ford Sync 3.0 (17276_DEVTEST)
+ * Ford Sync 4.0 (20016_DEVTEST)
+ * Core v7.1.0-develop with sdl_hmi v5.5.0-develop and generic_hmi v0.10.0-develop
+
+### Enhancements
+* Updated the Swift name of the system info callback from `didReceive(systemInfo:)` to `didReceiveSystemInfo(_:)`.
+
+### Bug Fixes
+* Fixed video streaming apps not resuming when switching between them (https://github.com/smartdevicelink/sdl_ios/issues/1944)
+* Fixed lock screen not being dismissible when the lock screen display mode is always but `enableDismissGesture = YES` (https://github.com/smartdevicelink/sdl_ios/issues/1948)
+* Fixed custom video encoder settings not overriding default video encoder settings (https://github.com/smartdevicelink/sdl_ios/issues/1950)
+
+### Example Apps
+* Updated some coloring of the example apps to use more readable colors.
+* Fixed example app's menu not displaying correctly when the app is exited (https://github.com/smartdevicelink/sdl_ios/issues/1967).
+
+## 7.1.0 Release Candidate 1
+### Versions
+* Supports [SDL RPC Spec 7.1.0-in-progress](https://github.com/smartdevicelink/rpc_spec/commit/6b98355357b5b1893bbb59cb668d28545023457c) and [SDL Protocol Spec 5.4.0-in-progress](https://github.com/smartdevicelink/protocol_spec/commit/70e5dec7bbf8e2140cc2602e67f458174c282405).
+
+### Enhancements
+* Added the ability to show menu cells and choice set cells with the same `title` (https://github.com/smartdevicelink/sdl_ios/issues/1024)
+* Added the ability to display media time skip buttons instead of the standard track skip buttons, e.g. for podcast apps (https://github.com/smartdevicelink/sdl_ios/issues/1080)
+* Added the ability to use a numeric keyboard layout, mask input characters, and provide custom keys on a keyboard (https://github.com/smartdevicelink/sdl_ios/issues/1356)
+* Added the ability to set a custom playback rate for the media clock timer (https://github.com/smartdevicelink/sdl_ios/issues/1377)
+* Update vehicle data `BodyInformation` (https://github.com/smartdevicelink/sdl_ios/issues/1477)
+* Added new vehicle data `SeatOccupancy` (https://github.com/smartdevicelink/sdl_ios/issues/1487)
+* Main menu cells and subcells now have additional available text and image properties (https://github.com/smartdevicelink/sdl_ios/issues/1510)
+* Added new vehicle data `ClimateData` (https://github.com/smartdevicelink/sdl_ios/issues/1511)
+* `VideoStreamingCapability` now allows the module to tell an app its preferred frame rate (https://github.com/smartdevicelink/sdl_ios/issues/1553)
+* Added the ability to present `Alert` RPCs through the screen manager (https://github.com/smartdevicelink/sdl_ios/issues/1579)
+* Added new `TextFieldName` enums for `ShowConstantTBT` (https://github.com/smartdevicelink/sdl_ios/issues/1676)
+* Added the ability for the module and app to declare multiple possible video streaming capabilities so that features like Picture-in-Picture and Split-Screen can be supported (https://github.com/smartdevicelink/sdl_ios/issues/1730)
+* `VideoStreamingCapability` parameters will now be merged with the app's preferred streaming settings to use the lowest settings (https://github.com/smartdevicelink/sdl_ios/issues/1860)
+* Updated `ShowConstantTBT` RPC description (https://github.com/smartdevicelink/sdl_ios/issues/1863)
+* Added the ability to disconnect based on received vehicle details, including before the app registers on 7.1+ modules (https://github.com/smartdevicelink/sdl_ios/issues/1876)
+* Fixed cases where setting the timeout of an `SDLChoiceSet` could fail (https://github.com/smartdevicelink/sdl_ios/issues/1891)
+* Deprecated `SDLStaticIcon.auxillaryAudio` and add a fixed spelling of `SDLStaticIcon.auxilliaryAudio` (https://github.com/smartdevicelink/sdl_ios/issues/1938)
+
+### Bug Fixes
+* We changed a `ListFiles` workaround in `SDLFileManager` to only activate on RPC v4.3.1 and below connections (https://github.com/smartdevicelink/sdl_ios/issues/827)
+* Fixed overwriting `SDLArtwork` in the manager system not working properly (https://github.com/smartdevicelink/sdl_ios/issues/1117)
+* Fixed soft buttons being delayed on Ford Sync 3.0 and increased SDL CPU usage (https://github.com/smartdevicelink/sdl_ios/issues/1778)
+* Deprecated `SDLKeyboardProperties.autoCompleteText` in favor of `SDLKeyboardProperties.autoCompleteList` (https://github.com/smartdevicelink/sdl_ios/issues/1784)
+* Setting `SDLTouchManager.tapTimeThreshold` to `0.0` will no longer cause a crash (https://github.com/smartdevicelink/sdl_ios/issues/1798)
+* Fixed button notifications not working properly the first button press on Ford Sync 3.0 (https://github.com/smartdevicelink/sdl_ios/issues/1793)
+* Fixed a number of potential issues around the iAP transport seen on iOS 14 devices (https://github.com/smartdevicelink/sdl_ios/issues/1799, https://github.com/smartdevicelink/sdl_ios/issues/1809, https://github.com/smartdevicelink/sdl_ios/issues/1892, https://github.com/smartdevicelink/sdl_ios/issues/1893)
+* Fixed cases when the first `StartService` protocol message is not version 1 (https://github.com/smartdevicelink/sdl_ios/issues/1837)
+* Refactored the `SDLVoiceCommandManager` to use queues (https://github.com/smartdevicelink/sdl_ios/issues/1841)
+* Fixed `SDLArtwork` with a static icon not copying (https://github.com/smartdevicelink/sdl_ios/issues/1846)
+* Fixed `SDLDisplayCapabilities` should be deprecated (https://github.com/smartdevicelink/sdl_ios/issues/1857)
+* Fixed uploading the blank artwork every time instead of persisting it (https://github.com/smartdevicelink/sdl_ios/issues/1864)
+* We now throw an exception if you try to display two `SDLSoftButtonObject`s with the same name (https://github.com/smartdevicelink/sdl_ios/issues/1897)
+* Fixed `SDLTextFieldName.timeToDestination` documentation (https://github.com/smartdevicelink/sdl_ios/issues/1915)
+* Fixed uploaded files not being divided into multiple RPCs correctly (https://github.com/smartdevicelink/sdl_ios/issues/1927)
+
+### RPC Generator
+* Fixed generator not adding enum parameter descriptions (https://github.com/smartdevicelink/sdl_ios/issues/1751)
+* Generator now correctly generates enums with `NS_TYPED_ENUM` (https://github.com/smartdevicelink/sdl_ios/issues/1834)
+* Fixed generator creating incorrect struct parameter names (https://github.com/smartdevicelink/sdl_ios/issues/1905)
+
+### Other
+* Fixed example app template resetting when HMI level changes (https://github.com/smartdevicelink/sdl_ios/issues/1827)
+* Fixed RPC Generator unit tests failing (https://github.com/smartdevicelink/sdl_ios/issues/1845)
+* Fixed failing unit tests on CI (https://github.com/smartdevicelink/sdl_ios/issues/1880, https://github.com/smartdevicelink/sdl_ios/issues/1884, https://github.com/smartdevicelink/sdl_ios/issues/1925, https://github.com/smartdevicelink/sdl_ios/issues/1929)
+* Fixed test cases using the `OCMock` deprecated `observerMock` (https://github.com/smartdevicelink/sdl_ios/issues/1913)
+* Removed snapshot test cases (https://github.com/smartdevicelink/sdl_ios/issues/1921)
+
## 7.0.0
### Versions
* Supports [SDL RPC Spec 7.0.0](https://github.com/smartdevicelink/rpc_spec/commit/eead323f356be713d2b0f0a253f3f3d36143460a) and [SDL Protocol Spec 5.3.0](https://github.com/smartdevicelink/protocol_spec/tree/release/5.3.0).
diff --git a/Cartfile.private b/Cartfile.private
index 29600768d..cedbbe1a3 100644
--- a/Cartfile.private
+++ b/Cartfile.private
@@ -1,4 +1,3 @@
github "Quick/Quick" ~> 3.0
-github "Quick/Nimble" == 9.0.0-rc.3
+github "Quick/Nimble" ~> 9.0.0
github "erikdoe/ocmock" ~> 3.7
-github "uber/ios-snapshot-test-case" ~> 6.2
diff --git a/Cartfile.resolved b/Cartfile.resolved
index e8652705c..00e581205 100644
--- a/Cartfile.resolved
+++ b/Cartfile.resolved
@@ -1,4 +1,3 @@
-github "Quick/Nimble" "v9.0.0-rc.3"
+github "Quick/Nimble" "v9.0.0"
github "Quick/Quick" "v3.0.0"
-github "erikdoe/ocmock" "v3.7.1"
-github "uber/ios-snapshot-test-case" "6.2.0"
+github "erikdoe/ocmock" "v3.8.1"
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index 0ab2739ed..ed9735a78 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -536,34 +536,3 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-### FBSnapshotTestCase
-BSD License
-
-For the FBSnapshotTestCase software
-
-Copyright (c) 2013, Facebook, Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name Facebook nor the names of its contributors may be used to
- endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/Example Apps/Example ObjC/AlertManager.m b/Example Apps/Example ObjC/AlertManager.m
index 9ee13fcdd..a352696ff 100644
--- a/Example Apps/Example ObjC/AlertManager.m
+++ b/Example Apps/Example ObjC/AlertManager.m
@@ -15,19 +15,23 @@ NS_ASSUME_NONNULL_BEGIN
@implementation AlertManager
+ (void)sendAlertWithManager:(SDLManager *)sdlManager image:(nullable NSString *)imageName textField1:(NSString *)textField1 textField2:(nullable NSString *)textField2 {
- SDLSoftButton *okSoftButton = [[SDLSoftButton alloc] initWithType:SDLSoftButtonTypeText text:AlertOKButtonText image:nil highlighted:YES buttonId:1 systemAction:nil handler:nil];
- SDLAlert *alert = [[SDLAlert alloc] initWithAlertText1:textField1 alertText2:textField2 alertText3:nil softButtons:@[okSoftButton] playTone:YES ttsChunks:nil duration:5000 progressIndicator:NO alertIcon:nil cancelID:0];
+ SDLSoftButtonObject *okSoftButton = [[SDLSoftButtonObject alloc] initWithName:AlertOKButtonText text:AlertOKButtonText artwork:nil handler:nil];
+ SDLAlertView *alert = [[SDLAlertView alloc] initWithText:textField1 buttons:@[okSoftButton]];
+ alert.secondaryText = textField2;
- if (imageName == nil) {
- [sdlManager sendRequest:alert];
- } else {
- [self sdlex_sendImageWithName:imageName sdlManager:sdlManager completionHandler:^(BOOL success, NSString * _Nullable artworkName) {
- if (success) {
- alert.alertIcon = [[SDLImage alloc] initWithName:artworkName isTemplate:YES];
- }
- [sdlManager sendRequest:alert];
- }];
+ SDLAlertAudioData *alertAudioData = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"alert"];
+ alertAudioData.playTone = YES;
+ alert.audio = alertAudioData;
+
+ if (imageName != nil) {
+ alert.icon = [SDLArtwork artworkWithImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG];
}
+
+ [sdlManager.screenManager presentAlert:alert withCompletionHandler:^(NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogD(@"There was an error presenting the alert: %@", error);
+ }
+ }];
}
+ (void)sendSubtleAlertWithManager:(SDLManager *)sdlManager image:(nullable NSString *)imageName textField1:(NSString *)textField1 textField2:(nullable NSString *)textField2 {
diff --git a/Example Apps/Example ObjC/ConnectionIAPTableViewController.m b/Example Apps/Example ObjC/ConnectionIAPTableViewController.m
index bfb931069..b2d9b30b9 100644
--- a/Example Apps/Example ObjC/ConnectionIAPTableViewController.m
+++ b/Example Apps/Example ObjC/ConnectionIAPTableViewController.m
@@ -73,15 +73,15 @@
switch (newState) {
case ProxyStateStopped: {
- newColor = [UIColor redColor];
+ newColor = [UIColor colorWithRed:(255.0 / 255.0) green:(69.0 / 255.0) blue:(58.0 / 255.0) alpha:1.0];
newTitle = @"Connect";
} break;
case ProxyStateSearchingForConnection: {
- newColor = [UIColor blueColor];
+ newColor = [UIColor colorWithRed:(255.0 / 255.0) green:(159.0 / 255.0) blue:(10.0 / 255.0) alpha:1.0];
newTitle = @"Stop Searching";
} break;
case ProxyStateConnected: {
- newColor = [UIColor greenColor];
+ newColor = [UIColor colorWithRed:(50.0 / 255.0) green:(215.0 / 255.0) blue:(75.0 / 255.0) alpha:1.0];
newTitle = @"Disconnect";
} break;
default: break;
diff --git a/Example Apps/Example ObjC/ConnectionTCPTableViewController.m b/Example Apps/Example ObjC/ConnectionTCPTableViewController.m
index 7b497a591..c062d5106 100644
--- a/Example Apps/Example ObjC/ConnectionTCPTableViewController.m
+++ b/Example Apps/Example ObjC/ConnectionTCPTableViewController.m
@@ -103,15 +103,15 @@
switch (newState) {
case ProxyStateStopped: {
- newColor = [UIColor redColor];
+ newColor = [UIColor colorWithRed:(255.0 / 255.0) green:(69.0 / 255.0) blue:(58.0 / 255.0) alpha:1.0];
newTitle = @"Connect";
} break;
case ProxyStateSearchingForConnection: {
- newColor = [UIColor blueColor];
+ newColor = [UIColor colorWithRed:(255.0 / 255.0) green:(159.0 / 255.0) blue:(10.0 / 255.0) alpha:1.0];
newTitle = @"Stop Searching";
} break;
case ProxyStateConnected: {
- newColor = [UIColor greenColor];
+ newColor = [UIColor colorWithRed:(50.0 / 255.0) green:(215.0 / 255.0) blue:(75.0 / 255.0) alpha:1.0];
newTitle = @"Disconnect";
} break;
default: break;
diff --git a/Example Apps/Example ObjC/MenuManager.m b/Example Apps/Example ObjC/MenuManager.m
index ff6385196..d78be2b8f 100644
--- a/Example Apps/Example ObjC/MenuManager.m
+++ b/Example Apps/Example ObjC/MenuManager.m
@@ -43,7 +43,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Menu Items
+ (SDLMenuCell *)sdlex_menuCellSpeakNameWithManager:(SDLManager *)manager {
- return [[SDLMenuCell alloc] initWithTitle:ACSpeakAppNameMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:SpeakBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] voiceCommands:@[ACSpeakAppNameMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ return [[SDLMenuCell alloc] initWithTitle:ACSpeakAppNameMenuName secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:SpeakBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil voiceCommands:@[ACSpeakAppNameMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
[manager sendRequest:[[SDLSpeak alloc] initWithTTS:ExampleAppNameTTS]];
}];
}
@@ -52,34 +52,34 @@ NS_ASSUME_NONNULL_BEGIN
NSMutableArray *submenuItems = [[NSMutableArray alloc] init];
NSArray<NSString *> *allVehicleDataTypes = [self sdlex_allVehicleDataTypes];
for (NSString *vehicleDataType in allVehicleDataTypes) {
- SDLMenuCell *cell = [[SDLMenuCell alloc] initWithTitle:vehicleDataType icon:[SDLArtwork artworkWithStaticIcon:SDLStaticIconNameSettings] voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ SDLMenuCell *cell = [[SDLMenuCell alloc] initWithTitle:vehicleDataType secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithStaticIcon:SDLStaticIconNameSettings] secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
[VehicleDataManager getAllVehicleDataWithManager:manager triggerSource:triggerSource vehicleDataType:vehicleDataType];
}];
[submenuItems addObject:cell];
}
- return [[SDLMenuCell alloc] initWithTitle:ACGetAllVehicleDataMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:CarBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] submenuLayout:SDLMenuLayoutTiles subCells:submenuItems];
+ return [[SDLMenuCell alloc] initWithTitle:ACGetAllVehicleDataMenuName secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:CarBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:submenuItems];
}
+ (NSArray<NSString *> *)sdlex_allVehicleDataTypes {
- return @[ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACElectronicParkBrakeStatus, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACExternalTemperatureMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGearStatusMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACTurnSignalMenuName, ACVINMenuName, ACWiperStatusMenuName];
+ return @[ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACElectronicParkBrakeStatus, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGearStatusMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACTurnSignalMenuName, ACVINMenuName, ACWiperStatusMenuName];
}
+ (SDLMenuCell *)sdlex_menuCellShowPerformInteractionWithManager:(SDLManager *)manager performManager:(PerformInteractionManager *)performManager {
- return [[SDLMenuCell alloc] initWithTitle:ACShowChoiceSetMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] voiceCommands:@[ACShowChoiceSetMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ return [[SDLMenuCell alloc] initWithTitle:ACShowChoiceSetMenuName secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil voiceCommands:@[ACShowChoiceSetMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
[performManager showWithTriggerSource:triggerSource];
}];
}
+ (SDLMenuCell *)sdlex_menuCellRecordInCarMicrophoneAudioWithManager:(SDLManager *)manager {
AudioManager *audioManager = [[AudioManager alloc] initWithManager:manager];
- return [[SDLMenuCell alloc] initWithTitle:ACRecordInCarMicrophoneAudioMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MicrophoneBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] voiceCommands:@[ACRecordInCarMicrophoneAudioMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ return [[SDLMenuCell alloc] initWithTitle:ACRecordInCarMicrophoneAudioMenuName secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MicrophoneBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil voiceCommands:@[ACRecordInCarMicrophoneAudioMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
[audioManager startRecording];
}];
}
+ (SDLMenuCell *)sdlex_menuCellDialNumberWithManager:(SDLManager *)manager {
- return [[SDLMenuCell alloc] initWithTitle:ACDialPhoneNumberMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:PhoneBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] voiceCommands:@[ACDialPhoneNumberMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ return [[SDLMenuCell alloc] initWithTitle:ACDialPhoneNumberMenuName secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:PhoneBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil voiceCommands:@[ACDialPhoneNumberMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
if (![RPCPermissionsManager isDialNumberRPCAllowedWithManager:manager]) {
[AlertManager sendAlertWithManager:manager image:nil textField1:AlertDialNumberPermissionsWarningText textField2:nil];
return;
@@ -96,7 +96,7 @@ NS_ASSUME_NONNULL_BEGIN
NSString *errorMessage = @"Changing the template failed";
// Non - Media
- SDLMenuCell *cell = [[SDLMenuCell alloc] initWithTitle:@"Non - Media (Default)" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ SDLMenuCell *cell = [[SDLMenuCell alloc] initWithTitle:@"Non - Media (Default)" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
[manager.screenManager changeLayout:[[SDLTemplateConfiguration alloc] initWithPredefinedLayout:SDLPredefinedLayoutNonMedia] withCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
[AlertManager sendAlertWithManager:manager image:nil textField1:errorMessage textField2:nil];
@@ -106,7 +106,7 @@ NS_ASSUME_NONNULL_BEGIN
[submenuItems addObject:cell];
// Graphic With Text
- SDLMenuCell *cell2 = [[SDLMenuCell alloc] initWithTitle:@"Graphic With Text" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ SDLMenuCell *cell2 = [[SDLMenuCell alloc] initWithTitle:@"Graphic With Text" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
[manager.screenManager changeLayout:[[SDLTemplateConfiguration alloc] initWithPredefinedLayout:SDLPredefinedLayoutGraphicWithText] withCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
[AlertManager sendAlertWithManager:manager image:nil textField1:errorMessage textField2:nil];
@@ -115,23 +115,23 @@ NS_ASSUME_NONNULL_BEGIN
}];
[submenuItems addObject:cell2];
- return [[SDLMenuCell alloc] initWithTitle:ACSubmenuTemplateMenuName icon:nil submenuLayout:SDLMenuLayoutList subCells:[submenuItems copy]];
+ return [[SDLMenuCell alloc] initWithTitle:ACSubmenuTemplateMenuName secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:SDLMenuLayoutList subCells:[submenuItems copy]];
}
+ (SDLMenuCell *)sdlex_menuCellWithSubmenuWithManager:(SDLManager *)manager {
NSMutableArray *submenuItems = [NSMutableArray array];
for (int i = 0; i < 75; i++) {
- SDLMenuCell *cell = [[SDLMenuCell alloc] initWithTitle:[NSString stringWithFormat:@"%@ %i", ACSubmenuItemMenuName, i] icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ SDLMenuCell *cell = [[SDLMenuCell alloc] initWithTitle:[NSString stringWithFormat:@"%@ %i", ACSubmenuItemMenuName, i] secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
[AlertManager sendAlertWithManager:manager image:nil textField1:[NSString stringWithFormat:@"You selected %@ %i", ACSubmenuItemMenuName, i] textField2:nil];
}];
[submenuItems addObject:cell];
}
- return [[SDLMenuCell alloc] initWithTitle:ACSubmenuMenuName icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] submenuLayout:SDLMenuLayoutList subCells:[submenuItems copy]];
+ return [[SDLMenuCell alloc] initWithTitle:ACSubmenuMenuName secondaryText:nil tertiaryText:nil icon:[SDLArtwork artworkWithImage:[[UIImage imageNamed:MenuBWIconImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] asImageFormat:SDLArtworkImageFormatPNG] secondaryArtwork:nil submenuLayout:SDLMenuLayoutList subCells:[submenuItems copy]];
}
+ (SDLMenuCell *)sdlex_sliderMenuCellWithManager:(SDLManager *)manager {
- return [[SDLMenuCell alloc] initWithTitle:ACSliderMenuName icon:nil voiceCommands:@[ACSliderMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ return [[SDLMenuCell alloc] initWithTitle:ACSliderMenuName secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[ACSliderMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
SDLSlider *sliderRPC = [[SDLSlider alloc] initWithNumTicks:3 position:1 sliderHeader:@"Select a letter" sliderFooters:@[@"A", @"B", @"C"] timeout:10000];
[manager sendRequest:sliderRPC withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if(![response.resultCode isEqualToEnum:SDLResultSuccess]) {
@@ -148,7 +148,7 @@ NS_ASSUME_NONNULL_BEGIN
}
+ (SDLMenuCell *)sdlex_scrollableMessageMenuCellWithManager:(SDLManager *)manager {
- return [[SDLMenuCell alloc] initWithTitle:ACScrollableMessageMenuName icon:nil voiceCommands:@[ACScrollableMessageMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ return [[SDLMenuCell alloc] initWithTitle:ACScrollableMessageMenuName secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[ACScrollableMessageMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
SDLScrollableMessage *messageRPC = [[SDLScrollableMessage alloc] initWithMessage:@"This is a scrollable message\nIt can contain many lines"];
[manager sendRequest:messageRPC withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if(![response.resultCode isEqualToEnum:SDLResultSuccess]) {
diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m
index ed2c057e3..06ab5dd02 100644
--- a/Example Apps/Example ObjC/ProxyManager.m
+++ b/Example Apps/Example ObjC/ProxyManager.m
@@ -164,6 +164,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdlex_showInitialData {
+ // Send static menu items and soft buttons
+ [self sdlex_createMenus];
+ self.sdlManager.screenManager.softButtonObjects = [self.buttonManager allScreenSoftButtons];
+
if (![self.sdlManager.hmiLevel isEqualToEnum:SDLHMILevelFull]) { return; }
[self.sdlManager.screenManager changeLayout:[[SDLTemplateConfiguration alloc] initWithPredefinedLayout:SDLPredefinedLayoutNonMedia] withCompletionHandler:nil];
@@ -225,8 +229,7 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma mark - SDLManagerDelegate
-
-/// Called when the connection beween this app and the module has closed.
+/// Called when the connection between this app and the module has closed.
- (void)managerDidDisconnect {
if (self.state != ProxyStateStopped) {
[self sdlex_updateProxyState:ProxyStateSearchingForConnection];
@@ -243,24 +246,23 @@ NS_ASSUME_NONNULL_BEGIN
// This is our first time in a non-NONE state
self.firstHMILevel = newLevel;
- // Send static menu items and soft buttons
- [self sdlex_createMenus];
- self.sdlManager.screenManager.softButtonObjects = [self.buttonManager allScreenSoftButtons];
-
// Subscribe to vehicle data.
[self.vehicleDataManager subscribeToVehicleOdometer];
+
+ //Handle initial launch
+ [self sdlex_showInitialData];
}
if ([newLevel isEqualToEnum:SDLHMILevelFull]) {
// The SDL app is in the foreground. Always try to show the initial state to guard against some possible weird states. Duplicates will be ignored by Core.
- [self sdlex_showInitialData];
[self.subscribeButtonManager subscribeToAllPresetButtons];
} else if ([newLevel isEqualToEnum:SDLHMILevelLimited]) {
// An active NAV or MEDIA SDL app is in the background
} else if ([newLevel isEqualToEnum:SDLHMILevelBackground]) {
// The SDL app is not in the foreground
} else if ([newLevel isEqualToEnum:SDLHMILevelNone]) {
- // The SDL app is not yet running
+ // The SDL app is not yet running or is terminated
+ self.firstHMILevel = SDLHMILevelNone;
}
}
@@ -316,6 +318,11 @@ NS_ASSUME_NONNULL_BEGIN
return update;
}
+- (BOOL)didReceiveSystemInfo:(SDLSystemInfo *)systemInfo {
+ SDLLogD(@"Example app did receive system info: %@", systemInfo);
+ return YES;
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/Example Apps/Example ObjC/VehicleDataManager.m b/Example Apps/Example ObjC/VehicleDataManager.m
index f6192777a..a4c4514e6 100644
--- a/Example Apps/Example ObjC/VehicleDataManager.m
+++ b/Example Apps/Example ObjC/VehicleDataManager.m
@@ -144,7 +144,7 @@ NS_ASSUME_NONNULL_BEGIN
SDLLogD(@"App has permission to access vehicle data. Requesting vehicle data...");
- SDLGetVehicleData *getAllVehicleData = [[SDLGetVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES externalTemperature:@YES turnSignal:@YES vin:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES windowStatus:@YES];
+ SDLGetVehicleData *getAllVehicleData = [[SDLGetVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES climateData:@YES turnSignal:@YES vin:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES windowStatus:@YES handsOffSteering:@YES seatOccupancy:@YES];
[manager sendRequest:getAllVehicleData withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (error || ![response isKindOfClass:SDLGetVehicleDataResponse.class]) {
@@ -213,8 +213,6 @@ NS_ASSUME_NONNULL_BEGIN
vehicleDataDescription = vehicleData.engineOilLife.description;
} else if ([vehicleDataType isEqualToString:ACEngineTorqueMenuName]) {
vehicleDataDescription = vehicleData.engineTorque.description;
- } else if ([vehicleDataType isEqualToString:ACExternalTemperatureMenuName]) {
- vehicleDataDescription = vehicleData.externalTemperature.description;
} else if ([vehicleDataType isEqualToString:ACFuelLevelMenuName]) {
vehicleDataDescription = vehicleData.fuelRange.firstObject.level.description;
} else if ([vehicleDataType isEqualToString:ACFuelLevelStateMenuName]) {
diff --git a/Example Apps/Example Swift/AlertManager.swift b/Example Apps/Example Swift/AlertManager.swift
index 9e37dd1c5..71769c51d 100644
--- a/Example Apps/Example Swift/AlertManager.swift
+++ b/Example Apps/Example Swift/AlertManager.swift
@@ -8,6 +8,7 @@
import Foundation
import SmartDeviceLink
+import SmartDeviceLinkSwift
class AlertManager {
/// Sends an alert with up to two lines of text, an image, and a close button that will dismiss the alert when tapped.
@@ -17,18 +18,22 @@ class AlertManager {
/// - textField2: The second line of text in the alert
/// - sdlManager: The SDLManager
class func sendAlert(imageName: String? = nil, textField1: String, textField2: String? = nil, sdlManager: SDLManager) {
- let okSoftButton = SDLSoftButton(type: .text, text: AlertOKButtonText, image: nil, highlighted: true, buttonId: 1, systemAction: nil, handler: nil)
- let alert = SDLAlert(alertText1: textField1, alertText2: textField2, alertText3: nil, softButtons: [okSoftButton], playTone: true, ttsChunks: nil, duration: 5000, progressIndicator: false, alertIcon: nil, cancelID: 0)
+ let okSoftButton = SDLSoftButtonObject(name: AlertOKButtonText, text: AlertOKButtonText, artwork: nil, handler: nil)
+ let alert = SDLAlertView(text: textField1, buttons: [okSoftButton])
+ alert.secondaryText = textField2
+
+ let alertAudioData = SDLAlertAudioData(speechSynthesizerString: "alert")
+ alertAudioData.playTone = true
+ alert.audio = alertAudioData
if let imageName = imageName {
- sendImage(imageName, sdlManager: sdlManager) { (success, artworkName) in
- if success {
- alert.alertIcon = SDLImage(name: artworkName, isTemplate: true)
- }
- sdlManager.send(alert)
+ alert.icon = SDLArtwork(image: UIImage(named: imageName)!.withRenderingMode(.alwaysTemplate), persistent: false, as: .PNG)
+ }
+
+ sdlManager.screenManager.presentAlert(alert) { error in
+ if let error = error {
+ SDLLog.e("There was an error presenting the alert: \(error.localizedDescription)")
}
- } else {
- sdlManager.send(alert)
}
}
diff --git a/Example Apps/Example Swift/ConnectionIAPTableViewController.swift b/Example Apps/Example Swift/ConnectionIAPTableViewController.swift
index 5a51ad456..3898c7a86 100644
--- a/Example Apps/Example Swift/ConnectionIAPTableViewController.swift
+++ b/Example Apps/Example Swift/ConnectionIAPTableViewController.swift
@@ -26,7 +26,7 @@ class ConnectionIAPTableViewController: UITableViewController, ProxyManagerDeleg
}
func initButton() {
- self.connectTableViewCell.backgroundColor = UIColor.red
+ self.connectTableViewCell.backgroundColor = UIColor.systemRed
self.connectButton.setTitle("Connect", for: .normal)
self.connectButton.setTitleColor(.white, for: .normal)
}
@@ -49,13 +49,13 @@ class ConnectionIAPTableViewController: UITableViewController, ProxyManagerDeleg
switch newState {
case .stopped:
- newColor = UIColor.red
+ newColor = UIColor.systemRed
newTitle = "Connect"
case .searching:
- newColor = UIColor.blue
+ newColor = UIColor.systemOrange
newTitle = "Stop Searching"
case .connected:
- newColor = UIColor.green
+ newColor = UIColor.systemGreen
newTitle = "Disconnect"
}
diff --git a/Example Apps/Example Swift/ConnectionTCPTableViewController.swift b/Example Apps/Example Swift/ConnectionTCPTableViewController.swift
index 4f07745e9..5195ce462 100644
--- a/Example Apps/Example Swift/ConnectionTCPTableViewController.swift
+++ b/Example Apps/Example Swift/ConnectionTCPTableViewController.swift
@@ -30,7 +30,7 @@ class ConnectionTCPTableViewController: UITableViewController, UINavigationContr
}
func initButton() {
- self.connectTableViewCell.backgroundColor = UIColor.red
+ self.connectTableViewCell.backgroundColor = UIColor.systemRed
self.connectButton.setTitle("Connect", for: .normal)
self.connectButton.setTitleColor(.white, for: .normal)
}
@@ -65,13 +65,13 @@ class ConnectionTCPTableViewController: UITableViewController, UINavigationContr
switch newState {
case .stopped:
- newColor = UIColor.red
+ newColor = UIColor.systemRed
newTitle = "Connect"
case .searching:
- newColor = UIColor.blue
+ newColor = UIColor.systemOrange
newTitle = "Stop Searching"
case .connected:
- newColor = UIColor.green
+ newColor = UIColor.systemGreen
newTitle = "Disconnect"
}
diff --git a/Example Apps/Example Swift/MenuManager.swift b/Example Apps/Example Swift/MenuManager.swift
index e21a05e10..092670559 100644
--- a/Example Apps/Example Swift/MenuManager.swift
+++ b/Example Apps/Example Swift/MenuManager.swift
@@ -48,7 +48,7 @@ private extension MenuManager {
/// - Parameter manager: The SDL Manager
/// - Returns: A SDLMenuCell object
class func menuCellSpeakName(with manager: SDLManager) -> SDLMenuCell {
- return SDLMenuCell(title: ACSpeakAppNameMenuName, icon: SDLArtwork(image: UIImage(named: SpeakBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), voiceCommands: [ACSpeakAppNameMenuName], handler: { _ in
+ return SDLMenuCell(title: ACSpeakAppNameMenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: UIImage(named: SpeakBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, voiceCommands: [ACSpeakAppNameMenuName], handler: { _ in
manager.send(request: SDLSpeak(tts: ExampleAppNameTTS), responseHandler: { (_, response, error) in
guard response?.resultCode == .success else { return }
SDLLog.e("Error sending the Speak RPC: \(error?.localizedDescription ?? "no error message")")
@@ -62,17 +62,17 @@ private extension MenuManager {
/// - Returns: A SDLMenuCell object
class func menuCellGetAllVehicleData(with manager: SDLManager) -> SDLMenuCell {
let submenuItems = allVehicleDataTypes.map { submenuName in
- SDLMenuCell(title: submenuName, icon: SDLArtwork(staticIcon: .settings), voiceCommands: nil, handler: { triggerSource in
+ SDLMenuCell(title: submenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(staticIcon: .settings), secondaryArtwork: nil, voiceCommands: nil, handler: { triggerSource in
VehicleDataManager.getAllVehicleData(with: manager, triggerSource: triggerSource, vehicleDataType: submenuName)
})
}
- return SDLMenuCell(title: ACGetAllVehicleDataMenuName, icon: SDLArtwork(image: UIImage(named: CarBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), submenuLayout: .tiles, subCells: submenuItems)
+ return SDLMenuCell(title: ACGetAllVehicleDataMenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: UIImage(named: CarBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, submenuLayout: .tiles, subCells: submenuItems)
}
/// A list of all possible vehicle data types
static var allVehicleDataTypes: [String] {
- return [ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACElectronicParkBrakeStatus, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACExternalTemperatureMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGearStatusMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACTurnSignalMenuName, ACVINMenuName, ACWiperStatusMenuName]
+ return [ACAccelerationPedalPositionMenuName, ACAirbagStatusMenuName, ACBeltStatusMenuName, ACBodyInformationMenuName, ACClusterModeStatusMenuName, ACDeviceStatusMenuName, ACDriverBrakingMenuName, ACECallInfoMenuName, ACElectronicParkBrakeStatus, ACEmergencyEventMenuName, ACEngineOilLifeMenuName, ACEngineTorqueMenuName, ACFuelLevelMenuName, ACFuelLevelStateMenuName, ACFuelRangeMenuName, ACGearStatusMenuName, ACGPSMenuName, ACHeadLampStatusMenuName, ACInstantFuelConsumptionMenuName, ACMyKeyMenuName, ACOdometerMenuName, ACPRNDLMenuName, ACRPMMenuName, ACSpeedMenuName, ACSteeringWheelAngleMenuName, ACTirePressureMenuName, ACTurnSignalMenuName, ACVINMenuName, ACWiperStatusMenuName]
}
/// Menu item that shows a custom menu (i.e. a Perform Interaction Choice Set) when selected
@@ -80,7 +80,7 @@ private extension MenuManager {
/// - Parameter manager: The SDL Manager
/// - Returns: A SDLMenuCell object
class func menuCellShowPerformInteraction(with manager: SDLManager, choiceSetManager: PerformInteractionManager) -> SDLMenuCell {
- return SDLMenuCell(title: ACShowChoiceSetMenuName, icon: SDLArtwork(image: UIImage(named: MenuBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), voiceCommands: [ACShowChoiceSetMenuName], handler: { triggerSource in
+ return SDLMenuCell(title: ACShowChoiceSetMenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: UIImage(named: MenuBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, voiceCommands: [ACShowChoiceSetMenuName], handler: { triggerSource in
choiceSetManager.show(from: triggerSource)
})
}
@@ -91,7 +91,7 @@ private extension MenuManager {
/// - Returns: A SDLMenuCell object
class func menuCellRecordInCarMicrophoneAudio(with manager: SDLManager) -> SDLMenuCell {
let audioManager = AudioManager(sdlManager: manager)
- return SDLMenuCell(title: ACRecordInCarMicrophoneAudioMenuName, icon: SDLArtwork(image: UIImage(named: MicrophoneBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), voiceCommands: [ACRecordInCarMicrophoneAudioMenuName], handler: { _ in
+ return SDLMenuCell(title: ACRecordInCarMicrophoneAudioMenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: UIImage(named: MicrophoneBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, voiceCommands: [ACRecordInCarMicrophoneAudioMenuName], handler: { _ in
audioManager.startRecording()
})
}
@@ -101,7 +101,7 @@ private extension MenuManager {
/// - Parameter manager: The SDL Manager
/// - Returns: A SDLMenuCell object
class func menuCellDialNumber(with manager: SDLManager) -> SDLMenuCell {
- return SDLMenuCell(title: ACDialPhoneNumberMenuName, icon: SDLArtwork(image: UIImage(named: PhoneBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), voiceCommands: [ACDialPhoneNumberMenuName], handler: { _ in
+ return SDLMenuCell(title: ACDialPhoneNumberMenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: UIImage(named: PhoneBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, voiceCommands: [ACDialPhoneNumberMenuName], handler: { _ in
guard RPCPermissionsManager.isDialNumberRPCAllowed(with: manager) else {
AlertManager.sendAlert(textField1: AlertDialNumberPermissionsWarningText, sdlManager: manager)
return
@@ -123,7 +123,7 @@ private extension MenuManager {
/// Non-Media
let submenuTitleNonMedia = "Non - Media (Default)"
- submenuItems.append(SDLMenuCell(title: submenuTitleNonMedia, icon: nil, voiceCommands: nil, handler: { (triggerSource) in
+ submenuItems.append(SDLMenuCell(title: submenuTitleNonMedia, secondaryText: nil, tertiaryText: nil, icon: nil, secondaryArtwork: nil, voiceCommands: nil, handler: { (triggerSource) in
manager.screenManager.changeLayout(SDLTemplateConfiguration(predefinedLayout: .nonMedia)) { err in
if err != nil {
AlertManager.sendAlert(textField1: errorMessage, sdlManager: manager)
@@ -134,7 +134,7 @@ private extension MenuManager {
/// Graphic with Text
let submenuTitleGraphicText = "Graphic With Text"
- submenuItems.append(SDLMenuCell(title: submenuTitleGraphicText, icon: nil, voiceCommands: nil, handler: { (triggerSource) in
+ submenuItems.append(SDLMenuCell(title: submenuTitleGraphicText, secondaryText: nil, tertiaryText: nil, icon: nil, secondaryArtwork: nil, voiceCommands: nil, handler: { (triggerSource) in
manager.screenManager.changeLayout(SDLTemplateConfiguration(predefinedLayout: .graphicWithText)) { err in
if err != nil {
AlertManager.sendAlert(textField1: errorMessage, sdlManager: manager)
@@ -143,7 +143,7 @@ private extension MenuManager {
}
}))
- return SDLMenuCell(title: ACSubmenuTemplateMenuName, icon: nil, submenuLayout: .list, subCells: submenuItems)
+ return SDLMenuCell(title: ACSubmenuTemplateMenuName, secondaryText: nil, tertiaryText: nil, icon: nil, secondaryArtwork: nil, submenuLayout: .list, subCells: submenuItems)
}
/// Menu item that opens a submenu when selected
@@ -154,7 +154,7 @@ private extension MenuManager {
var submenuItems = [SDLMenuCell]()
for i in 0 ..< 10 {
let submenuTitle = "Submenu Item \(i)"
- submenuItems.append(SDLMenuCell(title: submenuTitle, icon: SDLArtwork(image: UIImage(named: MenuBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), voiceCommands: nil, handler: { (triggerSource) in
+ submenuItems.append(SDLMenuCell(title: submenuTitle, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: UIImage(named: MenuBWIconImageName)!.withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, voiceCommands: nil, handler: { (triggerSource) in
let message = "\(submenuTitle) selected!"
switch triggerSource {
case .menu:
@@ -166,11 +166,11 @@ private extension MenuManager {
}))
}
- return SDLMenuCell(title: ACSubmenuMenuName, icon: SDLArtwork(image: #imageLiteral(resourceName: "choice_set").withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), submenuLayout: .list, subCells: submenuItems)
+ return SDLMenuCell(title: ACSubmenuMenuName, secondaryText: nil, tertiaryText: nil, icon: SDLArtwork(image: #imageLiteral(resourceName: "choice_set").withRenderingMode(.alwaysTemplate), persistent: true, as: .PNG), secondaryArtwork: nil, submenuLayout: .list, subCells: submenuItems)
}
private class func sliderMenuCell(with manager: SDLManager) -> SDLMenuCell {
- return SDLMenuCell(title: ACSliderMenuName, icon: nil, voiceCommands: [ACSliderMenuName], handler: { _ in
+ return SDLMenuCell(title: ACSliderMenuName, secondaryText: nil, tertiaryText: nil, icon: nil, secondaryArtwork: nil, voiceCommands: [ACSliderMenuName], handler: { _ in
let slider = SDLSlider(numTicks: 3, position: 1, sliderHeader: "Select a letter", sliderFooters: ["A", "B", "C"], timeout: 3000)
manager.send(request: slider, responseHandler: { (request, response, error) in
guard let response = response else { return }
@@ -189,7 +189,7 @@ private extension MenuManager {
}
private class func scrollableMessageMenuCell(with manager: SDLManager) -> SDLMenuCell {
- return SDLMenuCell(title: ACScrollableMessageMenuName, icon: nil, voiceCommands: [ACScrollableMessageMenuName], handler: { _ in
+ return SDLMenuCell(title: ACScrollableMessageMenuName, secondaryText: nil, tertiaryText: nil, icon: nil, secondaryArtwork: nil, voiceCommands: [ACScrollableMessageMenuName], handler: { _ in
let scrollableMessage = SDLScrollableMessage(message: "This is a scrollable message\nIt can contain many lines")
manager.send(request: scrollableMessage, responseHandler: { (request, response, error) in
guard let response = response else { return }
diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift
index bce2617ad..9cbee5d6b 100644
--- a/Example Apps/Example Swift/ProxyManager.swift
+++ b/Example Apps/Example Swift/ProxyManager.swift
@@ -146,8 +146,8 @@ private extension ProxyManager {
// MARK: - SDLManagerDelegate
extension ProxyManager: SDLManagerDelegate {
- /// Called when the connection beween this app and the module has closed.
- func managerDidDisconnect() {
+ /// Called when the connection between this app and the module has closed.
+ func managerDidDisconnect() {
if delegate?.proxyState != .some(.stopped) {
delegate?.didChangeProxyState(ProxyState.searching)
}
@@ -165,22 +165,23 @@ extension ProxyManager: SDLManagerDelegate {
// This is our first time in a non-NONE state
firstHMILevelState = newLevel
- // Send static menu items and soft buttons
- createMenuAndGlobalVoiceCommands()
- sdlManager.screenManager.softButtonObjects = buttonManager.allScreenSoftButtons()
-
// Subscribe to vehicle data.
vehicleDataManager.subscribeToVehicleOdometer()
+
+ //Handle initial launch
+ showInitialData()
}
switch newLevel {
case .full:
// The SDL app is in the foreground. Always try to show the initial state to guard against some possible weird states. Duplicates will be ignored by Core.
- showInitialData()
subscribeButtonManager.subscribeToPresetButtons()
case .limited: break // An active NAV or MEDIA SDL app is in the background
case .background: break // The SDL app is not in the foreground
- case .none: break // The SDL app is not yet running
+ case .none:
+ // The SDL app is not yet running or is terminated
+ firstHMILevelState = .none
+ break
default: break
}
}
@@ -236,6 +237,14 @@ extension ProxyManager: SDLManagerDelegate {
return update
}
+
+ /// Called when connected module information becomes available
+ /// - Parameter systemInfo: The connected module's information
+ /// - Returns: True to continue connecting, false to disconnect immediately
+ func didReceiveSystemInfo(_ systemInfo: SDLSystemInfo) -> Bool {
+ SDLLog.d("Example app got system info: \(systemInfo)")
+ return true
+ }
}
// MARK: - SDL UI
@@ -250,6 +259,10 @@ private extension ProxyManager {
/// Set the template and create the UI
func showInitialData() {
+ // Send static menu items and soft buttons
+ createMenuAndGlobalVoiceCommands()
+ sdlManager.screenManager.softButtonObjects = buttonManager.allScreenSoftButtons()
+
guard sdlManager.hmiLevel == .full else { return }
sdlManager.screenManager.changeLayout(SDLTemplateConfiguration(predefinedLayout: .nonMedia), withCompletionHandler: nil)
diff --git a/Example Apps/Example Swift/VehicleDataManager.swift b/Example Apps/Example Swift/VehicleDataManager.swift
index 87176a883..618c74a93 100644
--- a/Example Apps/Example Swift/VehicleDataManager.swift
+++ b/Example Apps/Example Swift/VehicleDataManager.swift
@@ -111,7 +111,7 @@ extension VehicleDataManager {
guard hasPermissionToAccessVehicleData(with: manager) else { return }
SDLLog.d("App has permission to access vehicle data. Requesting all vehicle data...")
- let getAllVehicleData = SDLGetVehicleData(gps: NSNumber(true), speed: NSNumber(true), rpm: NSNumber(true), instantFuelConsumption: NSNumber(true), fuelRange: NSNumber(true), externalTemperature: NSNumber(true), turnSignal: NSNumber(true), vin: NSNumber(true), gearStatus: NSNumber(true), tirePressure: NSNumber(true), odometer: NSNumber(true), beltStatus: NSNumber(true), bodyInformation: NSNumber(true), deviceStatus: NSNumber(true), driverBraking: NSNumber(true), wiperStatus: NSNumber(true), headLampStatus: NSNumber(true), engineTorque: NSNumber(true), accPedalPosition: NSNumber(true), steeringWheelAngle: NSNumber(true), engineOilLife: NSNumber(true), electronicParkBrakeStatus: NSNumber(true), cloudAppVehicleID: NSNumber(true), stabilityControlsStatus: NSNumber(true), eCallInfo: NSNumber(true), airbagStatus: NSNumber(true), emergencyEvent: NSNumber(true), clusterModeStatus: NSNumber(true), myKey: NSNumber(true), handsOffSteering: NSNumber(true), windowStatus: NSNumber(true))
+ let getAllVehicleData = SDLGetVehicleData(gps:NSNumber(true), speed:NSNumber(true), rpm:NSNumber(true), instantFuelConsumption:NSNumber(true), fuelRange:NSNumber(true), climateData:NSNumber(true), turnSignal:NSNumber(true), vin:NSNumber(true), gearStatus:NSNumber(true), tirePressure:NSNumber(true), odometer:NSNumber(true), beltStatus:NSNumber(true), bodyInformation:NSNumber(true), deviceStatus:NSNumber(true), driverBraking:NSNumber(true), wiperStatus:NSNumber(true), headLampStatus:NSNumber(true), engineTorque:NSNumber(true), accPedalPosition:NSNumber(true), steeringWheelAngle:NSNumber(true), engineOilLife:NSNumber(true), electronicParkBrakeStatus:NSNumber(true), cloudAppVehicleID:NSNumber(true), stabilityControlsStatus:NSNumber(true), eCallInfo:NSNumber(true), airbagStatus:NSNumber(true), emergencyEvent:NSNumber(true), clusterModeStatus:NSNumber(true), myKey:NSNumber(true), windowStatus:NSNumber(true), handsOffSteering:NSNumber(true), seatOccupancy:NSNumber(true))
manager.send(request: getAllVehicleData) { (request, response, error) in
guard didAccessVehicleDataSuccessfully(with: manager, response: response, error: error) else { return }
@@ -187,8 +187,6 @@ extension VehicleDataManager {
vehicleDataDescription = vehicleData.engineOilLife?.description ?? notAvailable
case ACEngineTorqueMenuName:
vehicleDataDescription = vehicleData.engineTorque?.description ?? notAvailable
- case ACExternalTemperatureMenuName:
- vehicleDataDescription = vehicleData.externalTemperature?.description ?? notAvailable
case ACFuelLevelMenuName:
vehicleDataDescription = vehicleData.fuelRange?.first?.level?.description ?? notAvailable
case ACFuelLevelStateMenuName:
diff --git a/Example Apps/Shared/AppConstants.h b/Example Apps/Shared/AppConstants.h
index b06009fa7..36f25b4b7 100644
--- a/Example Apps/Shared/AppConstants.h
+++ b/Example Apps/Shared/AppConstants.h
@@ -108,7 +108,6 @@ extern NSString * const ACElectronicParkBrakeStatus;
extern NSString * const ACEmergencyEventMenuName;
extern NSString * const ACEngineOilLifeMenuName;
extern NSString * const ACEngineTorqueMenuName;
-extern NSString * const ACExternalTemperatureMenuName;
extern NSString * const ACFuelLevelMenuName;
extern NSString * const ACFuelLevelStateMenuName;
extern NSString * const ACFuelRangeMenuName;
diff --git a/Example Apps/Shared/AppConstants.m b/Example Apps/Shared/AppConstants.m
index 69447b16d..20afa0b6c 100644
--- a/Example Apps/Shared/AppConstants.m
+++ b/Example Apps/Shared/AppConstants.m
@@ -105,7 +105,6 @@ NSString * const ACElectronicParkBrakeStatus = @"Electronic Parking Brake Status
NSString * const ACEmergencyEventMenuName = @"Emergency Event";
NSString * const ACEngineOilLifeMenuName = @"Engine Oil Life";
NSString * const ACEngineTorqueMenuName = @"Engine Torque";
-NSString * const ACExternalTemperatureMenuName = @"External Temperature";
NSString * const ACFuelLevelMenuName = @"Fuel Level";
NSString * const ACFuelLevelStateMenuName = @"Fuel Level State";
NSString * const ACFuelRangeMenuName = @"Fuel Range";
diff --git a/Package.swift b/Package.swift
index 0b7fda6d4..71f6bcb90 100644
--- a/Package.swift
+++ b/Package.swift
@@ -12,7 +12,7 @@ let package = Package(
.library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"])
],
dependencies: [
- .package(name: "BiSON", url: "https://github.com/smartdevicelink/bson_c_lib.git", from: "1.2.2")
+ .package(name: "BiSON", url: "https://github.com/smartdevicelink/bson_c_lib.git", from: "1.2.4")
],
targets: [
.target(
diff --git a/README.md b/README.md
index 0f65cd5a2..ae943a97c 100644
--- a/README.md
+++ b/README.md
@@ -78,19 +78,3 @@ carthage bootstrap --platform ios
```
At this point, you can run tests from Xcode, or, if you wish to run the tests exactly as they will be run on the CI server, see the [YAML document](https://github.com/smartdevicelink/sdl_ios/blob/master/.github/workflows/test.yml) describing those tests. You can also check the [previously run CI tests](https://github.com/smartdevicelink/sdl_ios/actions?query=workflow%3A%22SmartDeviceLink+Tests%22) to see how they're currently being run.
-
-##### Lock Screen Screenshot Tests
-We run some additional tests using [iOSSnapshotTestCase](https://github.com/uber/ios-snapshot-test-case). These tests generate the lock screen view controller and compare it to generated screenshots. By default, the generated screenshots use the iPhone 11 simulator and if you run the unit tests on that simulator, the tests should pass by default.
-
-###### Re-Generating Lock Screen Screenshots
-If you need to change which simulator is used to generate the screenshots, or if you need to re-generate the screenshots for another reason, you can. Go to `SDLLockScreenViewControllerSnapshotTests.m` and take the following steps:
-
-1. Uncomment the following line:
-
-```objc
-// self.recordMode = YES;
-```
-
-2. Run unit tests on the simulator that you want to use to generate the screenshots. Tests should fail because record mode is on.
-3. Re-comment out the line.
-4. Run unit tests again; they should pass this time.
diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec
index 2426b129c..7893f1f3c 100644
--- a/SmartDeviceLink-iOS.podspec
+++ b/SmartDeviceLink-iOS.podspec
@@ -1,13 +1,13 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink-iOS"
-s.version = "7.0.0"
+s.version = "7.1.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
s.author = { "SmartDeviceLink Team" => "developer@smartdevicelink.com" }
s.platform = :ios, "10.0"
-s.dependency 'BiSON', '~> 1.2.2'
+s.dependency 'BiSON', '~> 1.2.4'
s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :tag => s.version.to_s }
s.requires_arc = true
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index 948f32bfb..7929c3aa3 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -97,7 +97,6 @@
162E83191A9BDE8B00906325 /* SDLOnLanguageChangeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82331A9BDE8A00906325 /* SDLOnLanguageChangeSpec.m */; };
162E831B1A9BDE8B00906325 /* SDLOnPermissionsChangeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82351A9BDE8A00906325 /* SDLOnPermissionsChangeSpec.m */; };
162E831C1A9BDE8B00906325 /* SDLOnSyncPDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82361A9BDE8A00906325 /* SDLOnSyncPDataSpec.m */; };
- 162E831D1A9BDE8B00906325 /* SDLOnSystemRequestSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82371A9BDE8A00906325 /* SDLOnSystemRequestSpec.m */; };
162E831E1A9BDE8B00906325 /* SDLOnTBTClientStateSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82381A9BDE8A00906325 /* SDLOnTBTClientStateSpec.m */; };
162E831F1A9BDE8B00906325 /* SDLOnTouchEventSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82391A9BDE8A00906325 /* SDLOnTouchEventSpec.m */; };
162E83201A9BDE8B00906325 /* SDLOnVehicleDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E823A1A9BDE8A00906325 /* SDLOnVehicleDataSpec.m */; };
@@ -284,6 +283,7 @@
2BF2F85220ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BF2F85120ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m */; };
4A1B036F24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1B036E24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m */; };
4A1FA09B25114833006B7851 /* SDLErrorConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1FA09A25114833006B7851 /* SDLErrorConstants.m */; };
+ 4A39C6FA25E84C87005C8943 /* SDLKeyboardCapabilities.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D9DF25D2571000CDFD21 /* SDLKeyboardCapabilities.m */; };
4A40254124FFDA660080E159 /* SDLTextAndGraphicState.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A40253D24FFDA660080E159 /* SDLTextAndGraphicState.m */; };
4A40254224FFDA660080E159 /* SDLTextAndGraphicUpdateOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A40253E24FFDA660080E159 /* SDLTextAndGraphicUpdateOperation.h */; };
4A40254324FFDA660080E159 /* SDLTextAndGraphicUpdateOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A40253F24FFDA660080E159 /* SDLTextAndGraphicUpdateOperation.m */; };
@@ -294,11 +294,13 @@
4A402561250134CB0080E159 /* SDLStabilityControlsStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A40255F250134CA0080E159 /* SDLStabilityControlsStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
4A404C66250BBE11003AB65D /* SDLTextAndGraphicUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A404C65250BBE11003AB65D /* SDLTextAndGraphicUpdateOperationSpec.m */; };
4A404C68250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A404C67250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m */; };
+ 4A41430D255F0A090039C267 /* TestConnectionRequestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */; };
4A457DC324A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DC224A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m */; };
4A457DD324A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DD224A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m */; };
4A457DD524A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */; };
4A457DD724A3CCED00386CBA /* SDLLifecycleSystemRequestHandlerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DD624A3CCED00386CBA /* SDLLifecycleSystemRequestHandlerSpec.m */; };
4A457DD924A5137100386CBA /* SDLLifecycleProtocolHandlerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DD824A5137100386CBA /* SDLLifecycleProtocolHandlerSpec.m */; };
+ 4A5822C225E40BB5002822F1 /* NSArray+ExtensionsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A5822C125E40BB5002822F1 /* NSArray+ExtensionsSpec.m */; };
4A8BD23B24F93135000945E3 /* SDLMassageCushionFirmness.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A8BD22324F93131000945E3 /* SDLMassageCushionFirmness.h */; settings = {ATTRIBUTES = (Public, ); }; };
4A8BD23C24F93135000945E3 /* SDLMediaServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A8BD22424F93131000945E3 /* SDLMediaServiceData.m */; };
4A8BD23D24F93135000945E3 /* SDLMsgVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A8BD22524F93132000945E3 /* SDLMsgVersion.m */; };
@@ -510,6 +512,9 @@
4A8BD3CD24F999BE000945E3 /* TestSubscribeButtonObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A8BD3CC24F999BE000945E3 /* TestSubscribeButtonObserver.m */; };
4A8BD3D024FE7CF1000945E3 /* SDLPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A8BD3CE24FE7CF1000945E3 /* SDLPermissionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
4A8BD3D124FE7CF1000945E3 /* SDLPermissionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A8BD3CF24FE7CF1000945E3 /* SDLPermissionManager.m */; };
+ 4AAB6A1225E57BEA0017A5A7 /* SDLSystemInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AAB6A1025E57BEA0017A5A7 /* SDLSystemInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4AAB6A1325E57BEA0017A5A7 /* SDLSystemInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAB6A1125E57BEA0017A5A7 /* SDLSystemInfo.m */; };
+ 4AAB6A2325E69D010017A5A7 /* SDLSystemInfoSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAB6A2225E69D010017A5A7 /* SDLSystemInfoSpec.m */; };
4ABB24BA24F592620061BF55 /* NSMutableArray+Safe.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB24B224F592620061BF55 /* NSMutableArray+Safe.h */; };
4ABB24BB24F592620061BF55 /* NSMutableArray+Safe.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB24B324F592620061BF55 /* NSMutableArray+Safe.m */; };
4ABB24BC24F592620061BF55 /* NSBundle+SDLBundle.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB24B424F592620061BF55 /* NSBundle+SDLBundle.m */; };
@@ -1383,6 +1388,9 @@
4ABB2BA724F850AE0061BF55 /* SDLImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB2B9924F850AD0061BF55 /* SDLImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
4ABB2BA824F850AE0061BF55 /* SDLLightState.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */; };
4ABB2BA924F850AE0061BF55 /* SDLImageResolution.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */; };
+ 4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */; };
+ 4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */; };
4AE8A7022537796E000666C0 /* SmartDeviceLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AE8A7012537796E000666C0 /* SmartDeviceLink.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D0A9F911F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */; };
5D0A9F931F15560B00CC80DD /* SDLNavigationCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F921F15560B00CC80DD /* SDLNavigationCapabilitySpec.m */; };
@@ -1395,7 +1403,6 @@
5D1FF29C21304515000EB9B4 /* PerformInteractionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29121304513000EB9B4 /* PerformInteractionManager.m */; };
5D1FF29D21304515000EB9B4 /* RPCPermissionsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29221304513000EB9B4 /* RPCPermissionsManager.m */; };
5D1FF29E21304515000EB9B4 /* MenuManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29421304513000EB9B4 /* MenuManager.m */; };
- 5D1FF29F21304515000EB9B4 /* ProxyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29621304514000EB9B4 /* ProxyManager.m */; };
5D1FF2A021304515000EB9B4 /* AudioManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29721304514000EB9B4 /* AudioManager.m */; };
5D1FF2A121304515000EB9B4 /* VehicleDataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29921304514000EB9B4 /* VehicleDataManager.m */; };
5D1FF2A221304515000EB9B4 /* ButtonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29B21304515000EB9B4 /* ButtonManager.m */; };
@@ -1442,9 +1449,6 @@
5D43466F1E6F55BD00B639C6 /* SDLLogManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D43466E1E6F55BD00B639C6 /* SDLLogManagerSpec.m */; };
5D4346731E6F617D00B639C6 /* TestLogTarget.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4346721E6F617D00B639C6 /* TestLogTarget.m */; };
5D59DD471B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */; };
- 5D5DBF081D48E39C00D4F914 /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */; };
- 5D5DBF091D48E3AC00D4F914 /* FBSnapshotTestCase.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 5D5DBF0B1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */; };
5D6035D2202CD46200A429C9 /* SDLSpecUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6035D1202CD46200A429C9 /* SDLSpecUtilities.m */; };
5D6035D5202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6035D4202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.m */; };
5D6035D8202CF5C900A429C9 /* TestRequestProgressResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6035D7202CF5C900A429C9 /* TestRequestProgressResponse.m */; };
@@ -1476,7 +1480,6 @@
5D9F507C1BE7DD4C00FEF399 /* testImagePNG.png in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50761BE7DD4C00FEF399 /* testImagePNG.png */; };
5D9F507D1BE7DD4C00FEF399 /* testImageTIFF.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50771BE7DD4C00FEF399 /* testImageTIFF.tiff */; };
5D9F50811BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9F50801BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m */; };
- 5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9F50821BEA5C6100FEF399 /* SDLFileManagerSpec.m */; };
5D9F50871BED412E00FEF399 /* TestConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9F50861BED412E00FEF399 /* TestConnectionManager.m */; };
5D9FDA8F1F2A7D3400A495C8 /* bson_array.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D9FDA891F2A7D3400A495C8 /* bson_array.c */; };
5D9FDA901F2A7D3400A495C8 /* bson_array.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D9FDA8A1F2A7D3400A495C8 /* bson_array.h */; };
@@ -1526,7 +1529,6 @@
5DB92D2D1AC4A34F00C15BB0 /* SDLPrioritizedObjectCollectionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D2C1AC4A34F00C15BB0 /* SDLPrioritizedObjectCollectionSpec.m */; };
5DB92D2F1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D2E1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m */; };
5DBAE0AB1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBAE0AA1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m */; };
- 5DBAE0AD1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBAE0AC1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m */; };
5DBEFA541F434B9E009EE295 /* SDLStreamingMediaConfigurationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBEFA531F434B9E009EE295 /* SDLStreamingMediaConfigurationSpec.m */; };
5DBEFA581F436132009EE295 /* SDLFakeSecurityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBEFA571F436132009EE295 /* SDLFakeSecurityManager.m */; };
5DBF0D5E1F3A68C0008AF2C9 /* SDLControlFramePayloadVideoStartServiceSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBF0D5D1F3A68C0008AF2C9 /* SDLControlFramePayloadVideoStartServiceSpec.m */; };
@@ -1551,7 +1553,6 @@
5DEF69611FD6FB75004B8C2F /* SDLAudioStreamManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DEF69601FD6FB75004B8C2F /* SDLAudioStreamManagerSpec.m */; };
5DEF69661FD6FEF7004B8C2F /* SDLStreamingAudioManagerMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DEF69651FD6FEF7004B8C2F /* SDLStreamingAudioManagerMock.m */; };
5DF40B26208FA7DE00DD6FDA /* SDLMenuManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */; };
- 5DF40B28208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */; };
752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */; };
752ECDBB228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */; };
7538765622DCAF5400FE8484 /* SDLShowAppMenuSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 7538765522DCAF5400FE8484 /* SDLShowAppMenuSpec.m */; };
@@ -1563,6 +1564,11 @@
8815D0F022330765000F24E6 /* SDLRPCRequestNotificationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C23E8522297BD500EA171F /* SDLRPCRequestNotificationSpec.m */; };
8816772922208B82001FACFF /* SDLNavigationInstructionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8816772822208B82001FACFF /* SDLNavigationInstructionSpec.m */; };
8818ADDD2100FE0C007D6F19 /* SDLTurnSignalSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */; };
+ 881BBF50255AC27000761B7E /* SDLAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 881BBF4E255AC27000761B7E /* SDLAlertView.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 881BBF51255AC27000761B7E /* SDLAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 881BBF4F255AC27000761B7E /* SDLAlertView.m */; };
+ 881BBF5B255ADB8300761B7E /* SDLAlertViewSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 881BBF5A255ADB8300761B7E /* SDLAlertViewSpec.m */; };
+ 881BBF60255B1C1E00761B7E /* SDLAlertManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 881BBF5E255B1C1E00761B7E /* SDLAlertManager.h */; };
+ 881BBF61255B1C1E00761B7E /* SDLAlertManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 881BBF5F255B1C1E00761B7E /* SDLAlertManager.m */; };
881F388D22D904BE00DF6DCE /* SDLCancelInteractionResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 881F388C22D904BE00DF6DCE /* SDLCancelInteractionResponseSpec.m */; };
8829568B207CF68800EF056C /* SmartDeviceLink.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
88295693207CF68800EF056C /* SmartDeviceLink.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -1585,6 +1591,8 @@
8855F9EC220CBFB700A5C897 /* SDLGetFileSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8855F9EB220CBFB700A5C897 /* SDLGetFileSpec.m */; };
8863747E22D650DE00D2671F /* SDLCloseApplicationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8863747D22D650DE00D2671F /* SDLCloseApplicationSpec.m */; };
88665B6C220B796A00D9DA77 /* SDLPerformAppServiceInteractionResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88665B6B220B796A00D9DA77 /* SDLPerformAppServiceInteractionResponseSpec.m */; };
+ 886E413D2565D0D200F073B8 /* SDLPresentAlertOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 886E413C2565D0D200F073B8 /* SDLPresentAlertOperationSpec.m */; };
+ 886E41412565D11200F073B8 /* SDLAlertManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 886E41402565D11200F073B8 /* SDLAlertManagerSpec.m */; };
8877F5EB1F34A3BE00DC128A /* SDLSendHapticDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8877F5EA1F34A3BE00DC128A /* SDLSendHapticDataSpec.m */; };
8877F5F11F34AA2D00DC128A /* SDLSendHapticDataResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8877F5F01F34AA2D00DC128A /* SDLSendHapticDataResponseSpec.m */; };
887BE4D422272B2200B397C2 /* SDLControlFramePayloadConstantsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 887BE4D322272B2200B397C2 /* SDLControlFramePayloadConstantsSpec.m */; };
@@ -1600,6 +1608,12 @@
8881AFBB2225E7FA00EA870B /* SDLGetCloudAppPropertiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8881AFBA2225E7FA00EA870B /* SDLGetCloudAppPropertiesSpec.m */; };
8881AFC12225EB9300EA870B /* SDLGetCloudAppPropertiesResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8881AFC02225EB9300EA870B /* SDLGetCloudAppPropertiesResponseSpec.m */; };
8886EB982111F4FA008294A5 /* SDLFileManagerConfigurationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8886EB972111F4FA008294A5 /* SDLFileManagerConfigurationSpec.m */; };
+ 8889C2ED2559C7E2004F5966 /* SDLAudioDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8889C2EC2559C7E2004F5966 /* SDLAudioDataSpec.m */; };
+ 8889C2F42559CFAF004F5966 /* SDLAlertAudioData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8889C2F22559CFAF004F5966 /* SDLAlertAudioData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8889C2F52559CFAF004F5966 /* SDLAlertAudioData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8889C2F32559CFAF004F5966 /* SDLAlertAudioData.m */; };
+ 8889C2FC2559CFE3004F5966 /* SDLAudioData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8889C2FA2559CFE2004F5966 /* SDLAudioData.m */; };
+ 8889C2FD2559CFE3004F5966 /* SDLAudioData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8889C2FB2559CFE3004F5966 /* SDLAudioData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8889C3052559E109004F5966 /* SDLAlertAudioDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8889C3042559E109004F5966 /* SDLAlertAudioDataSpec.m */; };
888F8700221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 888F86FF221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m */; };
889D0B9624D065EE008AD494 /* SDLSubtleAlertResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 889D0B9524D065EE008AD494 /* SDLSubtleAlertResponseSpec.m */; };
889D0B9824D06E52008AD494 /* SDLSubtleAlertSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 889D0B9724D06E52008AD494 /* SDLSubtleAlertSpec.m */; };
@@ -1629,6 +1643,8 @@
88D0E5D624786580009469AB /* SDLSubscribeButtonManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D0E5D524786580009469AB /* SDLSubscribeButtonManagerSpec.m */; };
88D0E5D824786770009469AB /* SDLSubscribeButtonObserverSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D0E5D724786770009469AB /* SDLSubscribeButtonObserverSpec.m */; };
88D2AAE41F682BB20078D5B2 /* SDLLogConstantsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D2AAE31F682BB20078D5B2 /* SDLLogConstantsSpec.m */; };
+ 88D79EED255D8D5B005FACB1 /* SDLPresentAlertOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D79EEB255D8D5B005FACB1 /* SDLPresentAlertOperation.h */; };
+ 88D79EEE255D8D5B005FACB1 /* SDLPresentAlertOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D79EEC255D8D5B005FACB1 /* SDLPresentAlertOperation.m */; };
88DDD0F9229ECA57002F9623 /* SDLIAPConstantsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DDD0F8229ECA57002F9623 /* SDLIAPConstantsSpec.m */; };
88DF998D22035CC600477AC1 /* EAAccessory+OCMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */; };
88DF998F22035D1700477AC1 /* SDLIAPSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */; };
@@ -1663,10 +1679,71 @@
9FA0D00C22DF0B65009CF344 /* SDLCreateWindowResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FA0D00B22DF0B65009CF344 /* SDLCreateWindowResponseSpec.m */; };
9FA0D00F22DF0B90009CF344 /* SDLDeleteWindowSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FA0D00E22DF0B90009CF344 /* SDLDeleteWindowSpec.m */; };
9FA0D01222DF0BAC009CF344 /* SDLDeleteWindowResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FA0D01122DF0BAC009CF344 /* SDLDeleteWindowResponseSpec.m */; };
+ B30508FE2511E5EF008C5401 /* SDLStreamingVideoDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B30508FD2511E5EE008C5401 /* SDLStreamingVideoDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B30509012511E60E008C5401 /* SDLVideoStreamingRange.h in Headers */ = {isa = PBXBuildFile; fileRef = B30508FF2511E60D008C5401 /* SDLVideoStreamingRange.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B30509022511E60E008C5401 /* SDLVideoStreamingRange.m in Sources */ = {isa = PBXBuildFile; fileRef = B30509002511E60D008C5401 /* SDLVideoStreamingRange.m */; };
+ B30509052511E79B008C5401 /* ProxyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B30509042511E79B008C5401 /* ProxyManager.m */; };
+ B360F9D0255EFEFD0027CA17 /* SDLClimateData.m in Sources */ = {isa = PBXBuildFile; fileRef = B360F9CE255EFEFD0027CA17 /* SDLClimateData.m */; };
+ B360F9D1255EFEFD0027CA17 /* SDLClimateData.h in Headers */ = {isa = PBXBuildFile; fileRef = B360F9CF255EFEFD0027CA17 /* SDLClimateData.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B360F9DE255F52A50027CA17 /* SDLSeatStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B360F9DC255F52A40027CA17 /* SDLSeatStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B360F9DF255F52A50027CA17 /* SDLSeatStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B360F9DD255F52A40027CA17 /* SDLSeatStatus.m */; };
+ B360F9E4255F52BA0027CA17 /* SDLSeatOccupancy.m in Sources */ = {isa = PBXBuildFile; fileRef = B360F9E2255F52B90027CA17 /* SDLSeatOccupancy.m */; };
+ B360F9E5255F52BA0027CA17 /* SDLSeatOccupancy.h in Headers */ = {isa = PBXBuildFile; fileRef = B360F9E3255F52B90027CA17 /* SDLSeatOccupancy.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B38389D6257C187500420C11 /* SDLSeatOccupancySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38389D4257C187400420C11 /* SDLSeatOccupancySpec.m */; };
+ B38389D7257C187500420C11 /* SDLSeatStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38389D5257C187500420C11 /* SDLSeatStatusSpec.m */; };
+ B3838A01257C47FD00420C11 /* SDLDoorStatusTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */; };
+ B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */; };
+ B3838A0F257C4EE100420C11 /* SDLGateStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */; };
+ B3838A15257C4EFD00420C11 /* SDLRoofStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */; };
+ B3838A20257C5BB000420C11 /* SDLRoofStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A21257C5BB000420C11 /* SDLRoofStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */; };
+ B3838A28257C5CE600420C11 /* SDLDoorStatusType.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A29257C5CE600420C11 /* SDLDoorStatusType.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */; };
+ B3838A30257C5D1B00420C11 /* SDLGateStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */; };
+ B3838A31257C5D1B00420C11 /* SDLGateStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A3A257C6AB700420C11 /* SDLDoorStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A38257C6AB600420C11 /* SDLDoorStatus.m */; };
+ B3838A3B257C6AB700420C11 /* SDLDoorStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A39257C6AB600420C11 /* SDLDoorStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
B38D8E7E24A118BD00B977D0 /* SDLGearStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E7D24A118BD00B977D0 /* SDLGearStatusSpec.m */; };
B38D8E8024A1E3D000B977D0 /* SDLTransmissionTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E7F24A1E3D000B977D0 /* SDLTransmissionTypeSpec.m */; };
B38D8E8224A1F53500B977D0 /* SDLCapacityUnitSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */; };
+ B3A0BA2925940ED100CC3BDF /* SDLCarWindowSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A0BA212593FE7400CC3BDF /* SDLCarWindowSpec.m */; };
+ B3A0BA2D259600D100CC3BDF /* SDLSupportedStreamingRangeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A0BA2C259600D100CC3BDF /* SDLSupportedStreamingRangeSpec.m */; };
+ B3A3CE9E2522241600A7121D /* SDLAppCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A3CE9D2522241600A7121D /* SDLAppCapabilitySpec.m */; };
+ B3A3CEA025222A2900A7121D /* SDLOnAppCapabilityUpdatedSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A3CE9F25222A2900A7121D /* SDLOnAppCapabilityUpdatedSpec.m */; };
+ B3A9D9E225D2571000CDFD21 /* SDLKeyboardCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9D9E025D2571000CDFD21 /* SDLKeyboardCapabilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9D9E725D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D9E525D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m */; };
+ B3A9D9E825D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9D9E625D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9D9ED25D2586C00CDFD21 /* SDLKeyboardInputMask.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9D9EB25D2586C00CDFD21 /* SDLKeyboardInputMask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9D9EE25D2586C00CDFD21 /* SDLKeyboardInputMask.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D9EC25D2586C00CDFD21 /* SDLKeyboardInputMask.m */; };
+ B3A9DA0425D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DA0325D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m */; };
+ B3A9DA0A25D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DA0925D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m */; };
+ B3A9DA1225D270EA00CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DA1125D270E900CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m */; };
+ B3A9DAFC25D4943E00CDFD21 /* SDLAppCapability.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9DAFA25D4943D00CDFD21 /* SDLAppCapability.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9DAFD25D4943E00CDFD21 /* SDLAppCapability.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DAFB25D4943D00CDFD21 /* SDLAppCapability.m */; };
+ B3A9DB0625D497FB00CDFD21 /* SDLAppCapabilityType.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DB0425D497FB00CDFD21 /* SDLAppCapabilityType.m */; };
+ B3A9DB0725D497FB00CDFD21 /* SDLAppCapabilityType.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9DB0525D497FB00CDFD21 /* SDLAppCapabilityType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9DB0F25D4A30D00CDFD21 /* SDLAppCapabilityTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DB0E25D4A30C00CDFD21 /* SDLAppCapabilityTypeSpec.m */; };
+ B3A9DB1625D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9DB1425D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.h */; };
+ B3A9DB1725D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DB1525D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.m */; };
+ B3A9DB2025D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9DB1E25D4BBB700CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.h */; };
+ B3A9DB2125D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DB1F25D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.m */; };
+ B3A9DB2825D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9DB2625D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9DB2925D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DB2725D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.m */; };
+ B3DF19ED251225300090D7BA /* TestSmartConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF19EB251225300090D7BA /* TestSmartConnectionManager.m */; };
+ B3DF19F0251225770090D7BA /* TestStreamingMediaDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF19EE251225760090D7BA /* TestStreamingMediaDelegate.m */; };
+ B3DF19F3251225AA0090D7BA /* TestSmartConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF19F1251225A90090D7BA /* TestSmartConnection.m */; };
+ B3EC9E6E2579AA010039F3AA /* SDLClimateDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */; };
B3F7918324E062C200DB5CAF /* SDLGetVehicleDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824C1A9BDE8A00906325 /* SDLGetVehicleDataSpec.m */; };
+ C9707D1825DEE786009D00F2 /* NSArray+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = C9707D1625DEE786009D00F2 /* NSArray+Extensions.h */; };
+ C9707D1925DEE786009D00F2 /* NSArray+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C9707D1725DEE786009D00F2 /* NSArray+Extensions.m */; };
+ C9707D3025E0444D009D00F2 /* SDLMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = C9707D2E25E0444D009D00F2 /* SDLMacros.h */; };
+ C9707D3125E0444D009D00F2 /* SDLMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = C9707D2F25E0444D009D00F2 /* SDLMacros.m */; };
+ C975877F257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */; };
+ C9758785257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = C9758784257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m */; };
+ C9DFFE78257ACE0000F7D57A /* SDLSeekStreamingIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = C9DFFE76257ACE0000F7D57A /* SDLSeekStreamingIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C9DFFE79257ACE0000F7D57A /* SDLSeekStreamingIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = C9DFFE77257ACE0000F7D57A /* SDLSeekStreamingIndicator.m */; };
+ C9DFFE7E257AD07E00F7D57A /* SDLSeekIndicatorType.h in Headers */ = {isa = PBXBuildFile; fileRef = C9DFFE7C257AD07E00F7D57A /* SDLSeekIndicatorType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C9DFFE7F257AD07E00F7D57A /* SDLSeekIndicatorType.m in Sources */ = {isa = PBXBuildFile; fileRef = C9DFFE7D257AD07E00F7D57A /* SDLSeekIndicatorType.m */; };
DA4353DF1D271FD10099B8C4 /* CGPointUtilSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353DE1D271FD10099B8C4 /* CGPointUtilSpec.m */; };
DA4353E31D2720A30099B8C4 /* SDLPinchGestureSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353E21D2720A30099B8C4 /* SDLPinchGestureSpec.m */; };
DA4353EA1D2721680099B8C4 /* SDLTouchManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353E71D2721680099B8C4 /* SDLTouchManagerSpec.m */; };
@@ -1762,7 +1839,6 @@
5DA22CBB1D075DE800245F5F /* Nimble.framework in CopyFiles */,
5DA22CBC1D075DE800245F5F /* OCMock.framework in CopyFiles */,
5DA22CBE1D075DE800245F5F /* Quick.framework in CopyFiles */,
- 5D5DBF091D48E3AC00D4F914 /* FBSnapshotTestCase.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2071,11 +2147,14 @@
4A40255F250134CA0080E159 /* SDLStabilityControlsStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLStabilityControlsStatus.h; path = public/SDLStabilityControlsStatus.h; sourceTree = "<group>"; };
4A404C65250BBE11003AB65D /* SDLTextAndGraphicUpdateOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLTextAndGraphicUpdateOperationSpec.m; path = DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m; sourceTree = "<group>"; };
4A404C67250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLTextAndGraphicStateSpec.m; path = DevAPISpecs/SDLTextAndGraphicStateSpec.m; sourceTree = "<group>"; };
+ 4A41430B255F0A090039C267 /* TestConnectionRequestObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestConnectionRequestObject.h; sourceTree = "<group>"; };
+ 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestConnectionRequestObject.m; sourceTree = "<group>"; };
4A457DC224A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleRPCAdapterSpec.m; path = DevAPISpecs/SDLLifecycleRPCAdapterSpec.m; sourceTree = "<group>"; };
4A457DD224A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleSyncPDataHandlerSpec.m; path = DevAPISpecs/SDLLifecycleSyncPDataHandlerSpec.m; sourceTree = "<group>"; };
4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleMobileHMIStateHandlerSpec.m; path = DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m; sourceTree = "<group>"; };
4A457DD624A3CCED00386CBA /* SDLLifecycleSystemRequestHandlerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleSystemRequestHandlerSpec.m; path = DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m; sourceTree = "<group>"; };
4A457DD824A5137100386CBA /* SDLLifecycleProtocolHandlerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleProtocolHandlerSpec.m; path = DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m; sourceTree = "<group>"; };
+ 4A5822C125E40BB5002822F1 /* NSArray+ExtensionsSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSArray+ExtensionsSpec.m"; path = "DevAPISpecs/NSArray+ExtensionsSpec.m"; sourceTree = "<group>"; };
4A680F192513E1F4004A2C31 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = SOURCE_ROOT; };
4A8BD22324F93131000945E3 /* SDLMassageCushionFirmness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLMassageCushionFirmness.h; path = public/SDLMassageCushionFirmness.h; sourceTree = "<group>"; };
4A8BD22424F93131000945E3 /* SDLMediaServiceData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLMediaServiceData.m; path = public/SDLMediaServiceData.m; sourceTree = "<group>"; };
@@ -2291,6 +2370,9 @@
4A8BD3CC24F999BE000945E3 /* TestSubscribeButtonObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSubscribeButtonObserver.m; sourceTree = "<group>"; };
4A8BD3CE24FE7CF1000945E3 /* SDLPermissionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPermissionManager.h; path = public/SDLPermissionManager.h; sourceTree = "<group>"; };
4A8BD3CF24FE7CF1000945E3 /* SDLPermissionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPermissionManager.m; path = public/SDLPermissionManager.m; sourceTree = "<group>"; };
+ 4AAB6A1025E57BEA0017A5A7 /* SDLSystemInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSystemInfo.h; path = public/SDLSystemInfo.h; sourceTree = "<group>"; };
+ 4AAB6A1125E57BEA0017A5A7 /* SDLSystemInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSystemInfo.m; path = public/SDLSystemInfo.m; sourceTree = "<group>"; };
+ 4AAB6A2225E69D010017A5A7 /* SDLSystemInfoSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSystemInfoSpec.m; path = DevAPISpecs/SDLSystemInfoSpec.m; sourceTree = "<group>"; };
4ABB24B224F592620061BF55 /* NSMutableArray+Safe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+Safe.h"; path = "private/NSMutableArray+Safe.h"; sourceTree = "<group>"; };
4ABB24B324F592620061BF55 /* NSMutableArray+Safe.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+Safe.m"; path = "private/NSMutableArray+Safe.m"; sourceTree = "<group>"; };
4ABB24B424F592620061BF55 /* NSBundle+SDLBundle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+SDLBundle.m"; path = "private/NSBundle+SDLBundle.m"; sourceTree = "<group>"; };
@@ -3166,6 +3248,9 @@
4ABB2B9924F850AD0061BF55 /* SDLImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLImage.h; path = public/SDLImage.h; sourceTree = "<group>"; };
4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLightState.m; path = public/SDLLightState.m; sourceTree = "<group>"; };
4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLImageResolution.h; path = public/SDLImageResolution.h; sourceTree = "<group>"; };
+ 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperation.m; path = private/SDLVoiceCommandUpdateOperation.m; sourceTree = "<group>"; };
+ 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLVoiceCommandUpdateOperation.h; path = private/SDLVoiceCommandUpdateOperation.h; sourceTree = "<group>"; };
+ 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperationSpec.m; path = DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m; sourceTree = "<group>"; };
4AE8A7012537796E000666C0 /* SmartDeviceLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmartDeviceLink.h; path = public/SmartDeviceLink.h; sourceTree = "<group>"; };
4AE8A707253779F9000666C0 /* EAAccessory+OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "EAAccessory+OCMock.h"; sourceTree = "<group>"; };
5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityTypeSpec.m; sourceTree = "<group>"; };
@@ -3192,11 +3277,9 @@
5D1FF29321304513000EB9B4 /* PerformInteractionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PerformInteractionManager.h; path = "Example Apps/Example ObjC/PerformInteractionManager.h"; sourceTree = SOURCE_ROOT; };
5D1FF29421304513000EB9B4 /* MenuManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuManager.m; path = "Example Apps/Example ObjC/MenuManager.m"; sourceTree = SOURCE_ROOT; };
5D1FF29521304514000EB9B4 /* ButtonManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ButtonManager.h; path = "Example Apps/Example ObjC/ButtonManager.h"; sourceTree = SOURCE_ROOT; };
- 5D1FF29621304514000EB9B4 /* ProxyManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProxyManager.m; path = "Example Apps/Example ObjC/ProxyManager.m"; sourceTree = SOURCE_ROOT; };
5D1FF29721304514000EB9B4 /* AudioManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AudioManager.m; path = "Example Apps/Example ObjC/AudioManager.m"; sourceTree = SOURCE_ROOT; };
5D1FF29821304514000EB9B4 /* RPCPermissionsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RPCPermissionsManager.h; path = "Example Apps/Example ObjC/RPCPermissionsManager.h"; sourceTree = SOURCE_ROOT; };
5D1FF29921304514000EB9B4 /* VehicleDataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VehicleDataManager.m; path = "Example Apps/Example ObjC/VehicleDataManager.m"; sourceTree = SOURCE_ROOT; };
- 5D1FF29A21304514000EB9B4 /* ProxyManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProxyManager.h; path = "Example Apps/Example ObjC/ProxyManager.h"; sourceTree = SOURCE_ROOT; };
5D1FF29B21304515000EB9B4 /* ButtonManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ButtonManager.m; path = "Example Apps/Example ObjC/ButtonManager.m"; sourceTree = SOURCE_ROOT; };
5D1FF2A321304530000EB9B4 /* Preferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Preferences.h; path = "Example Apps/Example ObjC/Preferences.h"; sourceTree = SOURCE_ROOT; };
5D1FF2A421304531000EB9B4 /* Preferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Preferences.m; path = "Example Apps/Example ObjC/Preferences.m"; sourceTree = SOURCE_ROOT; };
@@ -3256,8 +3339,6 @@
5D4346721E6F617D00B639C6 /* TestLogTarget.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestLogTarget.m; path = LoggingSpecs/TestLogTarget.m; sourceTree = "<group>"; };
5D4346851E771B5700B639C6 /* SDLLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SDLLog.swift; sourceTree = "<group>"; };
5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenStatusManagerSpec.m; path = ProxySpecs/SDLLockScreenStatusManagerSpec.m; sourceTree = "<group>"; };
- 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSnapshotTestCase.framework; path = sdl_ios/Carthage/Build/iOS/FBSnapshotTestCase.framework; sourceTree = "<group>"; };
- 5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenViewControllerSnapshotTests.m; path = DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m; sourceTree = "<group>"; };
5D6035D0202CD46200A429C9 /* SDLSpecUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSpecUtilities.h; path = TestUtilities/SDLSpecUtilities.h; sourceTree = "<group>"; };
5D6035D1202CD46200A429C9 /* SDLSpecUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSpecUtilities.m; path = TestUtilities/SDLSpecUtilities.m; sourceTree = "<group>"; };
5D6035D3202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TestMultipleRequestsConnectionManager.h; path = TestUtilities/TestMultipleRequestsConnectionManager.h; sourceTree = "<group>"; };
@@ -3389,6 +3470,11 @@
880E35B72088F78E00181259 /* SDLSystemCapabilityManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityManagerSpec.m; sourceTree = "<group>"; };
8816772822208B82001FACFF /* SDLNavigationInstructionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLNavigationInstructionSpec.m; sourceTree = "<group>"; };
8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTurnSignalSpec.m; sourceTree = "<group>"; };
+ 881BBF4E255AC27000761B7E /* SDLAlertView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLAlertView.h; path = public/SDLAlertView.h; sourceTree = "<group>"; };
+ 881BBF4F255AC27000761B7E /* SDLAlertView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLAlertView.m; path = public/SDLAlertView.m; sourceTree = "<group>"; };
+ 881BBF5A255ADB8300761B7E /* SDLAlertViewSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAlertViewSpec.m; sourceTree = "<group>"; };
+ 881BBF5E255B1C1E00761B7E /* SDLAlertManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLAlertManager.h; path = private/SDLAlertManager.h; sourceTree = "<group>"; };
+ 881BBF5F255B1C1E00761B7E /* SDLAlertManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLAlertManager.m; path = private/SDLAlertManager.m; sourceTree = "<group>"; };
881F388C22D904BE00DF6DCE /* SDLCancelInteractionResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCancelInteractionResponseSpec.m; sourceTree = "<group>"; };
88295697207CF68800EF056C /* SDL Example Swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDL Example Swift.app"; sourceTree = BUILT_PRODUCTS_DIR; };
882FAC4C2209D7EF0062385D /* SDLAppServiceDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAppServiceDataSpec.m; sourceTree = "<group>"; };
@@ -3411,6 +3497,8 @@
8855F9EB220CBFB700A5C897 /* SDLGetFileSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLGetFileSpec.m; sourceTree = "<group>"; };
8863747D22D650DE00D2671F /* SDLCloseApplicationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCloseApplicationSpec.m; sourceTree = "<group>"; };
88665B6B220B796A00D9DA77 /* SDLPerformAppServiceInteractionResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLPerformAppServiceInteractionResponseSpec.m; sourceTree = "<group>"; };
+ 886E413C2565D0D200F073B8 /* SDLPresentAlertOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLPresentAlertOperationSpec.m; sourceTree = "<group>"; };
+ 886E41402565D11200F073B8 /* SDLAlertManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAlertManagerSpec.m; sourceTree = "<group>"; };
8877F5EA1F34A3BE00DC128A /* SDLSendHapticDataSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSendHapticDataSpec.m; sourceTree = "<group>"; };
8877F5F01F34AA2D00DC128A /* SDLSendHapticDataResponseSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSendHapticDataResponseSpec.m; sourceTree = "<group>"; };
887BE4D322272B2200B397C2 /* SDLControlFramePayloadConstantsSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLControlFramePayloadConstantsSpec.m; sourceTree = "<group>"; };
@@ -3420,6 +3508,12 @@
8881AFBA2225E7FA00EA870B /* SDLGetCloudAppPropertiesSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLGetCloudAppPropertiesSpec.m; sourceTree = "<group>"; };
8881AFC02225EB9300EA870B /* SDLGetCloudAppPropertiesResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLGetCloudAppPropertiesResponseSpec.m; sourceTree = "<group>"; };
8886EB972111F4FA008294A5 /* SDLFileManagerConfigurationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLFileManagerConfigurationSpec.m; sourceTree = "<group>"; };
+ 8889C2EC2559C7E2004F5966 /* SDLAudioDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAudioDataSpec.m; sourceTree = "<group>"; };
+ 8889C2F22559CFAF004F5966 /* SDLAlertAudioData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLAlertAudioData.h; path = public/SDLAlertAudioData.h; sourceTree = "<group>"; };
+ 8889C2F32559CFAF004F5966 /* SDLAlertAudioData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLAlertAudioData.m; path = public/SDLAlertAudioData.m; sourceTree = "<group>"; };
+ 8889C2FA2559CFE2004F5966 /* SDLAudioData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLAudioData.m; path = public/SDLAudioData.m; sourceTree = "<group>"; };
+ 8889C2FB2559CFE3004F5966 /* SDLAudioData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLAudioData.h; path = public/SDLAudioData.h; sourceTree = "<group>"; };
+ 8889C3042559E109004F5966 /* SDLAlertAudioDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAlertAudioDataSpec.m; sourceTree = "<group>"; };
888F86FF221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAsynchronousRPCOperationSpec.m; sourceTree = "<group>"; };
889D0B9524D065EE008AD494 /* SDLSubtleAlertResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSubtleAlertResponseSpec.m; sourceTree = "<group>"; };
889D0B9724D06E52008AD494 /* SDLSubtleAlertSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSubtleAlertSpec.m; sourceTree = "<group>"; };
@@ -3451,6 +3545,8 @@
88D0E5D524786580009469AB /* SDLSubscribeButtonManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSubscribeButtonManagerSpec.m; sourceTree = "<group>"; };
88D0E5D724786770009469AB /* SDLSubscribeButtonObserverSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSubscribeButtonObserverSpec.m; sourceTree = "<group>"; };
88D2AAE31F682BB20078D5B2 /* SDLLogConstantsSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLogConstantsSpec.m; sourceTree = "<group>"; };
+ 88D79EEB255D8D5B005FACB1 /* SDLPresentAlertOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLPresentAlertOperation.h; path = private/SDLPresentAlertOperation.h; sourceTree = "<group>"; };
+ 88D79EEC255D8D5B005FACB1 /* SDLPresentAlertOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPresentAlertOperation.m; path = private/SDLPresentAlertOperation.m; sourceTree = "<group>"; };
88DDD0F8229ECA57002F9623 /* SDLIAPConstantsSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPConstantsSpec.m; sourceTree = "<group>"; };
88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "EAAccessory+OCMock.m"; sourceTree = "<group>"; };
88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPSessionSpec.m; sourceTree = "<group>"; };
@@ -3486,10 +3582,76 @@
9FA0D00B22DF0B65009CF344 /* SDLCreateWindowResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCreateWindowResponseSpec.m; sourceTree = "<group>"; };
9FA0D00E22DF0B90009CF344 /* SDLDeleteWindowSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLDeleteWindowSpec.m; sourceTree = "<group>"; };
9FA0D01122DF0BAC009CF344 /* SDLDeleteWindowResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLDeleteWindowResponseSpec.m; sourceTree = "<group>"; };
+ B30508FD2511E5EE008C5401 /* SDLStreamingVideoDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLStreamingVideoDelegate.h; path = public/SDLStreamingVideoDelegate.h; sourceTree = "<group>"; };
+ B30508FF2511E60D008C5401 /* SDLVideoStreamingRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLVideoStreamingRange.h; path = public/SDLVideoStreamingRange.h; sourceTree = "<group>"; };
+ B30509002511E60D008C5401 /* SDLVideoStreamingRange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLVideoStreamingRange.m; path = public/SDLVideoStreamingRange.m; sourceTree = "<group>"; };
+ B30509032511E79A008C5401 /* ProxyManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProxyManager.h; path = "Example Apps/Example ObjC/ProxyManager.h"; sourceTree = SOURCE_ROOT; };
+ B30509042511E79B008C5401 /* ProxyManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProxyManager.m; path = "Example Apps/Example ObjC/ProxyManager.m"; sourceTree = SOURCE_ROOT; };
+ B360F9CE255EFEFD0027CA17 /* SDLClimateData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLClimateData.m; path = public/SDLClimateData.m; sourceTree = "<group>"; };
+ B360F9CF255EFEFD0027CA17 /* SDLClimateData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLClimateData.h; path = public/SDLClimateData.h; sourceTree = "<group>"; };
+ B360F9DC255F52A40027CA17 /* SDLSeatStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLSeatStatus.h; path = public/SDLSeatStatus.h; sourceTree = "<group>"; };
+ B360F9DD255F52A40027CA17 /* SDLSeatStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSeatStatus.m; path = public/SDLSeatStatus.m; sourceTree = "<group>"; };
+ B360F9E2255F52B90027CA17 /* SDLSeatOccupancy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSeatOccupancy.m; path = public/SDLSeatOccupancy.m; sourceTree = "<group>"; };
+ B360F9E3255F52B90027CA17 /* SDLSeatOccupancy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLSeatOccupancy.h; path = public/SDLSeatOccupancy.h; sourceTree = "<group>"; };
+ B38389D4257C187400420C11 /* SDLSeatOccupancySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSeatOccupancySpec.m; path = SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatOccupancySpec.m; sourceTree = SOURCE_ROOT; };
+ B38389D5257C187500420C11 /* SDLSeatStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSeatStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDoorStatusTypeSpec.m; sourceTree = "<group>"; };
+ B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGateStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRoofStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLRoofStatus.h; path = public/SDLRoofStatus.h; sourceTree = "<group>"; };
+ B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRoofStatus.m; path = public/SDLRoofStatus.m; sourceTree = "<group>"; };
+ B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDoorStatusType.h; path = public/SDLDoorStatusType.h; sourceTree = "<group>"; };
+ B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatusType.m; path = public/SDLDoorStatusType.m; sourceTree = "<group>"; };
+ B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGateStatus.m; path = public/SDLGateStatus.m; sourceTree = "<group>"; };
+ B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLGateStatus.h; path = public/SDLGateStatus.h; sourceTree = "<group>"; };
+ B3838A38257C6AB600420C11 /* SDLDoorStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatus.m; path = public/SDLDoorStatus.m; sourceTree = "<group>"; };
+ B3838A39257C6AB600420C11 /* SDLDoorStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDoorStatus.h; path = public/SDLDoorStatus.h; sourceTree = "<group>"; };
B38D8E7D24A118BD00B977D0 /* SDLGearStatusSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLGearStatusSpec.m; sourceTree = "<group>"; };
B38D8E7F24A1E3D000B977D0 /* SDLTransmissionTypeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTransmissionTypeSpec.m; sourceTree = "<group>"; };
B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCapacityUnitSpec.m; sourceTree = "<group>"; };
+ B3A0BA212593FE7400CC3BDF /* SDLCarWindowSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCarWindowSpec.m; sourceTree = "<group>"; };
+ B3A0BA2C259600D100CC3BDF /* SDLSupportedStreamingRangeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSupportedStreamingRangeSpec.m; sourceTree = "<group>"; };
+ B3A3CE9D2522241600A7121D /* SDLAppCapabilitySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppCapabilitySpec.m; sourceTree = "<group>"; };
+ B3A3CE9F25222A2900A7121D /* SDLOnAppCapabilityUpdatedSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLOnAppCapabilityUpdatedSpec.m; sourceTree = "<group>"; };
+ B3A9D9DF25D2571000CDFD21 /* SDLKeyboardCapabilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLKeyboardCapabilities.m; path = public/SDLKeyboardCapabilities.m; sourceTree = "<group>"; };
+ B3A9D9E025D2571000CDFD21 /* SDLKeyboardCapabilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLKeyboardCapabilities.h; path = public/SDLKeyboardCapabilities.h; sourceTree = "<group>"; };
+ B3A9D9E525D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLKeyboardLayoutCapability.m; path = public/SDLKeyboardLayoutCapability.m; sourceTree = "<group>"; };
+ B3A9D9E625D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLKeyboardLayoutCapability.h; path = public/SDLKeyboardLayoutCapability.h; sourceTree = "<group>"; };
+ B3A9D9EB25D2586C00CDFD21 /* SDLKeyboardInputMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLKeyboardInputMask.h; path = public/SDLKeyboardInputMask.h; sourceTree = "<group>"; };
+ B3A9D9EC25D2586C00CDFD21 /* SDLKeyboardInputMask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLKeyboardInputMask.m; path = public/SDLKeyboardInputMask.m; sourceTree = "<group>"; };
+ B3A9DA0325D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLKeyboardInputMaskSpec.m; sourceTree = "<group>"; };
+ B3A9DA0925D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLKeyboardCapabilitiesSpec.m; sourceTree = "<group>"; };
+ B3A9DA1125D270E900CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLKeyboardLayoutCapabilitySpec.m; sourceTree = "<group>"; };
+ B3A9DAFA25D4943D00CDFD21 /* SDLAppCapability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLAppCapability.h; path = public/SDLAppCapability.h; sourceTree = "<group>"; };
+ B3A9DAFB25D4943D00CDFD21 /* SDLAppCapability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLAppCapability.m; path = public/SDLAppCapability.m; sourceTree = "<group>"; };
+ B3A9DB0425D497FB00CDFD21 /* SDLAppCapabilityType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLAppCapabilityType.m; path = public/SDLAppCapabilityType.m; sourceTree = "<group>"; };
+ B3A9DB0525D497FB00CDFD21 /* SDLAppCapabilityType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLAppCapabilityType.h; path = public/SDLAppCapabilityType.h; sourceTree = "<group>"; };
+ B3A9DB0E25D4A30C00CDFD21 /* SDLAppCapabilityTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppCapabilityTypeSpec.m; sourceTree = "<group>"; };
+ B3A9DB1425D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SDLImageResolution+StreamingVideoExtensions.h"; path = "private/SDLImageResolution+StreamingVideoExtensions.h"; sourceTree = "<group>"; };
+ B3A9DB1525D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SDLImageResolution+StreamingVideoExtensions.m"; path = "private/SDLImageResolution+StreamingVideoExtensions.m"; sourceTree = "<group>"; };
+ B3A9DB1E25D4BBB700CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SDLVideoStreamingCapability+StreamingVideoExtensions.h"; path = "private/SDLVideoStreamingCapability+StreamingVideoExtensions.h"; sourceTree = "<group>"; };
+ B3A9DB1F25D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SDLVideoStreamingCapability+StreamingVideoExtensions.m"; path = "private/SDLVideoStreamingCapability+StreamingVideoExtensions.m"; sourceTree = "<group>"; };
+ B3A9DB2625D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLOnAppCapabilityUpdated.h; path = public/SDLOnAppCapabilityUpdated.h; sourceTree = "<group>"; };
+ B3A9DB2725D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLOnAppCapabilityUpdated.m; path = public/SDLOnAppCapabilityUpdated.m; sourceTree = "<group>"; };
+ B3DF19EB251225300090D7BA /* TestSmartConnectionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSmartConnectionManager.m; sourceTree = "<group>"; };
+ B3DF19EC251225300090D7BA /* TestSmartConnectionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSmartConnectionManager.h; sourceTree = "<group>"; };
+ B3DF19EE251225760090D7BA /* TestStreamingMediaDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestStreamingMediaDelegate.m; sourceTree = "<group>"; };
+ B3DF19EF251225760090D7BA /* TestStreamingMediaDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestStreamingMediaDelegate.h; sourceTree = "<group>"; };
+ B3DF19F1251225A90090D7BA /* TestSmartConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSmartConnection.m; sourceTree = "<group>"; };
+ B3DF19F2251225A90090D7BA /* TestSmartConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSmartConnection.h; sourceTree = "<group>"; };
+ B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLClimateDataSpec.m; sourceTree = "<group>"; };
BB3C600D221AEF37007DD4CA /* NSMutableDictionary+StoreSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSMutableDictionary+StoreSpec.m"; path = "DevAPISpecs/NSMutableDictionary+StoreSpec.m"; sourceTree = "<group>"; };
+ C9707D1625DEE786009D00F2 /* NSArray+Extensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "NSArray+Extensions.h"; path = "private/NSArray+Extensions.h"; sourceTree = "<group>"; };
+ C9707D1725DEE786009D00F2 /* NSArray+Extensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Extensions.m"; path = "private/NSArray+Extensions.m"; sourceTree = "<group>"; };
+ C9707D2E25E0444D009D00F2 /* SDLMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMacros.h; path = private/SDLMacros.h; sourceTree = "<group>"; };
+ C9707D2F25E0444D009D00F2 /* SDLMacros.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMacros.m; path = private/SDLMacros.m; sourceTree = "<group>"; };
+ C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeekIndicatorTypeSpec.m; sourceTree = "<group>"; };
+ C9758784257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeekStreamingIndicatorSpec.m; sourceTree = "<group>"; };
+ C9DFFE76257ACE0000F7D57A /* SDLSeekStreamingIndicator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSeekStreamingIndicator.h; path = public/SDLSeekStreamingIndicator.h; sourceTree = "<group>"; };
+ C9DFFE77257ACE0000F7D57A /* SDLSeekStreamingIndicator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSeekStreamingIndicator.m; path = public/SDLSeekStreamingIndicator.m; sourceTree = "<group>"; };
+ C9DFFE7C257AD07E00F7D57A /* SDLSeekIndicatorType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSeekIndicatorType.h; path = public/SDLSeekIndicatorType.h; sourceTree = "<group>"; };
+ C9DFFE7D257AD07E00F7D57A /* SDLSeekIndicatorType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSeekIndicatorType.m; path = public/SDLSeekIndicatorType.m; sourceTree = "<group>"; };
DA4353DE1D271FD10099B8C4 /* CGPointUtilSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CGPointUtilSpec.m; path = UtilitiesSpecs/Touches/CGPointUtilSpec.m; sourceTree = "<group>"; };
DA4353E21D2720A30099B8C4 /* SDLPinchGestureSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPinchGestureSpec.m; path = UtilitiesSpecs/Touches/SDLPinchGestureSpec.m; sourceTree = "<group>"; };
DA4353E71D2721680099B8C4 /* SDLTouchManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLTouchManagerSpec.m; path = UtilitiesSpecs/Touches/SDLTouchManagerSpec.m; sourceTree = "<group>"; };
@@ -3543,7 +3705,6 @@
167ED93C1A9BCB8A00797BE5 /* SmartDeviceLink.framework in Frameworks */,
5DA22CB81D075CF200245F5F /* OCMock.framework in Frameworks */,
5DA22CBA1D075CF200245F5F /* Quick.framework in Frameworks */,
- 5D5DBF081D48E39C00D4F914 /* FBSnapshotTestCase.framework in Frameworks */,
5DA22CB71D075CF200245F5F /* Nimble.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -3659,6 +3820,7 @@
isa = PBXGroup;
children = (
162E81E21A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m */,
+ B3A9DB0E25D4A30C00CDFD21 /* SDLAppCapabilityTypeSpec.m */,
162E81E31A9BDE8A00906325 /* SDLAppHMITypeSpec.m */,
162E81E41A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m */,
8831FA3E2202227000B8FFB7 /* SDLAppServiceTypeSpec.m */,
@@ -3681,6 +3843,7 @@
162E81F11A9BDE8A00906325 /* SDLDisplayTypeSpec.m */,
1EAA475D2035B177000FE74B /* SDLDisplayModeSpec.m */,
1EAA47612035B1AE000FE74B /* SDLDistanceUnitSpec.m */,
+ B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */,
162E81F21A9BDE8A00906325 /* SDLDriverDistractionStateSpec.m */,
162E81F31A9BDE8A00906325 /* SDLECallConfirmationStatusSpec.m */,
5DD8406420FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m */,
@@ -3698,6 +3861,7 @@
162E81FD1A9BDE8A00906325 /* SDLImageTypeSpec.m */,
162E81FE1A9BDE8A00906325 /* SDLInteractionModeSpec.m */,
162E81FF1A9BDE8A00906325 /* SDLKeyboardEventSpec.m */,
+ B3A9DA0325D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m */,
162E82001A9BDE8A00906325 /* SDLKeyboardLayoutSpec.m */,
162E82011A9BDE8A00906325 /* SDLKeypressModeSpec.m */,
162E82021A9BDE8A00906325 /* SDLLanguageSpec.m */,
@@ -3728,6 +3892,7 @@
162E820F1A9BDE8A00906325 /* SDLResultSpec.m */,
162E82111A9BDE8A00906325 /* SDLSamplingRateSpec.m */,
8831FA3C220207DA00B8FFB7 /* SDLServiceUpdateReasonSpec.m */,
+ C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */,
162E82121A9BDE8A00906325 /* SDLSoftButtonTypeSpec.m */,
162E82131A9BDE8A00906325 /* SDLSpeechCapabilitiesSpec.m */,
1EB59CCF202DC9F200343A61 /* SDLSupportedSeatSpec.m */,
@@ -3768,6 +3933,7 @@
162E82281A9BDE8A00906325 /* NotificationSpecs */ = {
isa = PBXGroup;
children = (
+ B3A3CE9F25222A2900A7121D /* SDLOnAppCapabilityUpdatedSpec.m */,
162E82291A9BDE8A00906325 /* SDLOnAppInterfaceUnregisteredSpec.m */,
8855F9E5220CB60700A5C897 /* SDLOnAppServiceDataSpec.m */,
162E822A1A9BDE8A00906325 /* SDLOnAudioPassThruSpec.m */,
@@ -3952,6 +4118,7 @@
children = (
162E828F1A9BDE8A00906325 /* SDLAirbagStatusSpec.m */,
DA96C0651D4D4F730022F520 /* SDLAppInfoSpec.m */,
+ B3A3CE9D2522241600A7121D /* SDLAppCapabilitySpec.m */,
8831FA4A2202402B00B8FFB7 /* SDLAppServicesCapabilitiesSpec.m */,
8831FA442202307500B8FFB7 /* SDLAppServiceCapabilitySpec.m */,
882FAC4C2209D7EF0062385D /* SDLAppServiceDataSpec.m */,
@@ -3966,6 +4133,7 @@
162E82941A9BDE8A00906325 /* SDLChoiceSpec.m */,
1EE8C43F1F348D3200FDC2CF /* SDLClimateControlCapabilitiesSpec.m */,
1EE8C4431F34A1B900FDC2CF /* SDLClimateControlDataSpec.m */,
+ B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */,
885468372225CBA400994D8D /* SDLCloudAppPropertiesSpec.m */,
162E82951A9BDE8A00906325 /* SDLClusterModeStatusSpec.m */,
DA9F7EB31DCC086400ACAE48 /* SDLDateTimeSpec.m */,
@@ -3974,11 +4142,13 @@
162E82981A9BDE8A00906325 /* SDLDIDResult.m */,
9FA0D00522DF06D3009CF344 /* SDLDisplayCapabilitySpec.m */,
162E82991A9BDE8A00906325 /* SDLDisplayCapabilitiesSpec.m */,
+ B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */,
4A1B036E24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m */,
162E829A1A9BDE8A00906325 /* SDLECallInfoSpec.m */,
162E829B1A9BDE8A00906325 /* SDLEmergencyEventSpec.m */,
88B3BFA120DA911E00943565 /* SDLFuelRangeSpec.m */,
1EAA47752036B847000FE74B /* SDLEqualizerSettingsSpec.m */,
+ B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */,
B38D8E7D24A118BD00B977D0 /* SDLGearStatusSpec.m */,
162E829C1A9BDE8A00906325 /* SDLGPSDataSpec.m */,
88EED83A1F33BECB00E6C42E /* SDLHapticRectSpec.m */,
@@ -3990,6 +4160,8 @@
162E829F1A9BDE8A00906325 /* SDLImageFieldSpec.m */,
5DB202261F5F2D030061D189 /* SDLImageResolutionSpec.m */,
162E82A01A9BDE8A00906325 /* SDLImageSpec.m */,
+ B3A9DA0925D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m */,
+ B3A9DA1125D270E900CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m */,
162E82A11A9BDE8A00906325 /* SDLKeyboardPropertiesSpec.m */,
1EAA476B2036A52F000FE74B /* SDLLightCapabilitiesSpec.m */,
1EAA476920369ECC000FE74B /* SDLLightControlCapabilitiesSpec.m */,
@@ -4020,10 +4192,14 @@
1EE8C44F1F38629200FDC2CF /* SDLRemoteControlCapabilitiesSpec.m */,
5DADA7771F4E059E0084D17D /* SDLRectangleSpec.m */,
5D92934F20AF526200FCC775 /* SDLRGBColorSpec.m */,
+ B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */,
162E82A71A9BDE8A00906325 /* SDLScreenParamsSpec.m */,
+ B38389D4257C187400420C11 /* SDLSeatOccupancySpec.m */,
+ B38389D5257C187500420C11 /* SDLSeatStatusSpec.m */,
1E89B0E1203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m */,
1E89B0DD2031636000A47992 /* SDLSeatControlDataSpec.m */,
1EB59CD9202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m */,
+ C9758784257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m */,
162E82A81A9BDE8A00906325 /* SDLSingleTireStatusSpec.m */,
1EAA47792036BD46000FE74B /* SDLSISDataSpec.m */,
162E82A91A9BDE8A00906325 /* SDLSoftButtonCapabilitiesSpec.m */,
@@ -4073,7 +4249,6 @@
167ED9231A9BB86300797BE5 /* Libraries */ = {
isa = PBXGroup;
children = (
- 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */,
5DA22CB31D075CF200245F5F /* Nimble.framework */,
5DA22CB41D075CF200245F5F /* OCMock.framework */,
5DA22CB61D075CF200245F5F /* Quick.framework */,
@@ -4118,6 +4293,47 @@
path = MessageSpecs;
sourceTree = "<group>";
};
+ 4A32B3E425559D93001FFA26 /* Voice Cammands */ = {
+ isa = PBXGroup;
+ children = (
+ 4A32B3E525559DA4001FFA26 /* Cells */,
+ 4A32B3E625559DAC001FFA26 /* Operations */,
+ 4ABB25A824F7E6E10061BF55 /* SDLVoiceCommandManager.h */,
+ 4ABB25A724F7E6E10061BF55 /* SDLVoiceCommandManager.m */,
+ );
+ name = "Voice Cammands";
+ sourceTree = "<group>";
+ };
+ 4A32B3E525559DA4001FFA26 /* Cells */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABB259124F7E6820061BF55 /* SDLVoiceCommand.h */,
+ 4ABB259024F7E6820061BF55 /* SDLVoiceCommand.m */,
+ );
+ name = Cells;
+ sourceTree = "<group>";
+ };
+ 4A32B3E625559DAC001FFA26 /* Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */,
+ 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */,
+ );
+ name = Operations;
+ sourceTree = "<group>";
+ };
+ 4A32B3F325559F37001FFA26 /* Menu */ = {
+ isa = PBXGroup;
+ children = (
+ 5D76751022D907F500E8D71A /* Configuration */,
+ 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */,
+ 5D339CEC207C08AB000CC364 /* Cells */,
+ 4ABB25A924F7E6E10061BF55 /* SDLMenuManager.h */,
+ 4ABB25A624F7E6E10061BF55 /* SDLMenuManager.m */,
+ );
+ name = Menu;
+ sourceTree = "<group>";
+ };
4A3BA4D9248E8EBB003E56B8 /* SystemRequest Handler */ = {
isa = PBXGroup;
children = (
@@ -4211,6 +4427,25 @@
name = "Status Manager";
sourceTree = "<group>";
};
+ 4AAB6A0F25E57B2D0017A5A7 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 4AAB6A1025E57BEA0017A5A7 /* SDLSystemInfo.h */,
+ 4AAB6A1125E57BEA0017A5A7 /* SDLSystemInfo.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 4AD1F16A2559952D00637FE1 /* Voice Command */ = {
+ isa = PBXGroup;
+ children = (
+ 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */,
+ 5DAB5F5220989A8300A020C8 /* SDLVoiceCommandSpec.m */,
+ 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */,
+ );
+ name = "Voice Command";
+ sourceTree = "<group>";
+ };
5D0218EB1A8E795700D1BF62 /* UI */ = {
isa = PBXGroup;
children = (
@@ -4251,6 +4486,7 @@
5D0A736F203F0C450001595D /* Screen */ = {
isa = PBXGroup;
children = (
+ 8889C2E12559AE6C004F5966 /* Alert */,
5D92935720B33D3C00FCC775 /* Choice Set */,
5D339CE5207C0651000CC364 /* Menu */,
5D0A737F203F23D10001595D /* Soft Button */,
@@ -4316,16 +4552,17 @@
5D1654541D3E753100554D93 /* Lifecycle */ = {
isa = PBXGroup;
children = (
- 5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */,
888F86FF221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m */,
5D60DF23202B7A80001EDA01 /* SDLAsynchronousRPCRequestOperationSpec.m */,
- 5D60DF25202B7A97001EDA01 /* SDLSequentialRPCRequestOperationSpec.m */,
88A1CF1D21669AC7001ACC75 /* SDLLifecycleConfigurationUpdateSpec.m */,
+ 5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */,
+ 4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */,
4A457DC224A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m */,
4A457DD224A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m */,
- 4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */,
4A457DD624A3CCED00386CBA /* SDLLifecycleSystemRequestHandlerSpec.m */,
4A457DD824A5137100386CBA /* SDLLifecycleProtocolHandlerSpec.m */,
+ 5D60DF25202B7A97001EDA01 /* SDLSequentialRPCRequestOperationSpec.m */,
+ 4AAB6A2225E69D010017A5A7 /* SDLSystemInfoSpec.m */,
);
name = Lifecycle;
sourceTree = "<group>";
@@ -4338,6 +4575,7 @@
4A3BA4E324900962003E56B8 /* Custom RPC Handlers */,
4A3BA4E9249147E6003E56B8 /* Protocol Delegate Handler */,
5D07C0342044AD1900D1ECDC /* Request Operations */,
+ 4AAB6A0F25E57B2D0017A5A7 /* Utilities */,
4ABB253924F7E46A0061BF55 /* SDLLifecycleManager.h */,
4ABB253824F7E46A0061BF55 /* SDLLifecycleManager.m */,
);
@@ -4347,10 +4585,13 @@
5D1BF6AA2047429C00D36881 /* Utilities */ = {
isa = PBXGroup;
children = (
+ 8889C2E22559AE82004F5966 /* Audio */,
4ABB25D024F7E7630061BF55 /* SDLImageField+ScreenManagerExtensions.h */,
4ABB25D124F7E7630061BF55 /* SDLImageField+ScreenManagerExtensions.m */,
4ABB25D224F7E7630061BF55 /* SDLTextField+ScreenManagerExtensions.h */,
4ABB25CF24F7E7630061BF55 /* SDLTextField+ScreenManagerExtensions.m */,
+ B3A9DB1E25D4BBB700CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.h */,
+ B3A9DB1F25D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.m */,
4ABB25D324F7E7630061BF55 /* SDLWindowCapability+ScreenManagerExtensions.h */,
4ABB25CE24F7E7630061BF55 /* SDLWindowCapability+ScreenManagerExtensions.m */,
);
@@ -4382,13 +4623,8 @@
5D339CE5207C0651000CC364 /* Menu */ = {
isa = PBXGroup;
children = (
- 5D76751022D907F500E8D71A /* Configuration */,
- 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */,
- 5D339CEC207C08AB000CC364 /* Cells */,
- 4ABB25A924F7E6E10061BF55 /* SDLMenuManager.h */,
- 4ABB25A624F7E6E10061BF55 /* SDLMenuManager.m */,
- 4ABB25A824F7E6E10061BF55 /* SDLVoiceCommandManager.h */,
- 4ABB25A724F7E6E10061BF55 /* SDLVoiceCommandManager.m */,
+ 4A32B3F325559F37001FFA26 /* Menu */,
+ 4A32B3E425559D93001FFA26 /* Voice Cammands */,
);
name = Menu;
sourceTree = "<group>";
@@ -4398,8 +4634,6 @@
children = (
4ABB259424F7E6880061BF55 /* SDLMenuCell.h */,
4ABB259524F7E6880061BF55 /* SDLMenuCell.m */,
- 4ABB259124F7E6820061BF55 /* SDLVoiceCommand.h */,
- 4ABB259024F7E6820061BF55 /* SDLVoiceCommand.m */,
);
name = Cells;
sourceTree = "<group>";
@@ -4440,9 +4674,10 @@
children = (
5D4019B11A76EC350006B0C2 /* Examples */,
5D61FA1D1A84237100846EE7 /* SmartDeviceLink */,
- 5D61FA2C1A84237100846EE7 /* SmartDeviceLinkTests */,
5D4346621E6F38E600B639C6 /* SmartDeviceLinkSwift */,
+ 5D61FA2C1A84237100846EE7 /* SmartDeviceLinkTests */,
5D4019B01A76EC350006B0C2 /* Products */,
+ B3476E18247437460025DC99 /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -4581,10 +4816,10 @@
5D1FF29421304513000EB9B4 /* MenuManager.m */,
5D1FF29321304513000EB9B4 /* PerformInteractionManager.h */,
5D1FF29121304513000EB9B4 /* PerformInteractionManager.m */,
- 5D1FF29A21304514000EB9B4 /* ProxyManager.h */,
- 5D1FF29621304514000EB9B4 /* ProxyManager.m */,
5D1FF29821304514000EB9B4 /* RPCPermissionsManager.h */,
5D1FF29221304513000EB9B4 /* RPCPermissionsManager.m */,
+ B30509032511E79A008C5401 /* ProxyManager.h */,
+ B30509042511E79B008C5401 /* ProxyManager.m */,
4A40255A250026620080E159 /* SubscribeButtonManager.h */,
4A40255B250026620080E159 /* SubscribeButtonManager.m */,
5D1FF29021304513000EB9B4 /* VehicleDataManager.h */,
@@ -4929,6 +5164,8 @@
children = (
4ABB2B0124F84D940061BF55 /* SDLAirbagStatus.h */,
4ABB2AF924F84D930061BF55 /* SDLAirbagStatus.m */,
+ B3A9DAFA25D4943D00CDFD21 /* SDLAppCapability.h */,
+ B3A9DAFB25D4943D00CDFD21 /* SDLAppCapability.m */,
4ABB2B0524F84D950061BF55 /* SDLAppServiceCapability.h */,
4ABB2AFA24F84D930061BF55 /* SDLAppServiceCapability.m */,
4ABB2B0824F84D950061BF55 /* SDLAppServiceManifest.h */,
@@ -4959,6 +5196,8 @@
4ABB2B3524F84EF40061BF55 /* SDLClimateControlCapabilities.m */,
4ABB2B3624F84EF40061BF55 /* SDLClimateControlData.h */,
4ABB2B3124F84EF30061BF55 /* SDLClimateControlData.m */,
+ B360F9CF255EFEFD0027CA17 /* SDLClimateData.h */,
+ B360F9CE255EFEFD0027CA17 /* SDLClimateData.m */,
4ABB2B2224F84EF00061BF55 /* SDLCloudAppProperties.h */,
4ABB2B2124F84EF00061BF55 /* SDLCloudAppProperties.m */,
4ABB2B3224F84EF30061BF55 /* SDLClusterModeStatus.h */,
@@ -4975,6 +5214,8 @@
4ABB2B2524F84EF10061BF55 /* SDLDisplayCapabilities.m */,
4ABB2B3324F84EF30061BF55 /* SDLDisplayCapability.h */,
4ABB2B3824F84EF40061BF55 /* SDLDisplayCapability.m */,
+ B3838A39257C6AB600420C11 /* SDLDoorStatus.h */,
+ B3838A38257C6AB600420C11 /* SDLDoorStatus.m */,
4ABB2B3724F84EF40061BF55 /* SDLDriverDistractionCapability.h */,
4ABB2B2B24F84EF20061BF55 /* SDLDriverDistractionCapability.m */,
4A8BD3B924F98F89000945E3 /* SDLDynamicUpdateCapabilities.h */,
@@ -4987,6 +5228,8 @@
4ABB2B5D24F84FE30061BF55 /* SDLEqualizerSettings.m */,
4ABB2B6424F84FE50061BF55 /* SDLFuelRange.h */,
4ABB2B6524F84FE50061BF55 /* SDLFuelRange.m */,
+ B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */,
+ B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */,
4ABB2B5C24F84FE30061BF55 /* SDLGearStatus.h */,
4ABB2B5F24F84FE40061BF55 /* SDLGearStatus.m */,
4ABB2B5A24F84FE30061BF55 /* SDLGPSData.h */,
@@ -5011,6 +5254,12 @@
4ABB2B9824F850AD0061BF55 /* SDLImageField.m */,
4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */,
4ABB2B9124F850AC0061BF55 /* SDLImageResolution.m */,
+ B3A9D9E025D2571000CDFD21 /* SDLKeyboardCapabilities.h */,
+ B3A9D9DF25D2571000CDFD21 /* SDLKeyboardCapabilities.m */,
+ B3A9D9EB25D2586C00CDFD21 /* SDLKeyboardInputMask.h */,
+ B3A9D9EC25D2586C00CDFD21 /* SDLKeyboardInputMask.m */,
+ B3A9D9E625D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h */,
+ B3A9D9E525D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m */,
4ABB2B9224F850AC0061BF55 /* SDLLightCapabilities.h */,
4ABB2B9624F850AD0061BF55 /* SDLLightCapabilities.m */,
4ABB2B8F24F850AB0061BF55 /* SDLLightControlCapabilities.h */,
@@ -5075,6 +5324,8 @@
4A8BD26C24F9343D000945E3 /* SDLRemoteControlCapabilities.m */,
4A8BD28724F934F2000945E3 /* SDLRGBColor.h */,
4A8BD28A24F934F3000945E3 /* SDLRGBColor.m */,
+ B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */,
+ B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */,
4A8BD29124F93533000945E3 /* SDLScreenParams.h */,
4A8BD28F24F93533000945E3 /* SDLScreenParams.m */,
4A8BD29024F93533000945E3 /* SDLSeatControlCapabilities.h */,
@@ -5087,6 +5338,12 @@
4A8BD31C24F93964000945E3 /* SDLSeatLocationCapability.m */,
4A8BD29724F93534000945E3 /* SDLSeatMemoryAction.h */,
4A8BD29524F93534000945E3 /* SDLSeatMemoryAction.m */,
+ B360F9E3255F52B90027CA17 /* SDLSeatOccupancy.h */,
+ B360F9E2255F52B90027CA17 /* SDLSeatOccupancy.m */,
+ B360F9DC255F52A40027CA17 /* SDLSeatStatus.h */,
+ B360F9DD255F52A40027CA17 /* SDLSeatStatus.m */,
+ C9DFFE76257ACE0000F7D57A /* SDLSeekStreamingIndicator.h */,
+ C9DFFE77257ACE0000F7D57A /* SDLSeekStreamingIndicator.m */,
4A8BD29224F93533000945E3 /* SDLSingleTireStatus.h */,
4A8BD29624F93534000945E3 /* SDLSingleTireStatus.m */,
4A8BD2A624F935BB000945E3 /* SDLSISData.h */,
@@ -5160,6 +5417,8 @@
children = (
4ABB26E724F7FB8D0061BF55 /* SDLAmbientLightStatus.h */,
4ABB26EA24F7FB8D0061BF55 /* SDLAmbientLightStatus.m */,
+ B3A9DB0525D497FB00CDFD21 /* SDLAppCapabilityType.h */,
+ B3A9DB0425D497FB00CDFD21 /* SDLAppCapabilityType.m */,
4ABB26E324F7FB8C0061BF55 /* SDLAppHMIType.h */,
4ABB26F224F7FB8E0061BF55 /* SDLAppHMIType.m */,
4ABB26E924F7FB8D0061BF55 /* SDLAppInterfaceUnregisteredReason.h */,
@@ -5206,6 +5465,8 @@
4ABB272A24F7FD1B0061BF55 /* SDLDistanceUnit.m */,
4ABB272D24F7FD1C0061BF55 /* SDLDisplayType.h */,
4ABB272B24F7FD1B0061BF55 /* SDLDisplayType.m */,
+ B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */,
+ B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */,
4ABB274424F7FD9A0061BF55 /* SDLDriverDistractionState.h */,
4ABB274924F7FD9B0061BF55 /* SDLDriverDistractionState.m */,
4ABB274724F7FD9B0061BF55 /* SDLECallConfirmationStatus.h */,
@@ -5303,6 +5564,8 @@
4ABB27F624F823F20061BF55 /* SDLSamplingRate.m */,
4ABB280524F824600061BF55 /* SDLSeatMemoryActionType.h */,
4ABB280224F8245F0061BF55 /* SDLSeatMemoryActionType.m */,
+ C9DFFE7C257AD07E00F7D57A /* SDLSeekIndicatorType.h */,
+ C9DFFE7D257AD07E00F7D57A /* SDLSeekIndicatorType.m */,
4ABB280424F824600061BF55 /* SDLServiceUpdateReason.h */,
4ABB280724F824600061BF55 /* SDLServiceUpdateReason.m */,
4ABB280624F824600061BF55 /* SDLSoftButtonType.h */,
@@ -5423,6 +5686,8 @@
5D5934F81A8519C300687FB9 /* Notification */ = {
isa = PBXGroup;
children = (
+ B3A9DB2625D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.h */,
+ B3A9DB2725D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.m */,
4ABB28BA24F82A690061BF55 /* SDLOnAppInterfaceUnregistered.h */,
4ABB289324F82A640061BF55 /* SDLOnAppInterfaceUnregistered.m */,
4ABB28B624F82A690061BF55 /* SDLOnAppServiceData.h */,
@@ -5666,6 +5931,7 @@
5DB1BCE41D245629002FFC37 /* State Machine */,
5D6EB4C71BF28D6800693731 /* Categories */,
5DCC458C221C9F6600036C2F /* SDLVersionSpec.m */,
+ B3A0BA2C259600D100CC3BDF /* SDLSupportedStreamingRangeSpec.m */,
);
name = Utilities;
sourceTree = "<group>";
@@ -5675,6 +5941,7 @@
children = (
5D6EB4CB1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m */,
BB3C600D221AEF37007DD4CA /* NSMutableDictionary+StoreSpec.m */,
+ 4A5822C125E40BB5002822F1 /* NSArray+ExtensionsSpec.m */,
);
name = Categories;
sourceTree = "<group>";
@@ -5989,6 +6256,10 @@
4ABB24B824F592620061BF55 /* NSMutableDictionary+SafeRemove.h */,
4ABB24B524F592620061BF55 /* NSMutableDictionary+SafeRemove.m */,
4A8BD3AB24F98602000945E3 /* NSNumber+NumberType.h */,
+ C9707D1625DEE786009D00F2 /* NSArray+Extensions.h */,
+ C9707D1725DEE786009D00F2 /* NSArray+Extensions.m */,
+ C9707D2E25E0444D009D00F2 /* SDLMacros.h */,
+ C9707D2F25E0444D009D00F2 /* SDLMacros.m */,
);
name = Categories;
sourceTree = "<group>";
@@ -6078,12 +6349,16 @@
5DAD5F8120507DE40025624C /* Screen */ = {
isa = PBXGroup;
children = (
+ 8889C2EB2559C7AA004F5966 /* Alert */,
5DE35E4320CAFBEA0034BE5A /* Choice Set */,
5DF40B24208FA7C500DD6FDA /* Menu */,
5DAD5F8220507DED0025624C /* Soft Button */,
88D0E5D42478656B009469AB /* Subscribe Button */,
5DAD5F8320507DF30025624C /* Text and Graphic */,
+ 8889C3082559E11F004F5966 /* Utilities */,
+ 4AD1F16A2559952D00637FE1 /* Voice Command */,
5DAD5F8420507E1F0025624C /* SDLScreenManagerSpec.m */,
+ B3A0BA212593FE7400CC3BDF /* SDLCarWindowSpec.m */,
);
name = Screen;
sourceTree = "<group>";
@@ -6153,6 +6428,14 @@
8850DB5F1F4475D30053A48D /* TestMultipleFilesConnectionManager.m */,
5D6035D3202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.h */,
5D6035D4202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.m */,
+ B3DF19F2251225A90090D7BA /* TestSmartConnection.h */,
+ B3DF19F1251225A90090D7BA /* TestSmartConnection.m */,
+ B3DF19EC251225300090D7BA /* TestSmartConnectionManager.h */,
+ B3DF19EB251225300090D7BA /* TestSmartConnectionManager.m */,
+ B3DF19EF251225760090D7BA /* TestStreamingMediaDelegate.h */,
+ B3DF19EE251225760090D7BA /* TestStreamingMediaDelegate.m */,
+ 4A41430B255F0A090039C267 /* TestConnectionRequestObject.h */,
+ 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */,
);
name = "Connection Manager";
sourceTree = "<group>";
@@ -6269,7 +6552,6 @@
5DAD5F8120507DE40025624C /* Screen */,
DA8966ED1E5693D100413EAB /* Streaming */,
880E35B62088F77C00181259 /* System Capabilities */,
- 5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */,
);
name = Managers;
sourceTree = "<group>";
@@ -6443,9 +6725,7 @@
isa = PBXGroup;
children = (
5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */,
- 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */,
5DAB5F502098994C00A020C8 /* SDLMenuCellSpec.m */,
- 5DAB5F5220989A8300A020C8 /* SDLVoiceCommandSpec.m */,
752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */,
752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */,
5D76751522D920FD00E8D71A /* SDLMenuConfigurationSpec.m */,
@@ -6593,6 +6873,48 @@
name = "Data Session";
sourceTree = "<group>";
};
+ 8889C2E12559AE6C004F5966 /* Alert */ = {
+ isa = PBXGroup;
+ children = (
+ 88D79EEA255D87F8005FACB1 /* Operations */,
+ 8889C2F22559CFAF004F5966 /* SDLAlertAudioData.h */,
+ 8889C2F32559CFAF004F5966 /* SDLAlertAudioData.m */,
+ 881BBF4E255AC27000761B7E /* SDLAlertView.h */,
+ 881BBF4F255AC27000761B7E /* SDLAlertView.m */,
+ 881BBF5E255B1C1E00761B7E /* SDLAlertManager.h */,
+ 881BBF5F255B1C1E00761B7E /* SDLAlertManager.m */,
+ );
+ name = Alert;
+ sourceTree = "<group>";
+ };
+ 8889C2E22559AE82004F5966 /* Audio */ = {
+ isa = PBXGroup;
+ children = (
+ 8889C2FB2559CFE3004F5966 /* SDLAudioData.h */,
+ 8889C2FA2559CFE2004F5966 /* SDLAudioData.m */,
+ );
+ name = Audio;
+ sourceTree = "<group>";
+ };
+ 8889C2EB2559C7AA004F5966 /* Alert */ = {
+ isa = PBXGroup;
+ children = (
+ 8889C3042559E109004F5966 /* SDLAlertAudioDataSpec.m */,
+ 881BBF5A255ADB8300761B7E /* SDLAlertViewSpec.m */,
+ 886E413C2565D0D200F073B8 /* SDLPresentAlertOperationSpec.m */,
+ 886E41402565D11200F073B8 /* SDLAlertManagerSpec.m */,
+ );
+ name = Alert;
+ sourceTree = "<group>";
+ };
+ 8889C3082559E11F004F5966 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 8889C2EC2559C7E2004F5966 /* SDLAudioDataSpec.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
88A098AB2476F08F00A50005 /* Subscribe Button */ = {
isa = PBXGroup;
children = (
@@ -6666,6 +6988,15 @@
name = "Subscribe Button";
sourceTree = "<group>";
};
+ 88D79EEA255D87F8005FACB1 /* Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 88D79EEB255D8D5B005FACB1 /* SDLPresentAlertOperation.h */,
+ 88D79EEC255D8D5B005FACB1 /* SDLPresentAlertOperation.m */,
+ );
+ name = Operations;
+ sourceTree = "<group>";
+ };
88DF998A22035CA400477AC1 /* TCP */ = {
isa = PBXGroup;
children = (
@@ -6705,6 +7036,13 @@
path = Notifications;
sourceTree = "<group>";
};
+ B3476E18247437460025DC99 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
DA1166D71D14601C00438CEA /* Touches */ = {
isa = PBXGroup;
children = (
@@ -6721,9 +7059,12 @@
DA8966E71E56937100413EAB /* Streaming */ = {
isa = PBXGroup;
children = (
- 5D0A7377203F0C9E0001595D /* Configuration */,
+ B30508FD2511E5EE008C5401 /* SDLStreamingVideoDelegate.h */,
+ B30508FF2511E60D008C5401 /* SDLVideoStreamingRange.h */,
+ B30509002511E60D008C5401 /* SDLVideoStreamingRange.m */,
5D23C9441FCF59F400002CA5 /* AudioManager */,
5DCD7AD91FCCA5BF00A0FC7F /* CarWindow */,
+ 5D0A7377203F0C9E0001595D /* Configuration */,
5DA5918E1F96820F003264C3 /* Focus / Haptic */,
DA8966E81E56938C00413EAB /* Lifecycle */,
DAC5724C1D0FE3B60004288B /* Touches */,
@@ -6767,6 +7108,8 @@
children = (
4ABB262224F7F3A30061BF55 /* CVPixelBufferRef+SDLUtil.h */,
4ABB262324F7F3A30061BF55 /* CVPixelBufferRef+SDLUtil.m */,
+ B3A9DB1425D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.h */,
+ B3A9DB1525D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.m */,
4ABB25FA24F7E8E10061BF55 /* SDLStreamingVideoScaleManager.h */,
4ABB25FB24F7E8E10061BF55 /* SDLStreamingVideoScaleManager.m */,
);
@@ -6844,6 +7187,7 @@
files = (
4ABB255124F7E52B0061BF55 /* SDLLockScreenConfiguration.h in Headers */,
4ABB26B124F7F9DF0061BF55 /* SDLLogTargetOSLog.h in Headers */,
+ B360F9D1255EFEFD0027CA17 /* SDLClimateData.h in Headers */,
4ABB259624F7E6880061BF55 /* SDLMenuCell.h in Headers */,
4ABB292E24F842A00061BF55 /* SDLDiagnosticMessage.h in Headers */,
4ABB272424F7FCAE0061BF55 /* SDLComponentVolumeStatus.h in Headers */,
@@ -6856,6 +7200,7 @@
4ABB27E124F800CA0061BF55 /* SDLPowerModeQualificationStatus.h in Headers */,
4A8BD2D124F93803000945E3 /* SDLTemperature.h in Headers */,
4ABB282624F824E70061BF55 /* SDLTemperatureUnit.h in Headers */,
+ C9DFFE7E257AD07E00F7D57A /* SDLSeekIndicatorType.h in Headers */,
4ABB262424F7F3A30061BF55 /* CVPixelBufferRef+SDLUtil.h in Headers */,
4A8BD24424F93135000945E3 /* SDLMediaServiceManifest.h in Headers */,
4ABB279B24F7FF0B0061BF55 /* SDLKeyboardLayout.h in Headers */,
@@ -6866,12 +7211,14 @@
4ABB269624F7F9400061BF55 /* SDLRPCFunctionNames.h in Headers */,
4ABB2B4024F84EF50061BF55 /* SDLCloudAppProperties.h in Headers */,
4ABB2A5824F847B10061BF55 /* SDLGetInteriorVehicleDataConsentResponse.h in Headers */,
+ B3838A20257C5BB000420C11 /* SDLRoofStatus.h in Headers */,
4ABB271824F7FC4E0061BF55 /* SDLCompassDirection.h in Headers */,
4ABB2B5924F84EF50061BF55 /* SDLDeviceStatus.h in Headers */,
4A8BD2CF24F93803000945E3 /* SDLTouchEvent.h in Headers */,
4ABB264B24F7F5580061BF55 /* SDLManagerDelegate.h in Headers */,
4A8BD28B24F934F3000945E3 /* SDLRGBColor.h in Headers */,
4ABB279624F7FF0B0061BF55 /* SDLKeyboardEvent.h in Headers */,
+ B3A9DB1625D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.h in Headers */,
4ABB26FA24F7FB8F0061BF55 /* SDLAppServiceType.h in Headers */,
4ABB2A3C24F847980061BF55 /* SDLCreateInteractionChoiceSetResponse.h in Headers */,
4ABB29DC24F846880061BF55 /* SDLUnregisterAppInterface.h in Headers */,
@@ -6919,6 +7266,7 @@
4ABB28FE24F82BE90061BF55 /* SDLAddSubMenu.h in Headers */,
4ABB299624F845440061BF55 /* SDLRegisterAppInterface.h in Headers */,
4ABB27DE24F800CA0061BF55 /* SDLPredefinedLayout.h in Headers */,
+ 88D79EED255D8D5B005FACB1 /* SDLPresentAlertOperation.h in Headers */,
4ABB27E424F800CA0061BF55 /* SDLPrerecordedSpeech.h in Headers */,
4ABB2A2E24F847980061BF55 /* SDLDeleteCommandResponse.h in Headers */,
4ABB277524F7FE910061BF55 /* SDLIgnitionStatus.h in Headers */,
@@ -6936,6 +7284,7 @@
4ABB273A24F7FD1D0061BF55 /* SDLDirection.h in Headers */,
4ABB25A224F7E6CE0061BF55 /* SDLDynamicMenuUpdateRunScore.h in Headers */,
4A8BD3B024F98ACE000945E3 /* SDLLogManager.h in Headers */,
+ B360F9E5255F52BA0027CA17 /* SDLSeatOccupancy.h in Headers */,
4ABB26DE24F7FAFD0061BF55 /* SDLRPCRequest.h in Headers */,
4ABB25D824F7E7630061BF55 /* SDLTextField+ScreenManagerExtensions.h in Headers */,
4A8BD25124F93135000945E3 /* SDLModuleData.h in Headers */,
@@ -6963,9 +7312,11 @@
4ABB24E924F594CD0061BF55 /* SDLEncryptionManagerConstants.h in Headers */,
4ABB2AA724F847F40061BF55 /* SDLShowConstantTBTResponse.h in Headers */,
4ABB28ED24F82A6A0061BF55 /* SDLOnKeyboardInput.h in Headers */,
+ B360F9DE255F52A50027CA17 /* SDLSeatStatus.h in Headers */,
5D9FDA991F2A7D3F00A495C8 /* emhashmap.h in Headers */,
4ABB255F24F7E59E0061BF55 /* SDLPermissionConstants.h in Headers */,
4ABB270324F7FB8F0061BF55 /* SDLButtonName.h in Headers */,
+ 881BBF50255AC27000761B7E /* SDLAlertView.h in Headers */,
4ABB25B324F7E6F60061BF55 /* SDLSoftButtonTransitionOperation.h in Headers */,
4ABB24C624F592900061BF55 /* SDLError.h in Headers */,
5D9FDA901F2A7D3400A495C8 /* bson_array.h in Headers */,
@@ -6973,6 +7324,7 @@
4ABB263024F7F4230061BF55 /* SDLRAWH264Packetizer.h in Headers */,
4ABB26F824F7FB8F0061BF55 /* SDLAudioType.h in Headers */,
4ABB24CC24F5931B0061BF55 /* SDLStateMachine.h in Headers */,
+ C9DFFE78257ACE0000F7D57A /* SDLSeekStreamingIndicator.h in Headers */,
4ABB28DD24F82A6A0061BF55 /* SDLOnButtonPress.h in Headers */,
4A8BD34524F945CC000945E3 /* SDLControlFramePayloadTransportEventUpdate.h in Headers */,
4ABB291D24F842560061BF55 /* SDLCreateWindow.h in Headers */,
@@ -6989,6 +7341,7 @@
4ABB280124F823F20061BF55 /* SDLResult.h in Headers */,
4ABB2B8624F8504A0061BF55 /* SDLHMISettingsControlCapabilities.h in Headers */,
4ABB276924F7FE480061BF55 /* SDLHMIZoneCapabilities.h in Headers */,
+ B3838A3B257C6AB700420C11 /* SDLDoorStatus.h in Headers */,
4ABB29DF24F846880061BF55 /* SDLSystemRequest.h in Headers */,
4ABB290224F82BE90061BF55 /* SDLAddCommand.h in Headers */,
4ABB260624F7E9650061BF55 /* SDLStreamingMediaManager.h in Headers */,
@@ -7016,6 +7369,7 @@
4ABB2AB024F847F40061BF55 /* SDLSetCloudAppPropertiesResponse.h in Headers */,
4ABB28C524F82A6A0061BF55 /* SDLOnEncodedSyncPData.h in Headers */,
4ABB2A5924F847B10061BF55 /* SDLGetCloudAppPropertiesResponse.h in Headers */,
+ 4AAB6A1225E57BEA0017A5A7 /* SDLSystemInfo.h in Headers */,
4ABB29BF24F845DB0061BF55 /* SDLSetMediaClockTimer.h in Headers */,
4A8BD39324F94731000945E3 /* SDLIAPTransport.h in Headers */,
4ABB2A2024F847980061BF55 /* SDLButtonPressResponse.h in Headers */,
@@ -7051,6 +7405,7 @@
4A8BD33824F945B4000945E3 /* SDLControlFramePayloadConstants.h in Headers */,
4ABB256724F7E5B80061BF55 /* SDLRPCPermissionStatus.h in Headers */,
4ABB286724F828E00061BF55 /* SDLVehicleDataStatus.h in Headers */,
+ 8889C2F42559CFAF004F5966 /* SDLAlertAudioData.h in Headers */,
4A8BD25024F93135000945E3 /* SDLMetadataTags.h in Headers */,
4ABB2A3424F847980061BF55 /* SDLCancelInteractionResponse.h in Headers */,
4ABB2AF424F849CF0061BF55 /* SDLGenericResponse.h in Headers */,
@@ -7091,6 +7446,7 @@
4ABB2AB824F847F40061BF55 /* SDLSendHapticDataResponse.h in Headers */,
4ABB268624F7F8E20061BF55 /* SDLMutableDataQueue.h in Headers */,
4ABB27CE24F8006D0061BF55 /* SDLMediaType.h in Headers */,
+ C9707D1825DEE786009D00F2 /* NSArray+Extensions.h in Headers */,
4ABB28E324F82A6A0061BF55 /* SDLOnTBTClientState.h in Headers */,
4ABB2A5C24F847B10061BF55 /* SDLGetWayPointsResponse.h in Headers */,
4ABB260024F7E9230061BF55 /* SDLStreamingMediaManagerConstants.h in Headers */,
@@ -7109,10 +7465,12 @@
4ABB275224F7FD9C0061BF55 /* SDLFuelCutoffStatus.h in Headers */,
4ABB24BE24F592620061BF55 /* NSBundle+SDLBundle.h in Headers */,
4ABB286124F828E00061BF55 /* SDLVehicleDataResultCode.h in Headers */,
+ B3A9D9E825D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h in Headers */,
4ABB2BA024F850AE0061BF55 /* SDLLightCapabilities.h in Headers */,
4ABB284124F828630061BF55 /* SDLTurnSignal.h in Headers */,
4ABB299D24F845440061BF55 /* SDLScrollableMessage.h in Headers */,
4ABB261A24F7F3770061BF55 /* SDLFocusableItemLocator.h in Headers */,
+ B3A9DB2025D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.h in Headers */,
4ABB257724F7E5E80061BF55 /* SDLDeleteChoicesOperation.h in Headers */,
4ABB24C124F592620061BF55 /* NSMapTable+Subscripting.h in Headers */,
4ABB2A2C24F847980061BF55 /* SDLChangeRegistrationResponse.h in Headers */,
@@ -7144,6 +7502,7 @@
4A8BD29B24F93534000945E3 /* SDLScreenParams.h in Headers */,
4ABB28D024F82A6A0061BF55 /* SDLOnWayPointChange.h in Headers */,
4A8BD26724F933C7000945E3 /* SDLNavigationCapability.h in Headers */,
+ B3A9DB0725D497FB00CDFD21 /* SDLAppCapabilityType.h in Headers */,
4A8BD34624F945CC000945E3 /* SDLControlFramePayloadEndService.h in Headers */,
5D9FDA921F2A7D3400A495C8 /* bson_object.h in Headers */,
4ABB26FC24F7FB8F0061BF55 /* SDLAudioStreamingIndicator.h in Headers */,
@@ -7159,8 +7518,10 @@
4ABB284224F828630061BF55 /* SDLTextFieldName.h in Headers */,
4ABB2A3D24F847980061BF55 /* SDLEncodedSyncPDataResponse.h in Headers */,
4ABB24C924F593090061BF55 /* SDLStreamingProtocolDelegate.h in Headers */,
+ 8889C2FD2559CFE3004F5966 /* SDLAudioData.h in Headers */,
4ABB275F24F7FE1F0061BF55 /* SDLFuelType.h in Headers */,
4A8BD3A024F9474B000945E3 /* SDLIAPDataSessionDelegate.h in Headers */,
+ B3838A28257C5CE600420C11 /* SDLDoorStatusType.h in Headers */,
4A8BD2F724F93872000945E3 /* SDLVrHelpItem.h in Headers */,
4ABB2A0024F8477F0061BF55 /* SDLAddCommandResponse.h in Headers */,
4ABB291124F842160061BF55 /* SDLChangeRegistration.h in Headers */,
@@ -7172,9 +7533,11 @@
4ABB25E024F7E7980061BF55 /* SDLStreamingMediaConfiguration.h in Headers */,
4A8BD2FE24F938A4000945E3 /* SDLVehicleType.h in Headers */,
4ABB282B24F824E70061BF55 /* SDLTBTState.h in Headers */,
+ C9707D3025E0444D009D00F2 /* SDLMacros.h in Headers */,
4ABB26D724F7FAFD0061BF55 /* SDLRPCMessage.h in Headers */,
4A8BD24A24F93135000945E3 /* SDLMyKey.h in Headers */,
4ABB24F924F5959E0061BF55 /* SDLAsynchronousOperation.h in Headers */,
+ B3A9D9E225D2571000CDFD21 /* SDLKeyboardCapabilities.h in Headers */,
4ABB29B324F845DB0061BF55 /* SDLShow.h in Headers */,
4ABB25B424F7E6F60061BF55 /* SDLSoftButtonReplaceOperation.h in Headers */,
4ABB269C24F7F9710061BF55 /* SDLRPCParameterNames.h in Headers */,
@@ -7189,6 +7552,7 @@
4ABB297624F844D30061BF55 /* SDLPerformInteraction.h in Headers */,
4ABB25EA24F7E7C20061BF55 /* SDLCarWindowViewController.h in Headers */,
4A8BD2A124F93534000945E3 /* SDLSeatMemoryAction.h in Headers */,
+ B3A9DAFC25D4943E00CDFD21 /* SDLAppCapability.h in Headers */,
4ABB27C524F8006D0061BF55 /* SDLNavigationAction.h in Headers */,
4ABB27E224F800CA0061BF55 /* SDLPowerModeStatus.h in Headers */,
4ABB254D24F7E4C60061BF55 /* SDLLockScreenViewController.h in Headers */,
@@ -7196,6 +7560,7 @@
4A8BD26324F933C7000945E3 /* SDLNavigationServiceManifest.h in Headers */,
4ABB284B24F828630061BF55 /* SDLTransmissionType.h in Headers */,
4ABB258324F7E61E0061BF55 /* SDLChoiceSet.h in Headers */,
+ B3A9DB2825D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.h in Headers */,
4ABB275424F7FD9C0061BF55 /* SDLElectronicParkBrakeStatus.h in Headers */,
4ABB2B5524F84EF50061BF55 /* SDLDriverDistractionCapability.h in Headers */,
4ABB257624F7E5E80061BF55 /* SDLPreloadChoicesOperation.h in Headers */,
@@ -7205,6 +7570,7 @@
4ABB254124F7E48D0061BF55 /* SDLLockScreenRootViewController.h in Headers */,
4ABB2A7124F847D40061BF55 /* SDLPublishAppServiceResponse.h in Headers */,
4A8BD2D724F93803000945E3 /* SDLTextField.h in Headers */,
+ B30508FE2511E5EF008C5401 /* SDLStreamingVideoDelegate.h in Headers */,
4ABB260D24F7F3400061BF55 /* SDLAudioFile.h in Headers */,
4A8BD2B224F935BC000945E3 /* SDLStartTime.h in Headers */,
4A8BD31F24F93964000945E3 /* SDLSeatLocationCapability.h in Headers */,
@@ -7308,6 +7674,7 @@
4A8BD36E24F94636000945E3 /* SDLProtocolMessageAssembler.h in Headers */,
4ABB28C024F82A6A0061BF55 /* SDLOnCommand.h in Headers */,
4ABB26A824F7F9CF0061BF55 /* SDLLogTargetAppleSystemLog.h in Headers */,
+ B3A9D9ED25D2586C00CDFD21 /* SDLKeyboardInputMask.h in Headers */,
4ABB250524F596450061BF55 /* SDLListFilesOperation.h in Headers */,
4ABB268F24F7F8FC0061BF55 /* SDLHexUtility.h in Headers */,
4A8BD28124F9343F000945E3 /* SDLRemoteControlCapabilities.h in Headers */,
@@ -7328,6 +7695,7 @@
4ABB27F024F801B50061BF55 /* SDLPRNDL.h in Headers */,
4ABB259924F7E6A60061BF55 /* SDLMenuManagerConstants.h in Headers */,
4ABB2AEE24F848270061BF55 /* SDLUnregisterAppInterfaceResponse.h in Headers */,
+ B30509012511E60E008C5401 /* SDLVideoStreamingRange.h in Headers */,
4A8BD2D524F93803000945E3 /* SDLTouchEventCapabilities.h in Headers */,
4ABB2A5124F847B10061BF55 /* SDLGetVehicleDataResponse.h in Headers */,
4ABB26DC24F7FAFD0061BF55 /* SDLRPCStruct.h in Headers */,
@@ -7335,9 +7703,11 @@
4ABB296524F844020061BF55 /* SDLListFiles.h in Headers */,
4ABB281824F824A50061BF55 /* SDLStaticIconName.h in Headers */,
4ABB290524F82BE90061BF55 /* SDLAlert.h in Headers */,
+ B3838A31257C5D1B00420C11 /* SDLGateStatus.h in Headers */,
4ABB26BA24F7FA1C0061BF55 /* SDLLogConstants.h in Headers */,
4ABB28DB24F82A6A0061BF55 /* SDLOnSystemCapabilityUpdated.h in Headers */,
4ABB269324F7F9060061BF55 /* SDLTimer.h in Headers */,
+ 4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */,
4A8BD2F924F93872000945E3 /* SDLVehicleDataType.h in Headers */,
4ABB279924F7FF0B0061BF55 /* SDLLanguage.h in Headers */,
4ABB285F24F828E00061BF55 /* SDLVehicleDataActiveStatus.h in Headers */,
@@ -7405,6 +7775,7 @@
4ABB25BC24F7E70E0061BF55 /* SDLSoftButtonObject.h in Headers */,
4ABB256324F7E5AA0061BF55 /* SDLPermissionElement.h in Headers */,
4ABB2AE624F848270061BF55 /* SDLUnsubscribeVehicleDataResponse.h in Headers */,
+ 881BBF60255B1C1E00761B7E /* SDLAlertManager.h in Headers */,
4ABB258524F7E62D0061BF55 /* SDLChoiceSetDelegate.h in Headers */,
4ABB2B8D24F8504A0061BF55 /* SDLHMISettingsControlData.h in Headers */,
4ABB25F824F7E7EF0061BF55 /* SDLTouchManager.h in Headers */,
@@ -7527,11 +7898,12 @@
attributes = {
CLASSPREFIX = SDL;
LastSwiftUpdateCheck = 0710;
- LastUpgradeCheck = 1210;
+ LastUpgradeCheck = 1240;
ORGANIZATIONNAME = smartdevicelink;
TargetAttributes = {
5D4019AE1A76EC350006B0C2 = {
CreatedOnToolsVersion = 6.1.1;
+ ProvisioningStyle = Manual;
SystemCapabilities = {
com.apple.BackgroundModes = {
enabled = 1;
@@ -7543,7 +7915,7 @@
};
5D61FA1B1A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
- LastSwiftMigration = 1170;
+ LastSwiftMigration = 1210;
};
5D61FA251A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
@@ -7653,10 +8025,10 @@
files = (
5D1FF2CA2130463F000EB9B4 /* AppDelegate.m in Sources */,
5D1FF2BA21304581000EB9B4 /* ConnectionTCPTableViewController.m in Sources */,
+ B30509052511E79B008C5401 /* ProxyManager.m in Sources */,
5D1FF2B921304581000EB9B4 /* ConnectionContainerViewController.m in Sources */,
5D1FF29D21304515000EB9B4 /* RPCPermissionsManager.m in Sources */,
5D1FF2A121304515000EB9B4 /* VehicleDataManager.m in Sources */,
- 5D1FF29F21304515000EB9B4 /* ProxyManager.m in Sources */,
5D1FF2BF21304598000EB9B4 /* ConnectionAnimatedTransition.m in Sources */,
5D1FF2A721304531000EB9B4 /* Preferences.m in Sources */,
5D1FF2CC2130464E000EB9B4 /* main.m in Sources */,
@@ -7692,6 +8064,7 @@
4ABB291624F842160061BF55 /* SDLCloseApplication.m in Sources */,
4ABB2B4F24F84EF50061BF55 /* SDLClimateControlData.m in Sources */,
4ABB2A2824F847980061BF55 /* SDLDeleteCommandResponse.m in Sources */,
+ 881BBF51255AC27000761B7E /* SDLAlertView.m in Sources */,
4ABB2AD224F848130061BF55 /* SDLSubscribeWayPointsResponse.m in Sources */,
4ABB286224F828E00061BF55 /* SDLVehicleDataResultCode.m in Sources */,
4ABB2B8A24F8504A0061BF55 /* SDLHMISettingsControlCapabilities.m in Sources */,
@@ -7700,6 +8073,7 @@
4ABB264524F7F5340061BF55 /* SDLSystemCapabilityManager.m in Sources */,
4A8BD2B124F935BC000945E3 /* SDLSoftButtonCapabilities.m in Sources */,
4ABB2A5524F847B10061BF55 /* SDLGetInteriorVehicleDataConsentResponse.m in Sources */,
+ 4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */,
4ABB2AA924F847F40061BF55 /* SDLSetAppIconResponse.m in Sources */,
4A8BD2D224F93803000945E3 /* SDLTemplateColorScheme.m in Sources */,
4A8BD3C124F994D5000945E3 /* SDLFileManager.m in Sources */,
@@ -7722,10 +8096,13 @@
4ABB255C24F7E5880061BF55 /* SDLPermissionFilter.m in Sources */,
4ABB27C624F8006D0061BF55 /* SDLModuleType.m in Sources */,
4ABB25FD24F7E8E10061BF55 /* SDLStreamingVideoScaleManager.m in Sources */,
+ C9707D3125E0444D009D00F2 /* SDLMacros.m in Sources */,
4ABB26F724F7FB8F0061BF55 /* SDLAudioStreamingState.m in Sources */,
4ABB265A24F7F5C10061BF55 /* SDLRPCResponseNotification.m in Sources */,
4ABB2AB724F847F40061BF55 /* SDLSetGlobalPropertiesResponse.m in Sources */,
+ C9DFFE79257ACE0000F7D57A /* SDLSeekStreamingIndicator.m in Sources */,
4ABB2B0B24F84D950061BF55 /* SDLAppServiceData.m in Sources */,
+ 88D79EEE255D8D5B005FACB1 /* SDLPresentAlertOperation.m in Sources */,
4ABB282C24F824E70061BF55 /* SDLTBTState.m in Sources */,
4ABB27DF24F800CA0061BF55 /* SDLPowerModeQualificationStatus.m in Sources */,
4ABB269D24F7F9710061BF55 /* SDLRPCParameterNames.m in Sources */,
@@ -7734,6 +8111,7 @@
4ABB28E224F82A6A0061BF55 /* SDLOnLanguageChange.m in Sources */,
4ABB29DD24F846880061BF55 /* SDLSubscribeButton.m in Sources */,
4ABB25F324F7E7EF0061BF55 /* SDLPinchGesture.m in Sources */,
+ 8889C2F52559CFAF004F5966 /* SDLAlertAudioData.m in Sources */,
4A8BD39524F94731000945E3 /* SDLIAPConstants.m in Sources */,
4ABB2B8C24F8504A0061BF55 /* SDLGrid.m in Sources */,
4ABB299024F845440061BF55 /* SDLRegisterAppInterface.m in Sources */,
@@ -7760,6 +8138,7 @@
4ABB265624F7F5B40061BF55 /* SDLRPCNotificationNotification.m in Sources */,
4ABB2B8424F8504A0061BF55 /* SDLHMISettingsControlData.m in Sources */,
4ABB287624F8294A0061BF55 /* SDLVentilationMode.m in Sources */,
+ C9707D1925DEE786009D00F2 /* NSArray+Extensions.m in Sources */,
4ABB25E724F7E7A90061BF55 /* SDLAudioStreamManager.m in Sources */,
4ABB277B24F7FEBA0061BF55 /* SDLLightStatus.m in Sources */,
4ABB2A7324F847D40061BF55 /* SDLPutFileResponse.m in Sources */,
@@ -7811,6 +8190,7 @@
4ABB28D624F82A6A0061BF55 /* SDLOnAudioPassThru.m in Sources */,
4A8BD25224F93135000945E3 /* SDLKeyboardProperties.m in Sources */,
4ABB2B1324F84D950061BF55 /* SDLAppServiceRecord.m in Sources */,
+ B3838A29257C5CE600420C11 /* SDLDoorStatusType.m in Sources */,
4ABB290424F82BE90061BF55 /* SDLAlertManeuver.m in Sources */,
4ABB27B224F7FFDA0061BF55 /* SDLMassageMode.m in Sources */,
4ABB274F24F7FD9C0061BF55 /* SDLECallConfirmationStatus.m in Sources */,
@@ -7828,6 +8208,7 @@
4A8BD23C24F93135000945E3 /* SDLMediaServiceData.m in Sources */,
4ABB28DC24F82A6A0061BF55 /* SDLOnHashChange.m in Sources */,
4A8BD26424F933C7000945E3 /* SDLNavigationServiceManifest.m in Sources */,
+ B3A9DB1725D4AD1800CDFD21 /* SDLImageResolution+StreamingVideoExtensions.m in Sources */,
4ABB29D824F846880061BF55 /* SDLSystemRequest.m in Sources */,
4ABB271B24F7FC4E0061BF55 /* SDLCharacterSet.m in Sources */,
4ABB26CB24F7FAAF0061BF55 /* SDLEnum.m in Sources */,
@@ -7881,6 +8262,7 @@
4ABB2B0E24F84D950061BF55 /* SDLAppServiceCapability.m in Sources */,
4ABB2A0124F8477F0061BF55 /* SDLAlertManeuverResponse.m in Sources */,
4A8BD3CA24F998A8000945E3 /* SDLWindowState.m in Sources */,
+ B3A9DB2925D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.m in Sources */,
4ABB29D324F846880061BF55 /* SDLSyncPData.m in Sources */,
4ABB276B24F7FE480061BF55 /* SDLHybridAppPreference.m in Sources */,
4ABB2BA624F850AE0061BF55 /* SDLImageField.m in Sources */,
@@ -7913,6 +8295,7 @@
4ABB250124F596450061BF55 /* SDLUploadFileOperation.m in Sources */,
4ABB258224F7E61E0061BF55 /* SDLChoiceCell.m in Sources */,
4ABB288D24F82A340061BF55 /* SDLVideoStreamingProtocol.m in Sources */,
+ B3A9DAFD25D4943E00CDFD21 /* SDLAppCapability.m in Sources */,
4ABB257024F7E5E80061BF55 /* SDLPreloadChoicesOperation.m in Sources */,
4ABB2B3F24F84EF50061BF55 /* SDLCloudAppProperties.m in Sources */,
4A8BD27C24F9343F000945E3 /* SDLPhoneCapability.m in Sources */,
@@ -7932,12 +8315,14 @@
4ABB269224F7F9060061BF55 /* SDLTimer.m in Sources */,
4ABB25C624F7E73C0061BF55 /* SDLSubscribeButtonManager.m in Sources */,
4ABB278E24F7FF0B0061BF55 /* SDLKeyboardEvent.m in Sources */,
+ B3A9D9E725D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m in Sources */,
4ABB279024F7FF0B0061BF55 /* SDLImageType.m in Sources */,
4ABB28CB24F82A6A0061BF55 /* SDLOnTouchEvent.m in Sources */,
4ABB2B4E24F84EF50061BF55 /* SDLClusterModeStatus.m in Sources */,
4ABB2AA824F847F40061BF55 /* SDLSetDisplayLayoutResponse.m in Sources */,
4ABB273E24F7FD1D0061BF55 /* SDLDisplayMode.m in Sources */,
4A40254124FFDA660080E159 /* SDLTextAndGraphicState.m in Sources */,
+ 4AAB6A1325E57BEA0017A5A7 /* SDLSystemInfo.m in Sources */,
4ABB27AB24F7FFDA0061BF55 /* SDLMassageZone.m in Sources */,
4A8BD2DD24F93803000945E3 /* SDLTouchEvent.m in Sources */,
4ABB26BD24F7FA1C0061BF55 /* SDLLogConfiguration.m in Sources */,
@@ -7953,17 +8338,21 @@
4ABB29ED24F847360061BF55 /* SDLUnsubscribeVehicleData.m in Sources */,
4ABB2A2124F847980061BF55 /* SDLButtonPressResponse.m in Sources */,
4ABB270224F7FB8F0061BF55 /* SDLButtonEventMode.m in Sources */,
+ B3A9DB2125D4BBB800CDFD21 /* SDLVideoStreamingCapability+StreamingVideoExtensions.m in Sources */,
4A8BD24C24F93135000945E3 /* SDLLocationDetails.m in Sources */,
4ABB275C24F7FE1F0061BF55 /* SDLFuelType.m in Sources */,
4ABB2B4324F84EF50061BF55 /* SDLDisplayCapabilities.m in Sources */,
+ B3838A3A257C6AB700420C11 /* SDLDoorStatus.m in Sources */,
4ABB267724F7F6720061BF55 /* SDLObjectWithPriority.m in Sources */,
4ABB29FE24F8477F0061BF55 /* SDLAddCommandResponse.m in Sources */,
4ABB251324F7E3A30061BF55 /* SDLLifecycleConfiguration.m in Sources */,
4ABB294824F843440061BF55 /* SDLGetAppServiceData.m in Sources */,
+ B30509022511E60E008C5401 /* SDLVideoStreamingRange.m in Sources */,
4ABB262124F7F3870061BF55 /* CGPoint_Util.m in Sources */,
4ABB2A8924F847DF0061BF55 /* SDLReadDIDResponse.m in Sources */,
4A8BD24524F93135000945E3 /* SDLModuleData.m in Sources */,
4ABB2BA424F850AE0061BF55 /* SDLLightCapabilities.m in Sources */,
+ B3A9DB0625D497FB00CDFD21 /* SDLAppCapabilityType.m in Sources */,
4ABB272224F7FCAE0061BF55 /* SDLDefrostZone.m in Sources */,
4ABB24BB24F592620061BF55 /* NSMutableArray+Safe.m in Sources */,
4ABB25AA24F7E6E10061BF55 /* SDLMenuManager.m in Sources */,
@@ -7984,6 +8373,7 @@
4ABB254824F7E49D0061BF55 /* SDLLockScreenStatusManager.m in Sources */,
4A8BD2B724F935BC000945E3 /* SDLSoftButton.m in Sources */,
4ABB2AD824F8481D0061BF55 /* SDLSystemRequestResponse.m in Sources */,
+ 8889C2FC2559CFE3004F5966 /* SDLAudioData.m in Sources */,
4ABB28E924F82A6A0061BF55 /* SDLOnWayPointChange.m in Sources */,
4A8BD24324F93135000945E3 /* SDLMetadataTags.m in Sources */,
4ABB283124F824E70061BF55 /* SDLTemperatureUnit.m in Sources */,
@@ -7992,6 +8382,7 @@
4ABB2AB924F847F40061BF55 /* SDLSetInteriorVehicleDataResponse.m in Sources */,
4ABB295424F843440061BF55 /* SDLEndAudioPassThru.m in Sources */,
4ABB2A2924F847980061BF55 /* SDLDeleteFileResponse.m in Sources */,
+ B3A9D9EE25D2586C00CDFD21 /* SDLKeyboardInputMask.m in Sources */,
4ABB284524F828630061BF55 /* SDLTouchType.m in Sources */,
4ABB2B8024F8504A0061BF55 /* SDLHapticRect.m in Sources */,
4A8BD38A24F94712000945E3 /* SDLSecondaryTransportManager.m in Sources */,
@@ -8030,6 +8421,7 @@
4ABB2B9F24F850AE0061BF55 /* SDLImageResolution.m in Sources */,
4ABB29B424F845DB0061BF55 /* SDLSpeak.m in Sources */,
4A8BD3AF24F98ACE000945E3 /* SDLLogManager.m in Sources */,
+ 4A39C6FA25E84C87005C8943 /* SDLKeyboardCapabilities.m in Sources */,
4ABB257124F7E5E80061BF55 /* SDLPresentChoiceSetOperation.m in Sources */,
4ABB2A5624F847B10061BF55 /* SDLGetWayPointsResponse.m in Sources */,
4ABB24F524F595120061BF55 /* SDLArtwork.m in Sources */,
@@ -8054,6 +8446,7 @@
4ABB2AEB24F848270061BF55 /* SDLUpdateTurnListResponse.m in Sources */,
4ABB263124F7F4230061BF55 /* SDLRAWH264Packetizer.m in Sources */,
4ABB2B5724F84EF50061BF55 /* SDLDIDResult.m in Sources */,
+ B360F9E4255F52BA0027CA17 /* SDLSeatOccupancy.m in Sources */,
5D9FDA981F2A7D3F00A495C8 /* emhashmap.c in Sources */,
4ABB260C24F7F3400061BF55 /* SDLAudioFile.m in Sources */,
4A8BD2F524F93872000945E3 /* SDLTTSChunk.m in Sources */,
@@ -8067,6 +8460,7 @@
4ABB268324F7F8D60061BF55 /* SDLBackgroundTaskManager.m in Sources */,
4ABB2ACC24F848130061BF55 /* SDLSyncPDataResponse.m in Sources */,
4ABB26DF24F7FAFD0061BF55 /* SDLRPCNotification.m in Sources */,
+ C9DFFE7F257AD07E00F7D57A /* SDLSeekIndicatorType.m in Sources */,
4ABB254C24F7E4C60061BF55 /* SDLLockScreenViewController.m in Sources */,
4ABB270024F7FB8F0061BF55 /* SDLAmbientLightStatus.m in Sources */,
4ABB299224F845440061BF55 /* SDLScrollableMessage.m in Sources */,
@@ -8110,6 +8504,7 @@
4ABB2A5B24F847B10061BF55 /* SDLGetCloudAppPropertiesResponse.m in Sources */,
4ABB25F424F7E7EF0061BF55 /* SDLTouch.m in Sources */,
4ABB2B3E24F84EF50061BF55 /* SDLDeviceStatus.m in Sources */,
+ B3838A21257C5BB000420C11 /* SDLRoofStatus.m in Sources */,
4ABB28BE24F82A6A0061BF55 /* SDLOnSyncPData.m in Sources */,
4ABB275724F7FD9C0061BF55 /* SDLEmergencyEventType.m in Sources */,
4ABB29B824F845DB0061BF55 /* SDLSetMediaClockTimer.m in Sources */,
@@ -8119,6 +8514,7 @@
4A8BD27A24F9343F000945E3 /* SDLRemoteControlCapabilities.m in Sources */,
4ABB291824F842160061BF55 /* SDLChangeRegistration.m in Sources */,
4A8BD26224F933C7000945E3 /* SDLNavigationInstruction.m in Sources */,
+ 881BBF61255B1C1E00761B7E /* SDLAlertManager.m in Sources */,
4ABB29EB24F847360061BF55 /* SDLUnsubscribeWayPoints.m in Sources */,
4ABB25E124F7E7980061BF55 /* SDLStreamingMediaConfiguration.m in Sources */,
4ABB299424F845440061BF55 /* SDLSendLocation.m in Sources */,
@@ -8132,6 +8528,7 @@
4A8BD39424F94731000945E3 /* SDLIAPSession.m in Sources */,
4ABB2A3924F847980061BF55 /* SDLDiagnosticMessageResponse.m in Sources */,
4A8BD29924F93534000945E3 /* SDLScreenParams.m in Sources */,
+ B360F9D0255EFEFD0027CA17 /* SDLClimateData.m in Sources */,
4ABB28C324F82A6A0061BF55 /* SDLOnAppInterfaceUnregistered.m in Sources */,
4ABB2A3224F847980061BF55 /* SDLCancelInteractionResponse.m in Sources */,
4ABB259C24F7E6B90061BF55 /* SDLMenuConfiguration.m in Sources */,
@@ -8175,10 +8572,12 @@
4ABB2AA224F847F40061BF55 /* SDLSetCloudAppPropertiesResponse.m in Sources */,
4A8BD3A224F9474B000945E3 /* SDLIAPDataSession.m in Sources */,
4A8BD3B624F98F64000945E3 /* SDLOnUpdateSubMenu.m in Sources */,
+ B3838A30257C5D1B00420C11 /* SDLGateStatus.m in Sources */,
4ABB256624F7E5B80061BF55 /* SDLRPCPermissionStatus.m in Sources */,
4ABB299824F845440061BF55 /* SDLReleaseInteriorVehicleDataModule.m in Sources */,
4ABB277724F7FE910061BF55 /* SDLIgnitionStatus.m in Sources */,
4ABB2B5624F84EF50061BF55 /* SDLDisplayCapability.m in Sources */,
+ B360F9DF255F52A50027CA17 /* SDLSeatStatus.m in Sources */,
4ABB267F24F7F68F0061BF55 /* SDLCacheFileManager.m in Sources */,
4A8BD24124F93135000945E3 /* SDLMenuParams.m in Sources */,
4ABB28FC24F82BE90061BF55 /* SDLAddCommand.m in Sources */,
@@ -8220,7 +8619,6 @@
buildActionMask = 2147483647;
files = (
75CE2041233D335100B9DEF9 /* SDLGetDTCsSpec.m in Sources */,
- 5DBAE0AD1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m in Sources */,
162E83951A9BDE8B00906325 /* SDLTurnSpec.m in Sources */,
162E83481A9BDE8B00906325 /* SDLUpdateTurnListSpec.m in Sources */,
1680B11E1A9CD7AD00DBD79E /* SDLProtocolReceivedMessageRouterSpec.m in Sources */,
@@ -8251,8 +8649,10 @@
5DB92D2F1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m in Sources */,
88DF999122035D5A00477AC1 /* SDLIAPTransportSpec.m in Sources */,
162E838A1A9BDE8B00906325 /* SDLSingleTireStatusSpec.m in Sources */,
+ B3A0BA2925940ED100CC3BDF /* SDLCarWindowSpec.m in Sources */,
5D6EB4CC1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m in Sources */,
B3F7918324E062C200DB5CAF /* SDLGetVehicleDataSpec.m in Sources */,
+ C975877F257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m in Sources */,
88F37A4D226F84BE00DF119B /* SDLIAPDataSessionSpec.m in Sources */,
9FA0D00322DF06B9009CF344 /* SDLWindowTypeCapabilitiesSpec.m in Sources */,
162E83051A9BDE8B00906325 /* SDLVehicleDataActiveStatusSpec.m in Sources */,
@@ -8263,6 +8663,7 @@
162E837D1A9BDE8B00906325 /* SDLEmergencyEventSpec.m in Sources */,
162E82D31A9BDE8A00906325 /* SDLCarModeStatusSpec.m in Sources */,
8B7B31A91F2FB8BC00BDC38D /* SDLVideoStreamingProtocolSpec.m in Sources */,
+ B3A9DA0A25D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m in Sources */,
88EED83B1F33BECB00E6C42E /* SDLHapticRectSpec.m in Sources */,
162E82EA1A9BDE8B00906325 /* SDLLanguageSpec.m in Sources */,
5D76E3291D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m in Sources */,
@@ -8290,6 +8691,7 @@
162E82E31A9BDE8B00906325 /* SDLIgnitionStatusSpec.m in Sources */,
162E83511A9BDE8B00906325 /* SDLDeleteInteractionChoiceSetResponseSpec.m in Sources */,
DA9F7EB41DCC086400ACAE48 /* SDLDateTimeSpec.m in Sources */,
+ B3838A0F257C4EE100420C11 /* SDLGateStatusSpec.m in Sources */,
162E82E41A9BDE8B00906325 /* SDLImageFieldNameSpec.m in Sources */,
162E82ED1A9BDE8B00906325 /* SDLMaintenanceModeStatusSpec.m in Sources */,
8B9376DB1F33656C009605C4 /* SDLMetadataTagsSpec.m in Sources */,
@@ -8298,10 +8700,12 @@
5DA23FF31F2FA35C009C0313 /* SDLControlFramePayloadAudioStartServiceAckSpec.m in Sources */,
1EAA476820369BCF000FE74B /* SDLLightStateSpec.m in Sources */,
1680B11C1A9CD7AD00DBD79E /* SDLProtocolMessageAssemblerSpec.m in Sources */,
+ B3A0BA2D259600D100CC3BDF /* SDLSupportedStreamingRangeSpec.m in Sources */,
8850DB601F4475D30053A48D /* TestMultipleFilesConnectionManager.m in Sources */,
162E83181A9BDE8B00906325 /* SDLOnKeyboardInputSpec.m in Sources */,
1EE8C4441F34A1B900FDC2CF /* SDLClimateControlDataSpec.m in Sources */,
162E83701A9BDE8B00906325 /* SDLUpdateTurnListResponseSpec.m in Sources */,
+ 4A41430D255F0A090039C267 /* TestConnectionRequestObject.m in Sources */,
88C23E8822297C6000EA171F /* SDLRPCResponseNotificationSpec.m in Sources */,
162E833B1A9BDE8B00906325 /* SDLSetGlobalPropertiesSpec.m in Sources */,
884AF94C220B3FCC00E22928 /* SDLGetSystemCapabilitySpec.m in Sources */,
@@ -8319,9 +8723,9 @@
88FBF7C52501330F005EA0A4 /* TestHapticRectViewController.m in Sources */,
1EB59CD8202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m in Sources */,
162E83661A9BDE8B00906325 /* SDLShowResponseSpec.m in Sources */,
- 5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */,
88BCEA952266592D00BB7E70 /* SDLIAPControlSessionSpec.m in Sources */,
88AAD4C02211B7E200F1E6D7 /* SDLMediaServiceManifestSpec.m in Sources */,
+ B3A9DB0F25D4A30D00CDFD21 /* SDLAppCapabilityTypeSpec.m in Sources */,
5DAB5F512098994C00A020C8 /* SDLMenuCellSpec.m in Sources */,
1EE8C4481F38430900FDC2CF /* SDLRadioControlCapabilitiesSpec.m in Sources */,
8831FA452202307500B8FFB7 /* SDLAppServiceCapabilitySpec.m in Sources */,
@@ -8336,9 +8740,11 @@
162E835B1A9BDE8B00906325 /* SDLPerformInteractionResponseSpec.m in Sources */,
880E35B82088F78E00181259 /* SDLSystemCapabilityManagerSpec.m in Sources */,
162E832D1A9BDE8B00906325 /* SDLEncodedSyncPDataSpec.m in Sources */,
+ B3A9DA0425D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m in Sources */,
1EE8C44C1F385C7100FDC2CF /* SDLRDSDataSpec.m in Sources */,
5DB92D241AC47B2C00C15BB0 /* SDLHexUtilitySpec.m in Sources */,
8815D0F022330765000F24E6 /* SDLRPCRequestNotificationSpec.m in Sources */,
+ B3DF19F0251225770090D7BA /* TestStreamingMediaDelegate.m in Sources */,
162E83281A9BDE8B00906325 /* SDLDeleteCommandSpec.m in Sources */,
88A81F6C2200FD4A00A691A9 /* SDLAppServiceRecordSpec.m in Sources */,
162E83531A9BDE8B00906325 /* SDLDiagnosticMessageResponseSpec.m in Sources */,
@@ -8354,6 +8760,7 @@
162E83911A9BDE8B00906325 /* SDLTouchCoordSpec.m in Sources */,
162E832B1A9BDE8B00906325 /* SDLDeleteSubMenuSpec.m in Sources */,
162E83411A9BDE8B00906325 /* SDLSubscribeButtonSpec.m in Sources */,
+ B3EC9E6E2579AA010039F3AA /* SDLClimateDataSpec.m in Sources */,
5D59DD471B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m in Sources */,
5D0A9F9A1F15636800CC80DD /* SDLGetSystemCapabilitiesSpec.m in Sources */,
162E82F31A9BDE8B00906325 /* SDLPrerecordedSpeechSpec.m in Sources */,
@@ -8411,6 +8818,8 @@
162E82F71A9BDE8B00906325 /* SDLResultSpec.m in Sources */,
88DDD0F9229ECA57002F9623 /* SDLIAPConstantsSpec.m in Sources */,
1680B1141A9CD7AD00DBD79E /* SDLV1ProtocolHeaderSpec.m in Sources */,
+ B3DF19F3251225AA0090D7BA /* TestSmartConnection.m in Sources */,
+ B3838A15257C4EFD00420C11 /* SDLRoofStatusSpec.m in Sources */,
880D2680220E038800B3F496 /* SDLWeatherServiceManifestSpec.m in Sources */,
88EEC5BE220A3B8B005AA2F9 /* SDLPublishAppServiceResponseSpec.m in Sources */,
1680B1161A9CD7AD00DBD79E /* SDLProtocolMessageSpec.m in Sources */,
@@ -8437,6 +8846,7 @@
5D92935620B2FD7300FCC775 /* SDLTemplateColorSchemeSpec.m in Sources */,
162E82DE1A9BDE8B00906325 /* SDLFuelCutoffStatusSpec.m in Sources */,
162E83271A9BDE8B00906325 /* SDLCreateInteractionChoiceSetSpec.m in Sources */,
+ 4AAB6A2325E69D010017A5A7 /* SDLSystemInfoSpec.m in Sources */,
4A404C68250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m in Sources */,
5DAD5F8920508F090025624C /* SDLSoftButtonStateSpec.m in Sources */,
1098F03824A39699004F53CC /* SDLPermissionElementSpec.m in Sources */,
@@ -8454,6 +8864,7 @@
162E82D71A9BDE8A00906325 /* SDLDeviceLevelStatusSpec.m in Sources */,
162E83841A9BDE8B00906325 /* SDLMenuParamsSpec.m in Sources */,
5DB1BCE11D243DDE002FFC37 /* SDLConfigurationSpec.m in Sources */,
+ B3DF19ED251225300090D7BA /* TestSmartConnectionManager.m in Sources */,
162E83071A9BDE8B00906325 /* SDLVehicleDataNotificationStatusSpec.m in Sources */,
5D9F50811BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m in Sources */,
162E83361A9BDE8B00906325 /* SDLRegisterAppInterfaceSpec.m in Sources */,
@@ -8467,6 +8878,7 @@
162E83761A9BDE8B00906325 /* SDLChoiceSpec.m in Sources */,
162E83571A9BDE8B00906325 /* SDLGetDTCsResponseSpec.m in Sources */,
5D4346471E6F0BDA00B639C6 /* SDLLogFileModuleSpec.m in Sources */,
+ 8889C3052559E109004F5966 /* SDLAlertAudioDataSpec.m in Sources */,
889D0B9824D06E52008AD494 /* SDLSubtleAlertSpec.m in Sources */,
88A1CF1E21669AC7001ACC75 /* SDLLifecycleConfigurationUpdateSpec.m in Sources */,
1EE8C4581F387ABD00FDC2CF /* SDLButtonPressResponseSpec.m in Sources */,
@@ -8476,6 +8888,7 @@
1EAA47762036B847000FE74B /* SDLEqualizerSettingsSpec.m in Sources */,
752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */,
162E83141A9BDE8B00906325 /* SDLOnDriverDistractionSpec.m in Sources */,
+ B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */,
162E83371A9BDE8B00906325 /* SDLResetGlobalPropertiesSpec.m in Sources */,
162E82DF1A9BDE8B00906325 /* SDLGlobalProperySpec.m in Sources */,
88DF998F22035D1700477AC1 /* SDLIAPSessionSpec.m in Sources */,
@@ -8502,11 +8915,11 @@
162E83161A9BDE8B00906325 /* SDLOnHashChangeSpec.m in Sources */,
8886EB982111F4FA008294A5 /* SDLFileManagerConfigurationSpec.m in Sources */,
162E82FE1A9BDE8B00906325 /* SDLTBTStateSpec.m in Sources */,
- 5D5DBF0B1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m in Sources */,
5DB1BCD41D243A8E002FFC37 /* SDLListFilesOperationSpec.m in Sources */,
8863747E22D650DE00D2671F /* SDLCloseApplicationSpec.m in Sources */,
162E834B1A9BDE8B00906325 /* SDLAlertManeuverResponseSpec.m in Sources */,
162E833E1A9BDE8B00906325 /* SDLShowSpec.m in Sources */,
+ 886E41412565D11200F073B8 /* SDLAlertManagerSpec.m in Sources */,
5D6035D8202CF5C900A429C9 /* TestRequestProgressResponse.m in Sources */,
162E83241A9BDE8B00906325 /* SDLAlertManeuverSpec.m in Sources */,
5D43466F1E6F55BD00B639C6 /* SDLLogManagerSpec.m in Sources */,
@@ -8582,10 +8995,12 @@
162E83821A9BDE8B00906325 /* SDLImageSpec.m in Sources */,
162E834A1A9BDE8B00906325 /* SDLAddSubMenuResponseSpec.m in Sources */,
162E830C1A9BDE8B00906325 /* SDLWarningLightStatusSpec.m in Sources */,
+ 881BBF5B255ADB8300761B7E /* SDLAlertViewSpec.m in Sources */,
1EE8C45F1F3884FF00FDC2CF /* SDLSetInteriorVehicleDataSpec.m in Sources */,
162E82E71A9BDE8B00906325 /* SDLKeyboardEventSpec.m in Sources */,
162E834E1A9BDE8B00906325 /* SDLCreateInteractionChoiceSetResponseSpec.m in Sources */,
DA9F7EB61DCC086A00ACAE48 /* SDLOasisAddressSpec.m in Sources */,
+ 8889C2ED2559C7E2004F5966 /* SDLAudioDataSpec.m in Sources */,
162E833F1A9BDE8B00906325 /* SDLSliderSpec.m in Sources */,
162E838C1A9BDE8B00906325 /* SDLSoftButtonSpec.m in Sources */,
5DA23FF81F2FAF2D009C0313 /* SDLControlFramePayloadRPCStartServiceAckSpec.m in Sources */,
@@ -8605,6 +9020,7 @@
5DBF0D601F3B3DB4008AF2C9 /* SDLControlFrameVideoStartServiceAckSpec.m in Sources */,
162E83311A9BDE8B00906325 /* SDLListFilesSpec.m in Sources */,
EE5D1B33208EBCA900D17216 /* SDLTCPTransportSpec.m in Sources */,
+ 4A5822C225E40BB5002822F1 /* NSArray+ExtensionsSpec.m in Sources */,
DA9F7EB01DCC063400ACAE48 /* SDLLocationDetailsSpec.m in Sources */,
8816772922208B82001FACFF /* SDLNavigationInstructionSpec.m in Sources */,
5DC978261B7A38640012C2F1 /* SDLGlobalsSpec.m in Sources */,
@@ -8629,13 +9045,14 @@
88E6F1B0220E25B2006156F9 /* SDLMediaServiceDataSpec.m in Sources */,
1EB59CCA202DC8E300343A61 /* SDLMassageZoneSpec.m in Sources */,
8B7B31B11F2FBD9500BDC38D /* SDLVideoStreamingFormatSpec.m in Sources */,
- 162E831D1A9BDE8B00906325 /* SDLOnSystemRequestSpec.m in Sources */,
162E835D1A9BDE8B00906325 /* SDLReadDIDResponseSpec.m in Sources */,
5DAD5F87205087430025624C /* SDLTextAndGraphicManagerSpec.m in Sources */,
162E82D41A9BDE8A00906325 /* SDLCharacterSetSpec.m in Sources */,
+ B38389D7257C187500420C11 /* SDLSeatStatusSpec.m in Sources */,
162E830F1A9BDE8B00906325 /* SDLOnAppInterfaceUnregisteredSpec.m in Sources */,
162E83971A9BDE8B00906325 /* SDLVehicleTypeSpec.m in Sources */,
887BE4D422272B2200B397C2 /* SDLControlFramePayloadConstantsSpec.m in Sources */,
+ B3A9DA1225D270EA00CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m in Sources */,
885468382225CBA400994D8D /* SDLCloudAppPropertiesSpec.m in Sources */,
88A795D5210678E000056542 /* SDLStaticIconNameSpec.m in Sources */,
1680B1131A9CD7AD00DBD79E /* SDLProtocolHeaderSpec.m in Sources */,
@@ -8665,6 +9082,7 @@
162E83081A9BDE8B00906325 /* SDLVehicleDataResultCodeSpec.m in Sources */,
5DE35E4C20CB1C1C0034BE5A /* SDLCheckChoiceVROptionalOperationSpec.m in Sources */,
8877F5EB1F34A3BE00DC128A /* SDLSendHapticDataSpec.m in Sources */,
+ C9758785257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m in Sources */,
162E83621A9BDE8B00906325 /* SDLSetDisplayLayoutResponseSpec.m in Sources */,
162E832E1A9BDE8B00906325 /* SDLEndAudioPassThruSpec.m in Sources */,
1680B1191A9CD7AD00DBD79E /* SDLV2ProtocolMessageSpec.m in Sources */,
@@ -8674,15 +9092,18 @@
1680B1171A9CD7AD00DBD79E /* SDLProtocolSpec.m in Sources */,
162E836D1A9BDE8B00906325 /* SDLUnregisterAppInterfaceResponseSpec.m in Sources */,
162E837C1A9BDE8B00906325 /* SDLECallInfoSpec.m in Sources */,
+ 886E413D2565D0D200F073B8 /* SDLPresentAlertOperationSpec.m in Sources */,
1EAA47782036BA74000FE74B /* SDLAudioControlCapabilitiesSpec.m in Sources */,
5DB1BCD51D243A8E002FFC37 /* SDLUploadFileOperationSpec.m in Sources */,
162E83401A9BDE8B00906325 /* SDLSpeakSpec.m in Sources */,
+ B3838A01257C47FD00420C11 /* SDLDoorStatusTypeSpec.m in Sources */,
88A5E7F4220B57F900495E8A /* SDLOnSystemCapabilityUpdatedSpec.m in Sources */,
5DCF76FC1ACDDB4200BB647B /* SDLSendLocationSpec.m in Sources */,
5DB1BCD81D243AA6002FFC37 /* SDLPermissionFilterSpec.m in Sources */,
88EEC5B8220A2144005AA2F9 /* SDLPublishAppServiceSpec.m in Sources */,
162E83561A9BDE8B00906325 /* SDLGenericResponseSpec.m in Sources */,
162E82D51A9BDE8A00906325 /* SDLCompassDirectionSpec.m in Sources */,
+ B3A3CE9E2522241600A7121D /* SDLAppCapabilitySpec.m in Sources */,
162E83861A9BDE8B00906325 /* SDLParameterPermissionsSpec.m in Sources */,
9FA0CFF722DF0632009CF344 /* SDLWindowTypeSpec.m in Sources */,
162E831B1A9BDE8B00906325 /* SDLOnPermissionsChangeSpec.m in Sources */,
@@ -8692,10 +9113,12 @@
1EE8C4501F38629200FDC2CF /* SDLRemoteControlCapabilitiesSpec.m in Sources */,
1EAA47662035B8D3000FE74B /* SDLLightControlDataSpec.m in Sources */,
162E82CF1A9BDE8A00906325 /* SDLBitsPerSampleSpec.m in Sources */,
+ B38389D6257C187500420C11 /* SDLSeatOccupancySpec.m in Sources */,
883581B022D659BE00405C42 /* SDLCloseApplicationResponseSpec.m in Sources */,
+ B3A3CEA025222A2900A7121D /* SDLOnAppCapabilityUpdatedSpec.m in Sources */,
162E831E1A9BDE8B00906325 /* SDLOnTBTClientStateSpec.m in Sources */,
162E83351A9BDE8B00906325 /* SDLReadDIDSpec.m in Sources */,
- 5DF40B28208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m in Sources */,
+ 4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */,
88B3BFA020DA8FD000943565 /* SDLFuelTypeSpec.m in Sources */,
162E836F1A9BDE8B00906325 /* SDLUnsubscribeVehicleDataResponseSpec.m in Sources */,
162E82DB1A9BDE8B00906325 /* SDLECallConfirmationStatusSpec.m in Sources */,
@@ -8957,7 +9380,7 @@
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example";
SWIFT_VERSION = 5.0;
@@ -8973,7 +9396,7 @@
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example";
SWIFT_VERSION = 5.0;
@@ -9016,7 +9439,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.smartdevicelink;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
@@ -9062,7 +9485,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.smartdevicelink;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
@@ -9109,6 +9532,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
+ VALIDATE_WORKSPACE = NO;
};
name = Debug;
};
@@ -9141,6 +9565,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "com.smartdevicelink.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
+ VALIDATE_WORKSPACE = NO;
};
name = Release;
};
@@ -9156,7 +9581,7 @@
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example Swift";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9178,7 +9603,7 @@
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example Swift";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9225,7 +9650,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SmartDeviceLinkSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
@@ -9276,7 +9701,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.0.0;
+ MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SmartDeviceLinkSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme
index 144ab0c4b..bc2631407 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1210"
+ LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
index a9b412148..33ef694da 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1210"
+ LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme
index 55446e4f2..de1c185e3 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1210"
+ LastUpgradeVersion = "1240"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec
index 87028fab6..e589ed9ab 100644
--- a/SmartDeviceLink.podspec
+++ b/SmartDeviceLink.podspec
@@ -1,13 +1,13 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink"
-s.version = "7.0.0"
+s.version = "7.1.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
s.author = { "SmartDeviceLink Team" => "developer@smartdevicelink.com" }
s.platform = :ios, "10.0"
-s.dependency 'BiSON', '~> 1.2.2'
+s.dependency 'BiSON', '~> 1.2.4'
s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :tag => s.version.to_s }
s.requires_arc = true
s.swift_version = '5.2'
diff --git a/SmartDeviceLink/private/NSArray+Extensions.h b/SmartDeviceLink/private/NSArray+Extensions.h
new file mode 100644
index 000000000..d88bd5033
--- /dev/null
+++ b/SmartDeviceLink/private/NSArray+Extensions.h
@@ -0,0 +1,20 @@
+//
+// NSArray+Extensions.h
+// SmartDeviceLink
+//
+// Created by Frank Elias on 2/18/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "SDLMacros.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSArray (Extensions)
+
+-(NSUInteger)dynamicHash;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/NSArray+Extensions.m b/SmartDeviceLink/private/NSArray+Extensions.m
new file mode 100644
index 000000000..c042e8ab3
--- /dev/null
+++ b/SmartDeviceLink/private/NSArray+Extensions.m
@@ -0,0 +1,26 @@
+//
+// NSArray+Extensions.m
+// SmartDeviceLink
+//
+// Created by Frank Elias on 2/18/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "NSArray+Extensions.h"
+
+@implementation NSArray (Extensions)
+
+/// A dynamic version of the NSArray `hash` method. The default `hash` method returns the number of objects in the array as its hash and this leads to clashes between arrays with the same number of objects.
+/// Instead, this method calls hash on each of it's sub-objects, XOR and rotates them, then returns this as the hash. This is much slower than the default hash method, but sometimes necessary to properly compare arrays.
+/// @returns A hash based on the hashes of all of the contained objects
+- (NSUInteger)dynamicHash {
+ NSUInteger retVal = 0;
+ for (NSUInteger i = 0; i < self.count; i++) {
+ retVal ^= NSUIntRotateCell(((NSObject *)self[i]).hash, (NSUIntBitCell / (i + 2)));
+ }
+
+ return retVal;
+}
+
+
+@end
diff --git a/SmartDeviceLink/private/SDLAlertManager.h b/SmartDeviceLink/private/SDLAlertManager.h
new file mode 100644
index 000000000..c80645b20
--- /dev/null
+++ b/SmartDeviceLink/private/SDLAlertManager.h
@@ -0,0 +1,52 @@
+//
+// SDLAlertManager.h
+// SmartDeviceLink
+//
+// Created by Nicole on 11/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLAlertView;
+@class SDLFileManager;
+@class SDLPermissionManager;
+@class SDLSystemCapabilityManager;
+
+@protocol SDLConnectionManagerType;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// Handler called when the alert either dismisses from the screen or it has failed to present
+typedef void(^SDLAlertCompletionHandler)(NSError *__nullable error);
+
+/// An alert manager that handles uploading images and audio needed by an alert, sending an alert and cancelling an alert.
+@interface SDLAlertManager : NSObject
+
+/// Initialize the manager with required dependencies
+/// @param connectionManager The connection manager object for sending RPCs
+/// @param fileManager The file manager object for uploading files
+/// @param systemCapabilityManager The system capability manager object for reading window capabilities
+/// @param permissionManager The permission manager object for checking permissions
+/// @return The alert manager
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager permissionManager:(SDLPermissionManager *)permissionManager;
+
+/// Starts the manager.
+- (void)start;
+
+/// Stops the manager.
+- (void)stop;
+
+/// Present the alert on the screen.
+///
+/// If the alert contains an audio indication with a file that needs to be uploaded, it will be uploaded before presenting the alert. If the alert contains soft buttons with images, they will be uploaded before presenting the alert. If the alert contains an icon, that will be uploaded before presenting the alert.
+///
+/// The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The error will contain `userInfo` with information on how long to wait before retrying.
+///
+/// @param alert Alert to be presented
+/// @param handler The handler to be called when the alert either dismisses from the screen or it has failed to present
+- (void)presentAlert:(SDLAlertView *)alert withCompletionHandler:(nullable SDLAlertCompletionHandler)handler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLAlertManager.m b/SmartDeviceLink/private/SDLAlertManager.m
new file mode 100644
index 000000000..2dc774869
--- /dev/null
+++ b/SmartDeviceLink/private/SDLAlertManager.m
@@ -0,0 +1,171 @@
+//
+// SDLAlertManager.m
+// SmartDeviceLink
+//
+// Created by Nicole on 11/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAlertManager.h"
+
+#import "SDLAlertView.h"
+#import "SDLDisplayCapability.h"
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLPermissionManager.h"
+#import "SDLPredefinedWindows.h"
+#import "SDLPresentAlertOperation.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLSystemCapability.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLWindowCapability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+// Assigns a set range of unique cancel ids in order to prevent overlap with other sub-screen managers that use cancel ids. If the max cancel id is reached, generation starts over from the cancel id min value.
+UInt16 const AlertCancelIdMin = 1;
+UInt16 const AlertCancelIdMax = 100;
+
+@interface SDLAlertManager()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
+@property (weak, nonatomic) SDLPermissionManager *permissionManager;
+
+@property (copy, nonatomic, nullable) SDLWindowCapability *currentWindowCapability;
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (copy, nonatomic) dispatch_queue_t readWriteQueue;
+
+@property (assign, nonatomic) UInt16 nextCancelId;
+@property (assign, nonatomic) BOOL isAlertRPCAllowed;
+
+@end
+
+@implementation SDLAlertManager
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager permissionManager:(SDLPermissionManager *)permissionManager {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _connectionManager = connectionManager;
+ _fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
+ _permissionManager = permissionManager;
+ _transactionQueue = [self sdl_newTransactionQueue];
+
+ _readWriteQueue = dispatch_queue_create_with_target("com.sdl.screenManager.alertManager.readWriteQueue", DISPATCH_QUEUE_SERIAL, [SDLGlobals sharedGlobals].sdlProcessingQueue);
+ _nextCancelId = AlertCancelIdMin;
+
+ _currentWindowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
+
+ return self;
+}
+
+- (void)start {
+ SDLLogD(@"Starting manager");
+
+ __weak typeof(self) weakself = self;
+ [self.permissionManager subscribeToRPCPermissions:@[[[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameAlert parameterPermissions:nil]] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLRPCFunctionName,SDLRPCPermissionStatus *> * _Nonnull updatedPermissionStatuses, SDLPermissionGroupStatus status) {
+ weakself.isAlertRPCAllowed = (status == SDLPermissionGroupStatusAllowed);
+
+ [weakself sdl_updateTransactionQueueSuspended];
+ }];
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate)];
+}
+
+- (void)stop {
+ SDLLogD(@"Stopping manager");
+
+ _currentWindowCapability = nil;
+ _nextCancelId = AlertCancelIdMin;
+
+ [_transactionQueue cancelAllOperations];
+ self.transactionQueue = [self sdl_newTransactionQueue];
+
+ [self.permissionManager removeAllObservers];
+ [self.systemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self];
+}
+
+- (void)presentAlert:(SDLAlertView *)alert withCompletionHandler:(nullable SDLAlertCompletionHandler)handler {
+ SDLPresentAlertOperation *op = [[SDLPresentAlertOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager systemCapabilityManager:self.systemCapabilityManager currentWindowCapability:self.currentWindowCapability alertView:alert cancelID:self.nextCancelId];
+
+ __weak typeof(op) weakPreloadOp = op;
+ op.completionBlock = ^{
+ SDLLogD(@"Alert finished presenting: %@", alert);
+
+ if (handler != nil) {
+ handler(weakPreloadOp.error);
+ }
+ };
+
+ [self.transactionQueue addOperation:op];
+}
+
+/// Creates a new serial queue. If an alert is already being presented when a new alert is added to the queue, the newest alert will not be sent until module dismisses the previous alert.
+/// The queue is initially suspended until the manager knows it can send the `Alert` RPCS without getting a disallowed response.
+/// @return A concurrent operation queue
+- (NSOperationQueue *)sdl_newTransactionQueue {
+ NSOperationQueue *queue = [[NSOperationQueue alloc] init];
+ queue.name = @"com.sdl.screenManager.alertManager.transactionQueue";
+ queue.maxConcurrentOperationCount = 1;
+ queue.qualityOfService = NSQualityOfServiceUserInteractive;
+ queue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
+ queue.suspended = YES;
+
+ return queue;
+}
+
+/// Suspend the queue if the window capabilities are nil (we assume that text and graphics are not supported yet)
+- (void)sdl_updateTransactionQueueSuspended {
+ if (self.currentWindowCapability == nil || !self.isAlertRPCAllowed) {
+ SDLLogD(@"Suspending the transaction queue. Window capabilities is nil: %@, alert has permission be sent at the current HMI level: %@", (self.currentWindowCapability == nil ? @"YES" : @"NO"), self.isAlertRPCAllowed ? @"YES" : @"NO");
+ self.transactionQueue.suspended = YES;
+ } else {
+ SDLLogD(@"Starting the transaction queue");
+ self.transactionQueue.suspended = NO;
+ }
+}
+
+/// Updates pending operations in the queue with the new window capability (i.e. the window capability will change when the template changes)
+- (void)sdl_updatePendingOperationsWithNewWindowCapability {
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if (operation.isExecuting) { continue; }
+
+ ((SDLPresentAlertOperation *)operation).currentWindowCapability = self.currentWindowCapability;
+ }
+}
+
+#pragma mark - Observers
+
+/// Called when the current window capabilities have updated.
+- (void)sdl_displayCapabilityDidUpdate {
+ self.currentWindowCapability = [self.systemCapabilityManager defaultMainWindowCapability];
+ [self sdl_updateTransactionQueueSuspended];
+ [self sdl_updatePendingOperationsWithNewWindowCapability];
+}
+
+#pragma mark - Getters
+
+/// Generates a `cancelID` for an Alert `CancelInteraction` request. `cancelID`s do not need to be unique for different RPC functions, however, we will set a max value for `cancelID`s so if a developer, for some reason, is using both the alert manager and the `Alert` RPC they can use any value above the max `cancelID` without worrying about conflicts. Once an alert with the associated `cancelID` has been dismissed, the `cancelID` can be reused so it is very unlikely there will be conflicts with an already existing generated `cancelID`.
+- (UInt16)nextCancelId {
+ __block UInt16 cancelId = 0;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ cancelId = self->_nextCancelId;
+ if (cancelId >= AlertCancelIdMax) {
+ self->_nextCancelId = AlertCancelIdMin;
+ } else {
+ self->_nextCancelId = cancelId + 1;
+ }
+ }];
+
+ return cancelId;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLCarWindow.h b/SmartDeviceLink/private/SDLCarWindow.h
index 45d2f0a62..5620d4ed9 100755
--- a/SmartDeviceLink/private/SDLCarWindow.h
+++ b/SmartDeviceLink/private/SDLCarWindow.h
@@ -9,6 +9,7 @@
@class SDLStreamingMediaConfiguration;
@class SDLStreamingVideoLifecycleManager;
+@class SDLVideoStreamingCapability;
NS_ASSUME_NONNULL_BEGIN
@@ -35,6 +36,12 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (void)syncFrame;
+/**
+ Apply the new video streaming capability to the underlying view controller
+ @param videoStreamingCapability - The video streaming capability to apply
+*/
+- (void)updateVideoStreamingCapability:(SDLVideoStreamingCapability *)videoStreamingCapability;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLCarWindow.m b/SmartDeviceLink/private/SDLCarWindow.m
index 12f2e83b7..ce5bb704f 100644
--- a/SmartDeviceLink/private/SDLCarWindow.m
+++ b/SmartDeviceLink/private/SDLCarWindow.m
@@ -22,6 +22,7 @@
#import "SDLStreamingVideoLifecycleManager.h"
#import "SDLStreamingVideoScaleManager.h"
#import "SDLStreamingMediaManagerConstants.h"
+#import "SDLVideoStreamingCapability.h"
NS_ASSUME_NONNULL_BEGIN
@@ -30,7 +31,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic, nullable) SDLStreamingVideoLifecycleManager *streamManager;
@property (assign, nonatomic) SDLCarWindowRenderingType renderingType;
-@property (assign, nonatomic) BOOL drawsAfterScreenUpdates;
@property (assign, nonatomic) BOOL allowMultipleOrientations;
@property (assign, nonatomic, getter=isLockScreenPresenting) BOOL lockScreenPresenting;
@@ -72,7 +72,12 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
- CGRect bounds = self.rootViewController.view.bounds;
+ const CGRect bounds = self.streamManager.videoScaleManager.appViewportFrame;
+ if (bounds.size.width < 1) {
+ SDLLogD(@"CarWindow: Invalid viewport frame");
+ return;
+ }
+
UIGraphicsBeginImageContextWithOptions(bounds.size, YES, 1.0f);
switch (self.renderingType) {
case SDLCarWindowRenderingTypeLayer: {
@@ -90,7 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
UIGraphicsEndImageContext();
CGImageRef imageRef = screenshot.CGImage;
- CVPixelBufferRef pixelBuffer = [self.class sdl_pixelBufferForImageRef:imageRef usingPool:self.streamManager.pixelBufferPool];
+ CVPixelBufferRef pixelBuffer = [self.class sdl_createPixelBufferForImageRef:imageRef usingPool:self.streamManager.pixelBufferPool];
if (pixelBuffer != nil) {
BOOL success = [self.streamManager sendVideoData:pixelBuffer];
if (!success) {
@@ -103,6 +108,10 @@ NS_ASSUME_NONNULL_BEGIN
}
}
+- (void)updateVideoStreamingCapability:(SDLVideoStreamingCapability *)videoStreamingCapability {
+ [self sdl_applyDisplayDimensionsToRootViewController:self.rootViewController];
+}
+
#pragma mark - SDLNavigationLockScreenManager Notifications
- (void)sdl_willPresentLockScreenViewController:(NSNotification *)notification {
self.lockScreenPresenting = YES;
@@ -162,7 +171,8 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma mark - Private Helpers
-+ (nullable CVPixelBufferRef)sdl_pixelBufferForImageRef:(CGImageRef)imageRef usingPool:(CVPixelBufferPoolRef)pool {
+
++ (nullable CVPixelBufferRef)sdl_createPixelBufferForImageRef:(CGImageRef)imageRef usingPool:(CVPixelBufferPoolRef)pool {
size_t imageWidth = CGImageGetWidth(imageRef);
size_t imageHeight = CGImageGetHeight(imageRef);
@@ -191,75 +201,18 @@ NS_ASSUME_NONNULL_BEGIN
@param rootViewController The view controller to resize
*/
- (void)sdl_applyDisplayDimensionsToRootViewController:(UIViewController *)rootViewController {
- if (self.streamManager.videoScaleManager.appViewportFrame.size.width == 0) {
+ const CGSize displaySize = self.streamManager.videoScaleManager.displayViewportResolution;
+ if (displaySize.width < 1) {
// The dimensions of the display screen is unknown because the connected head unit did not provide a screen resolution in the `RegisterAppInterfaceResponse` or in the video start service ACK.
- SDLLogW(@"The dimensions of the display's screen are unknown. The CarWindow frame will not be resized.");
+ SDLLogW(@"The display screen dimensions are unknown. The CarWindow will not resize.");
return;
}
- if (CGRectEqualToRect(rootViewController.view.frame, self.streamManager.videoScaleManager.appViewportFrame)) {
- SDLLogV(@"The rootViewController frame is already the correct size: %@", NSStringFromCGRect(rootViewController.view.frame));
- return;
- }
-
- rootViewController.view.frame = self.streamManager.videoScaleManager.appViewportFrame;
- rootViewController.view.bounds = rootViewController.view.frame;
-
- SDLLogD(@"Setting CarWindow frame to: %@", NSStringFromCGRect(rootViewController.view.frame));
-}
-
-#pragma mark Backgrounded Screen / Text
-
-+ (UIImage*)sdl_imageWithText:(NSString*)text size:(CGSize)size {
- CGRect frame = CGRectMake(0, 0, size.width, size.height);
- UIGraphicsBeginImageContextWithOptions(frame.size, NO, 1.0);
- CGContextRef context = UIGraphicsGetCurrentContext();
-
- CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
- CGContextFillRect(context, frame);
- CGContextSaveGState(context);
-
- NSMutableParagraphStyle* textStyle = NSMutableParagraphStyle.defaultParagraphStyle.mutableCopy;
- textStyle.alignment = NSTextAlignmentCenter;
-
- NSDictionary* textAttributes = @{
- NSFontAttributeName: [self sdl_fontFittingSize:frame.size forText:text],
- NSForegroundColorAttributeName: [UIColor whiteColor],
- NSParagraphStyleAttributeName: textStyle
- };
- CGRect textFrame = [text boundingRectWithSize:size
- options:NSStringDrawingUsesLineFragmentOrigin
- attributes:textAttributes
- context:nil];
-
- CGRect textInset = CGRectMake(0,
- (frame.size.height - CGRectGetHeight(textFrame)) / 2.0,
- frame.size.width,
- frame.size.height);
-
- [text drawInRect:textInset
- withAttributes:textAttributes];
-
- CGContextRestoreGState(context);
- UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
-
- return image;
-}
-
-+ (UIFont*)sdl_fontFittingSize:(CGSize)size forText:(NSString*)text {
- CGFloat fontSize = 100;
- while (fontSize > 0.0) {
- CGSize textSize = [text boundingRectWithSize:CGSizeMake(size.width, CGFLOAT_MAX)
- options:NSStringDrawingUsesLineFragmentOrigin
- attributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:fontSize]}
- context:nil].size;
-
- if (textSize.height <= size.height) { break; }
-
- fontSize -= 10.0;
- }
+ const CGRect appFrame = self.streamManager.videoScaleManager.appViewportFrame;
+ rootViewController.view.frame = appFrame;
+ rootViewController.view.bounds = appFrame;
- return [UIFont boldSystemFontOfSize:fontSize];
+ SDLLogD(@"Setting CarWindow frame to: %@ (display size: %@)", NSStringFromCGSize(appFrame.size), NSStringFromCGSize(displaySize));
}
@end
diff --git a/SmartDeviceLink/private/SDLChoiceSetManager.m b/SmartDeviceLink/private/SDLChoiceSetManager.m
index 80d691b87..1a44ef5de 100644
--- a/SmartDeviceLink/private/SDLChoiceSetManager.m
+++ b/SmartDeviceLink/private/SDLChoiceSetManager.m
@@ -38,6 +38,7 @@
#import "SDLStateMachine.h"
#import "SDLSystemCapability.h"
#import "SDLSystemCapabilityManager.h"
+#import "SDLVersion.h"
#import "SDLWindowCapability.h"
#import "SDLWindowCapability+ScreenManagerExtensions.h"
@@ -53,6 +54,7 @@ typedef NSNumber * SDLChoiceId;
@interface SDLChoiceCell()
@property (assign, nonatomic) UInt16 choiceId;
+@property (strong, nonatomic, readwrite) NSString *uniqueText;
@end
@@ -82,7 +84,10 @@ typedef NSNumber * SDLChoiceId;
@end
UInt16 const ChoiceCellIdMin = 1;
-UInt16 const ChoiceCellCancelIdMin = 1;
+
+// Assigns a set range of unique cancel ids in order to prevent overlap with other sub-screen managers that use cancel ids. If the max cancel id is reached, generation starts over from the cancel id min value.
+UInt16 const ChoiceCellCancelIdMin = 101;
+UInt16 const ChoiceCellCancelIdMax = 200;
@implementation SDLChoiceSetManager
@@ -117,7 +122,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (void)start {
SDLLogD(@"Starting manager");
- [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate:)];
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate)];
if ([self.currentState isEqualToString:SDLChoiceManagerStateShutdown]) {
[self.stateMachine transitionToState:SDLChoiceManagerStateCheckingVoiceOptional];
@@ -147,6 +152,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.name = @"com.sdl.screenManager.choiceSetManager.transactionQueue";
queue.maxConcurrentOperationCount = 1;
+ queue.qualityOfService = NSQualityOfServiceUserInteractive;
queue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
queue.suspended = YES;
@@ -225,13 +231,14 @@ UInt16 const ChoiceCellCancelIdMin = 1;
return;
}
- NSMutableSet<SDLChoiceCell *> *choicesToUpload = [[self sdl_choicesToBeUploadedWithArray:choices] mutableCopy];
+ NSMutableOrderedSet<SDLChoiceCell *> *mutableChoicesToUpload = [self sdl_choicesToBeUploadedWithArray:choices];
[SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- [choicesToUpload minusSet:self.preloadedMutableChoices];
- [choicesToUpload minusSet:self.pendingMutablePreloadChoices];
+ [mutableChoicesToUpload minusSet:self.preloadedMutableChoices];
+ [mutableChoicesToUpload minusSet:self.pendingMutablePreloadChoices];
}];
+ NSOrderedSet<SDLChoiceCell *> *choicesToUpload = [mutableChoicesToUpload copy];
if (choicesToUpload.count == 0) {
SDLLogD(@"All choices already preloaded. No need to perform a preload");
if (handler != nil) {
@@ -245,7 +252,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
// Add the preload cells to the pending preloads
[SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- [self.pendingMutablePreloadChoices unionSet:choicesToUpload];
+ [self.pendingMutablePreloadChoices unionSet:choicesToUpload.set];
}];
// Upload pending preloads
@@ -273,8 +280,8 @@ UInt16 const ChoiceCellCancelIdMin = 1;
[SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
- [strongSelf.preloadedMutableChoices unionSet:choicesToUpload];
- [strongSelf.pendingMutablePreloadChoices minusSet:choicesToUpload];
+ [strongSelf.preloadedMutableChoices unionSet:choicesToUpload.set];
+ [strongSelf.pendingMutablePreloadChoices minusSet:choicesToUpload.set];
}];
};
[self.transactionQueue addOperation:preloadOp];
@@ -378,10 +385,10 @@ UInt16 const ChoiceCellCancelIdMin = 1;
SDLPresentChoiceSetOperation *presentOp = nil;
if (delegate == nil) {
// Non-searchable choice set
- presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:nil keyboardDelegate:nil cancelID:self.nextCancelId];
+ presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:nil keyboardDelegate:nil cancelID:self.nextCancelId windowCapability:self.currentWindowCapability];
} else {
// Searchable choice set
- presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:self.keyboardConfiguration keyboardDelegate:delegate cancelID:self.nextCancelId];
+ presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:self.keyboardConfiguration keyboardDelegate:delegate cancelID:self.nextCancelId windowCapability:self.currentWindowCapability];
}
self.pendingPresentOperation = presentOp;
@@ -420,7 +427,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
SDLLogD(@"Presenting keyboard with initial text: %@", initialText);
// Present a keyboard with the choice set that we used to test VR's optional state
UInt16 keyboardCancelId = self.nextCancelId;
- self.pendingPresentOperation = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:self.connectionManager keyboardProperties:self.keyboardConfiguration initialText:initialText keyboardDelegate:delegate cancelID:keyboardCancelId];
+ self.pendingPresentOperation = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:self.connectionManager keyboardProperties:self.keyboardConfiguration initialText:initialText keyboardDelegate:delegate cancelID:keyboardCancelId windowCapability:self.currentWindowCapability];
[self.transactionQueue addOperation:self.pendingPresentOperation];
return @(keyboardCancelId);
}
@@ -443,11 +450,38 @@ UInt16 const ChoiceCellCancelIdMin = 1;
/// Checks the passed list of choices to be uploaded and returns the items that have not yet been uploaded to the module.
/// @param choices The choices to be uploaded
/// @return The choices that have not yet been uploaded to the module
-- (NSSet<SDLChoiceCell *> *)sdl_choicesToBeUploadedWithArray:(NSArray<SDLChoiceCell *> *)choices {
- NSMutableSet<SDLChoiceCell *> *choicesSet = [NSMutableSet setWithArray:choices];
+- (NSMutableOrderedSet<SDLChoiceCell *> *)sdl_choicesToBeUploadedWithArray:(NSArray<SDLChoiceCell *> *)choices {
+ NSMutableOrderedSet<SDLChoiceCell *> *choicesSet = [[NSMutableOrderedSet alloc] initWithArray:choices];
+
+ // If we're running on a connection < RPC 7.1, we need to de-duplicate cells because presenting them will fail if we have the same cell primary text.
+ SDLVersion *choiceUniquenessSupportedVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
+ if ([[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:choiceUniquenessSupportedVersion]) {
+ [self sdl_addUniqueNamesToCells:choicesSet];
+ }
[choicesSet minusSet:self.preloadedChoices];
- return [choicesSet copy];
+ return choicesSet;
+}
+
+/// Checks if 2 or more cells have the same text/title. In case this condition is true, this function will handle the presented issue by adding "(count)".
+/// E.g. Choices param contains 2 cells with text/title "Address" will be handled by updating the uniqueText/uniqueTitle of the second cell to "Address (2)".
+/// @param choices The choices to be uploaded.
+- (void)sdl_addUniqueNamesToCells:(NSOrderedSet<SDLChoiceCell *> *)choices {
+ // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
+ NSMutableDictionary<NSString *, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
+ for (SDLChoiceCell *cell in choices) {
+ NSString *cellName = cell.text;
+ NSNumber *counter = dictCounter[cellName];
+ if (counter != nil) {
+ counter = @(counter.intValue + 1);
+ dictCounter[cellName] = counter;
+ } else {
+ dictCounter[cellName] = @1;
+ }
+ if (counter.intValue > 1) {
+ cell.uniqueText = [NSString stringWithFormat: @"%@ (%d)", cell.text, counter.intValue];
+ }
+ }
}
/// Checks the passed list of choices to be deleted and returns the items that have been uploaded to the module.
@@ -472,7 +506,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
/// Assigns a unique id to each choice item.
/// @param choices An array of choices
-- (void)sdl_updateIdsOnChoices:(NSSet<SDLChoiceCell *> *)choices {
+- (void)sdl_updateIdsOnChoices:(NSOrderedSet<SDLChoiceCell *> *)choices {
for (SDLChoiceCell *cell in choices) {
cell.choiceId = self.nextChoiceId;
}
@@ -502,7 +536,10 @@ UInt16 const ChoiceCellCancelIdMin = 1;
_keyboardConfiguration = [self sdl_defaultKeyboardConfiguration];
} else {
SDLLogD(@"Updating keyboard configuration to a new configuration: %@", keyboardConfiguration);
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
_keyboardConfiguration = [[SDLKeyboardProperties alloc] initWithLanguage:keyboardConfiguration.language layout:keyboardConfiguration.keyboardLayout keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:keyboardConfiguration.limitedCharacterList autoCompleteText:keyboardConfiguration.autoCompleteText autoCompleteList:keyboardConfiguration.autoCompleteList];
+#pragma clang diagnostic pop
if (keyboardConfiguration.keypressMode != SDLKeypressModeResendCurrentEntry) {
SDLLogW(@"Attempted to set a keyboard configuration with an invalid keypress mode; only .resentCurrentEntry is valid. This value will be ignored, the rest of the properties will be set.");
@@ -511,7 +548,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
}
- (SDLKeyboardProperties *)sdl_defaultKeyboardConfiguration {
- return [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs layout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteText:nil autoCompleteList:nil];
+ return [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs keyboardLayout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
}
#pragma mark - Getters
@@ -548,7 +585,11 @@ UInt16 const ChoiceCellCancelIdMin = 1;
__block UInt16 cancelId = 0;
[SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
cancelId = self->_nextCancelId;
- self->_nextCancelId = cancelId + 1;
+ if (cancelId >= ChoiceCellCancelIdMax) {
+ self->_nextCancelId = ChoiceCellCancelIdMin;
+ } else {
+ self->_nextCancelId = cancelId + 1;
+ }
}];
return cancelId;
@@ -560,21 +601,8 @@ UInt16 const ChoiceCellCancelIdMin = 1;
#pragma mark - RPC Responses / Notifications
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
- NSArray<SDLDisplayCapability *> *capabilities = systemCapability.displayCapabilities;
- if (capabilities == nil || capabilities.count == 0) {
- self.currentWindowCapability = nil;
- } else {
- SDLDisplayCapability *mainDisplay = capabilities[0];
- for (SDLWindowCapability *windowCapability in mainDisplay.windowCapabilities) {
- NSUInteger currentWindowID = windowCapability.windowID != nil ? windowCapability.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
- if (currentWindowID != SDLPredefinedWindowsDefaultWindow) { continue; }
-
- self.currentWindowCapability = windowCapability;
- break;
- }
- }
-
+- (void)sdl_displayCapabilityDidUpdate {
+ self.currentWindowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
[self sdl_updateTransactionQueueSuspended];
}
diff --git a/SmartDeviceLink/private/SDLConnectionManagerType.h b/SmartDeviceLink/private/SDLConnectionManagerType.h
index 2602a7315..21cd8d3ab 100644
--- a/SmartDeviceLink/private/SDLConnectionManagerType.h
+++ b/SmartDeviceLink/private/SDLConnectionManagerType.h
@@ -12,12 +12,15 @@
@class SDLRPCRequest;
@class SDLRPCMessage;
@class SDLRegisterAppInterfaceResponse;
-
+@class SDLSystemInfo;
NS_ASSUME_NONNULL_BEGIN
@protocol SDLConnectionManagerType <NSObject>
+/// An object describing the properties of the connected module
+@property (strong, nonatomic, nullable) SDLSystemInfo *systemInfo;
+
/**
* A special method on the connection manager which is used by managers that must bypass the default block on RPC sends before managers complete setup.
*
diff --git a/SmartDeviceLink/private/SDLControlFramePayloadConstants.h b/SmartDeviceLink/private/SDLControlFramePayloadConstants.h
index e0bd1d5e8..ecdd4c954 100644
--- a/SmartDeviceLink/private/SDLControlFramePayloadConstants.h
+++ b/SmartDeviceLink/private/SDLControlFramePayloadConstants.h
@@ -11,18 +11,24 @@
extern int32_t const SDLControlFrameInt32NotFound;
extern int64_t const SDLControlFrameInt64NotFound;
-extern char *const SDLControlFrameProtocolVersionKey;
+extern char *const SDLControlFrameAudioServiceTransportsKey;
+extern char *const SDLControlFrameAuthTokenKey;
extern char *const SDLControlFrameHashIdKey;
+extern char *const SDLControlFrameHeightKey;
extern char *const SDLControlFrameMTUKey;
+extern char *const SDLControlFrameProtocolVersionKey;
extern char *const SDLControlFrameReasonKey;
extern char *const SDLControlFrameRejectedParams;
-extern char *const SDLControlFrameVideoProtocolKey;
-extern char *const SDLControlFrameVideoCodecKey;
-extern char *const SDLControlFrameHeightKey;
-extern char *const SDLControlFrameWidthKey;
extern char *const SDLControlFrameSecondaryTransportsKey;
-extern char *const SDLControlFrameAudioServiceTransportsKey;
-extern char *const SDLControlFrameVideoServiceTransportsKey;
extern char *const SDLControlFrameTCPIPAddressKey;
extern char *const SDLControlFrameTCPPortKey;
-extern char *const SDLControlFrameAuthTokenKey;
+extern char *const SDLControlFrameVehicleMakeKey;
+extern char *const SDLControlFrameVehicleModelKey;
+extern char *const SDLControlFrameVehicleModelYearKey;
+extern char *const SDLControlFrameVehicleHardwareVersionKey;
+extern char *const SDLControlFrameVehicleSoftwareVersionKey;
+extern char *const SDLControlFrameVehicleTrimKey;
+extern char *const SDLControlFrameVideoCodecKey;
+extern char *const SDLControlFrameVideoProtocolKey;
+extern char *const SDLControlFrameVideoServiceTransportsKey;
+extern char *const SDLControlFrameWidthKey;
diff --git a/SmartDeviceLink/private/SDLControlFramePayloadConstants.m b/SmartDeviceLink/private/SDLControlFramePayloadConstants.m
index c365c78a8..1d3e19b98 100644
--- a/SmartDeviceLink/private/SDLControlFramePayloadConstants.m
+++ b/SmartDeviceLink/private/SDLControlFramePayloadConstants.m
@@ -11,18 +11,24 @@
int32_t const SDLControlFrameInt32NotFound = -1;
int64_t const SDLControlFrameInt64NotFound = -1;
-char *const SDLControlFrameProtocolVersionKey = "protocolVersion";
-char *const SDLControlFrameHashIdKey = "hashId";
-char *const SDLControlFrameMTUKey = "mtu";
-char *const SDLControlFrameSecondaryTransportsKey = "secondaryTransports";
char *const SDLControlFrameAudioServiceTransportsKey = "audioServiceTransports";
-char *const SDLControlFrameVideoServiceTransportsKey = "videoServiceTransports";
char *const SDLControlFrameAuthTokenKey = "authToken";
+char *const SDLControlFrameHashIdKey = "hashId";
+char *const SDLControlFrameHeightKey = "height";
+char *const SDLControlFrameMTUKey = "mtu";
+char *const SDLControlFrameProtocolVersionKey = "protocolVersion";
char *const SDLControlFrameRejectedParams = "rejectedParams";
char *const SDLControlFrameReasonKey = "reason";
+char *const SDLControlFrameSecondaryTransportsKey = "secondaryTransports";
+char *const SDLControlFrameTCPIPAddressKey = "tcpIpAddress";
+char *const SDLControlFrameTCPPortKey = "tcpPort";
+char *const SDLControlFrameVehicleHardwareVersionKey = "systemHardwareVersion";
+char *const SDLControlFrameVehicleMakeKey = "make";
+char *const SDLControlFrameVehicleModelKey = "model";
+char *const SDLControlFrameVehicleModelYearKey = "modelYear";
+char *const SDLControlFrameVehicleSoftwareVersionKey = "systemSoftwareVersion";
+char *const SDLControlFrameVehicleTrimKey = "trim";
char *const SDLControlFrameVideoProtocolKey = "videoProtocol";
char *const SDLControlFrameVideoCodecKey = "videoCodec";
-char *const SDLControlFrameHeightKey = "height";
char *const SDLControlFrameWidthKey = "width";
-char *const SDLControlFrameTCPIPAddressKey = "tcpIpAddress";
-char *const SDLControlFrameTCPPortKey = "tcpPort";
+char *const SDLControlFrameVideoServiceTransportsKey = "videoServiceTransports";
diff --git a/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.h b/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.h
index 295204aac..27e860b64 100644
--- a/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.h
+++ b/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.h
@@ -35,7 +35,51 @@ NS_ASSUME_NONNULL_BEGIN
/** List of transports that are allowed to carry video service. The values can be either 1 (primary transport) or 2 (secondary transport) and are listed in preferred order. */
@property (copy, nonatomic, readonly, nullable) NSArray<NSNumber *> *videoServiceTransports;
-- (instancetype)initWithHashId:(int32_t)hashId mtu:(int64_t)mtu authToken:(nullable NSString *)authToken protocolVersion:(nullable NSString *)protocolVersion secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports videoServiceTransports:(nullable NSArray<NSNumber *> *)videoServiceTransports;
+/// The connected vehicle make, e.g. "Ford", "Toyota", or "Subaru"
+///
+/// Added in Protocol Spec 5.4
+@property (copy, nonatomic, readonly, nullable) NSString *make;
+
+/// The connected vehicle model, e.g. "Bronco", "Tundra", "Outback"
+///
+/// Added in Protocol Spec 5.4
+@property (copy, nonatomic, readonly, nullable) NSString *model;
+
+/// The connected vehicle trim, e.g. "ST"
+///
+/// Added in Protocol Spec 5.4
+@property (copy, nonatomic, readonly, nullable) NSString *trim;
+
+/// The connected vehicle model year, e.g. "2021"
+///
+/// Added in Protocol Spec 5.4
+@property (copy, nonatomic, readonly, nullable) NSString *modelYear;
+
+/// The connected vehicle module software version
+///
+/// Added in Protocol Spec 5.4
+@property (copy, nonatomic, readonly, nullable) NSString *systemSoftwareVersion;
+
+/// The connected vehicle module hardware version
+///
+/// Added in Protocol Spec 5.4
+@property (copy, nonatomic, readonly, nullable) NSString *systemHardwareVersion;
+
+/// Initialize a StartServiceACK Control Frame Payload
+/// @param hashId A hash identifying the connection
+/// @param mtu The size of a packet that can be sent over this connection without dividing it into separate packets
+/// @param authToken A cloud app authorization token
+/// @param protocolVersion The version of the protocol this connection runs over
+/// @param secondaryTransports Array of available secondary transports
+/// @param audioServiceTransports Array of transports the audio service may travel on
+/// @param videoServiceTransports Array of transports the video service may travel on
+/// @param make The connected vehicle make, e.g. "Ford", "Toyota", or "Subaru"
+/// @param model The connected vehicle model, e.g. "Bronco", "Tundra", "Outback"
+/// @param trim The connected vehicle trim, e.g. "ST"
+/// @param modelYear The connected vehicle model year, e.g. "2021"
+/// @param systemSoftwareVersion The connected vehicle module software version
+/// @param systemHardwareVersion The connected vehicle module hardware version
+- (instancetype)initWithHashId:(int32_t)hashId mtu:(int64_t)mtu authToken:(nullable NSString *)authToken protocolVersion:(nullable NSString *)protocolVersion secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports videoServiceTransports:(nullable NSArray<NSNumber *> *)videoServiceTransports make:(nullable NSString *)make model:(nullable NSString *)model trim:(nullable NSString *)trim modelYear:(nullable NSString *)modelYear systemSoftwareVersion:(nullable NSString *)systemSoftwareVersion systemHardwareVersion:(nullable NSString *)systemHardwareVersion;
@end
diff --git a/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.m b/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.m
index e6afae672..afa5ace28 100644
--- a/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.m
+++ b/SmartDeviceLink/private/SDLControlFramePayloadRPCStartServiceAck.m
@@ -23,19 +23,19 @@ NS_ASSUME_NONNULL_BEGIN
@property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *secondaryTransports;
@property (copy, nonatomic, readwrite, nullable) NSArray<NSNumber *> *audioServiceTransports;
@property (copy, nonatomic, readwrite, nullable) NSArray<NSNumber *> *videoServiceTransports;
+@property (copy, nonatomic, readwrite, nullable) NSString *make;
+@property (copy, nonatomic, readwrite, nullable) NSString *model;
+@property (copy, nonatomic, readwrite, nullable) NSString *trim;
+@property (copy, nonatomic, readwrite, nullable) NSString *modelYear;
+@property (copy, nonatomic, readwrite, nullable) NSString *systemSoftwareVersion;
+@property (copy, nonatomic, readwrite, nullable) NSString *systemHardwareVersion;
@end
@implementation SDLControlFramePayloadRPCStartServiceAck
-- (instancetype)initWithHashId:(int32_t)hashId
- mtu:(int64_t)mtu
- authToken:(nullable NSString *)authToken
- protocolVersion:(nullable NSString *)protocolVersion
- secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports
- audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports
- videoServiceTransports:(nullable NSArray<NSNumber *> *)videoServiceTransports {
+- (instancetype)initWithHashId:(int32_t)hashId mtu:(int64_t)mtu authToken:(nullable NSString *)authToken protocolVersion:(nullable NSString *)protocolVersion secondaryTransports:(nullable NSArray<NSString *> *)secondaryTransports audioServiceTransports:(nullable NSArray<NSNumber *> *)audioServiceTransports videoServiceTransports:(nullable NSArray<NSNumber *> *)videoServiceTransports make:(nullable NSString *)make model:(nullable NSString *)model trim:(nullable NSString *)trim modelYear:(nullable NSString *)modelYear systemSoftwareVersion:(nullable NSString *)systemSoftwareVersion systemHardwareVersion:(nullable NSString *)systemHardwareVersion {
self = [super init];
if (!self) return nil;
@@ -46,6 +46,12 @@ NS_ASSUME_NONNULL_BEGIN
_secondaryTransports = secondaryTransports;
_audioServiceTransports = audioServiceTransports;
_videoServiceTransports = videoServiceTransports;
+ _make = make;
+ _model = model;
+ _trim = trim;
+ _modelYear = modelYear;
+ _systemSoftwareVersion = systemSoftwareVersion;
+ _systemHardwareVersion = systemHardwareVersion;
return self;
}
@@ -105,6 +111,30 @@ NS_ASSUME_NONNULL_BEGIN
[self sdl_addServiceTransports:&payloadObject fromArray:self.audioServiceTransports forKey:SDLControlFrameAudioServiceTransportsKey];
[self sdl_addServiceTransports:&payloadObject fromArray:self.videoServiceTransports forKey:SDLControlFrameVideoServiceTransportsKey];
+ if (self.make != nil) {
+ bson_object_put_string(&payloadObject, SDLControlFrameVehicleMakeKey, (char *)self.make.UTF8String);
+ }
+
+ if (self.model != nil) {
+ bson_object_put_string(&payloadObject, SDLControlFrameVehicleModelKey, (char *)self.model.UTF8String);
+ }
+
+ if (self.trim != nil) {
+ bson_object_put_string(&payloadObject, SDLControlFrameVehicleTrimKey, (char *)self.trim.UTF8String);
+ }
+
+ if (self.modelYear != nil) {
+ bson_object_put_string(&payloadObject, SDLControlFrameVehicleModelYearKey, (char *)self.modelYear.UTF8String);
+ }
+
+ if (self.systemSoftwareVersion != nil) {
+ bson_object_put_string(&payloadObject, SDLControlFrameVehicleSoftwareVersionKey, (char *)self.systemSoftwareVersion.UTF8String);
+ }
+
+ if (self.systemHardwareVersion != nil) {
+ bson_object_put_string(&payloadObject, SDLControlFrameVehicleHardwareVersionKey, (char *)self.systemHardwareVersion.UTF8String);
+ }
+
BytePtr bsonData = bson_object_to_bytes(&payloadObject);
NSUInteger length = bson_object_size(&payloadObject);
@@ -148,6 +178,36 @@ NS_ASSUME_NONNULL_BEGIN
self.audioServiceTransports = [self sdl_getServiceTransports:&payloadObject forKey:SDLControlFrameAudioServiceTransportsKey];
self.videoServiceTransports = [self sdl_getServiceTransports:&payloadObject forKey:SDLControlFrameVideoServiceTransportsKey];
+ char *makeString = bson_object_get_string(&payloadObject, SDLControlFrameVehicleMakeKey);
+ if (makeString != NULL) {
+ self.make = [NSString stringWithUTF8String:makeString];
+ }
+
+ char *modelString = bson_object_get_string(&payloadObject, SDLControlFrameVehicleModelKey);
+ if (modelString != NULL) {
+ self.model = [NSString stringWithUTF8String:modelString];
+ }
+
+ char *trimString = bson_object_get_string(&payloadObject, SDLControlFrameVehicleTrimKey);
+ if (trimString != NULL) {
+ self.trim = [NSString stringWithUTF8String:trimString];
+ }
+
+ char *modelYearString = bson_object_get_string(&payloadObject, SDLControlFrameVehicleModelYearKey);
+ if (modelYearString != NULL) {
+ self.modelYear = [NSString stringWithUTF8String:modelYearString];
+ }
+
+ char *softwareVersionString = bson_object_get_string(&payloadObject, SDLControlFrameVehicleSoftwareVersionKey);
+ if (softwareVersionString != NULL) {
+ self.systemSoftwareVersion = [NSString stringWithUTF8String:softwareVersionString];
+ }
+
+ char *hardwareVersionString = bson_object_get_string(&payloadObject, SDLControlFrameVehicleHardwareVersionKey);
+ if (hardwareVersionString != NULL) {
+ self.systemHardwareVersion = [NSString stringWithUTF8String:hardwareVersionString];
+ }
+
bson_object_deinitialize(&payloadObject);
}
diff --git a/SmartDeviceLink/private/SDLEncryptionLifecycleManager.m b/SmartDeviceLink/private/SDLEncryptionLifecycleManager.m
index 8206a021f..a8f7b488d 100644
--- a/SmartDeviceLink/private/SDLEncryptionLifecycleManager.m
+++ b/SmartDeviceLink/private/SDLEncryptionLifecycleManager.m
@@ -25,6 +25,7 @@
#import "SDLRPCResponseNotification.h"
#import "SDLServiceEncryptionDelegate.h"
#import "SDLStateMachine.h"
+#import "SDLSystemInfo.h"
#import "SDLVehicleType.h"
NS_ASSUME_NONNULL_BEGIN
@@ -80,7 +81,6 @@ typedef NSString SDLVehicleMake;
}
}
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerAppInterfaceResponseReceived:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_permissionsDidChange:) name:SDLDidChangePermissionsNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiLevelDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
@@ -92,7 +92,13 @@ typedef NSString SDLVehicleMake;
- (void)startWithProtocol:(SDLProtocol *)protocol {
SDLLogD(@"Starting encryption manager");
_protocol = protocol;
-
+
+ // Set the security manager based on the known system info
+ self.protocol.securityManager = [self sdl_securityManagerForMake:self.connectionManager.systemInfo.vehicleType.make];
+ if ((self.protocol.securityManager != nil) && [self.protocol.securityManager respondsToSelector:@selector(setAppId:)]) {
+ self.protocol.securityManager.appId = self.configuration.lifecycleConfig.fullAppId ? self.configuration.lifecycleConfig.fullAppId : self.configuration.lifecycleConfig.appId;
+ }
+
@synchronized(self.protocol.protocolDelegateTable) {
if (![self.protocol.protocolDelegateTable containsObject:self]) {
[self.protocol.protocolDelegateTable addObject:self];
@@ -238,16 +244,6 @@ typedef NSString SDLVehicleMake;
#pragma mark - Notifications
-- (void)sdl_registerAppInterfaceResponseReceived:(SDLRPCResponseNotification *)notification {
- if (![notification isResponseMemberOfClass:[SDLRegisterAppInterfaceResponse class]]) { return; }
-
- SDLRegisterAppInterfaceResponse *registerResponse = notification.response;
- self.protocol.securityManager = [self sdl_securityManagerForMake:registerResponse.vehicleType.make];
- if (self.protocol.securityManager && [self.protocol.securityManager respondsToSelector:@selector(setAppId:)]) {
- self.protocol.securityManager.appId = self.configuration.lifecycleConfig.fullAppId ? self.configuration.lifecycleConfig.fullAppId : self.configuration.lifecycleConfig.appId;
- }
-}
-
- (void)sdl_hmiLevelDidChange:(SDLRPCNotificationNotification *)notification {
if (![notification isNotificationMemberOfClass:[SDLOnHMIStatus class]]) { return; }
diff --git a/SmartDeviceLink/private/SDLError.h b/SmartDeviceLink/private/SDLError.h
index b7fb5997c..1621d8f1b 100644
--- a/SmartDeviceLink/private/SDLError.h
+++ b/SmartDeviceLink/private/SDLError.h
@@ -55,6 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Menu Manager
+ (NSError *)sdl_menuManager_failedToUpdateWithDictionary:(NSDictionary *)userInfo;
++ (NSError *)sdl_voiceCommandManager_pendingUpdateSuperseded;
#pragma mark Choice Set Manager
@@ -64,6 +65,11 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSError *)sdl_choiceSetManager_failedToCreateMenuItems;
+ (NSError *)sdl_choiceSetManager_incorrectState:(NSString *)state;
+#pragma mark Alert Manager
+
++ (NSError *)sdl_alertManager_presentationFailedWithError:(NSError *)error tryAgainTime:(int)tryAgainTime;
++ (NSError *)sdl_alertManager_alertDataInvalid;
++ (NSError *)sdl_alertManager_alertAudioFileNotSupported;
#pragma mark System Capability Manager
@@ -94,9 +100,12 @@ NS_ASSUME_NONNULL_BEGIN
@interface NSException (SDLExceptions)
++ (NSException *)sdl_duplicateSoftButtonsNameException;
+ (NSException *)sdl_missingHandlerException;
+ (NSException *)sdl_missingIdException;
+ (NSException *)sdl_missingFilesException;
++ (NSException *)sdl_invalidTTSSpeechCapabilitiesException;
++ (NSException *)sdl_invalidAlertSoftButtonStatesException;
+ (NSException *)sdl_invalidSoftButtonStateException;
+ (NSException *)sdl_carWindowOrientationException;
+ (NSException *)sdl_invalidLockscreenSetupException;
diff --git a/SmartDeviceLink/private/SDLError.m b/SmartDeviceLink/private/SDLError.m
index 7000d49b8..35818d361 100644
--- a/SmartDeviceLink/private/SDLError.m
+++ b/SmartDeviceLink/private/SDLError.m
@@ -262,6 +262,13 @@ NS_ASSUME_NONNULL_BEGIN
return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorRPCsFailed userInfo:userInfo];
}
++ (NSError *)sdl_voiceCommandManager_pendingUpdateSuperseded {
+ return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorPendingUpdateSuperseded userInfo:@{
+ NSLocalizedDescriptionKey: @"Voice Command Manager error",
+ NSLocalizedFailureReasonErrorKey: @"Voice command operation was cancelled because it was superseded by another update"
+ }];
+}
+
#pragma mark Choice Set Manager
+ (NSError *)sdl_choiceSetManager_choicesDeletedBeforePresentation:(NSDictionary *)userInfo {
@@ -295,6 +302,37 @@ NS_ASSUME_NONNULL_BEGIN
return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorInvalidState userInfo:userInfo];
}
+#pragma mark Alert Manager
+
++ (NSError *)sdl_alertManager_presentationFailedWithError:(NSError *)error tryAgainTime:(int)tryAgainTime {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: @"The alert presentation failed",
+ NSLocalizedFailureReasonErrorKey: @"Either the alert failed to present on the module or it was dismissed early after being shown",
+ NSLocalizedRecoverySuggestionErrorKey: @"Please check the \"error\" key and the \"tryAgainTime\" keys for more information",
+ @"tryAgainTime": @(tryAgainTime),
+ @"error": error
+ };
+ return [NSError errorWithDomain:SDLErrorDomainAlertManager code:SDLAlertManagerPresentationError userInfo:userInfo];
+}
+
++ (NSError *)sdl_alertManager_alertDataInvalid {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: @"The alert data is invalid",
+ NSLocalizedFailureReasonErrorKey: @"At least either text, secondaryText or audio needs to be provided",
+ NSLocalizedRecoverySuggestionErrorKey: @"Make sure to set at least the text, secondaryText or audio properties on the SDLAlertView"
+ };
+ return [NSError errorWithDomain:SDLErrorDomainAlertManager code:SDLAlertManagerInvalidDataError userInfo:userInfo];
+}
+
++ (NSError *)sdl_alertManager_alertAudioFileNotSupported {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: @"The module does not support the use of only audio file data in an alert",
+ NSLocalizedFailureReasonErrorKey: @"The alert has no data and can not be sent to the module",
+ NSLocalizedRecoverySuggestionErrorKey: @"The use of audio file data in an alert is only supported on modules supporting RPC Spec v5.0 or newer"
+ };
+ return [NSError errorWithDomain:SDLErrorDomainAlertManager code:SDLAlertManagerInvalidDataError userInfo:userInfo];
+}
+
#pragma mark System Capability Manager
+ (NSError *)sdl_systemCapabilityManager_moduleDoesNotSupportSystemCapabilities {
@@ -400,6 +438,10 @@ NS_ASSUME_NONNULL_BEGIN
@implementation NSException (SDLExceptions)
++ (NSException *)sdl_duplicateSoftButtonsNameException {
+ return [NSException exceptionWithName:@"InvalidSoftButtonsInitialization" reason:@"Attempting to create soft buttons with the same name" userInfo:nil];
+}
+
+ (NSException *)sdl_missingHandlerException {
return [NSException
exceptionWithName:@"MissingHandlerException"
@@ -421,6 +463,14 @@ NS_ASSUME_NONNULL_BEGIN
userInfo:nil];
}
++ (NSException *)sdl_invalidTTSSpeechCapabilitiesException {
+ return [NSException exceptionWithName:@"InvalidTTSSpeechCapabilities" reason:@"Attempting to create a text-to-speech string with an invalid phonetic type. The phoneticType must be of type `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED`." userInfo:nil];
+}
+
++ (NSException *)sdl_invalidAlertSoftButtonStatesException {
+ return [NSException exceptionWithName:@"InvalidSoftButtonStates" reason:@"Attempting to create a soft button for an Alert with more than one state. Alerts only support soft buttons with one state" userInfo:nil];
+}
+
+ (NSException *)sdl_invalidSoftButtonStateException {
return [NSException exceptionWithName:@"InvalidSoftButtonState" reason:@"Attempting to transition to a state that does not exist" userInfo:nil];
}
diff --git a/SmartDeviceLink/private/SDLGlobals.h b/SmartDeviceLink/private/SDLGlobals.h
index 321fc60b4..eb1969a96 100644
--- a/SmartDeviceLink/private/SDLGlobals.h
+++ b/SmartDeviceLink/private/SDLGlobals.h
@@ -48,6 +48,8 @@ extern void *const SDLConcurrentQueueName;
/// @param block The block to run on the serial sub-queue.
+ (void)runSyncOnSerialSubQueue:(dispatch_queue_t)queue block:(void (^)(void))block;
+- (void)reset;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLGlobals.m b/SmartDeviceLink/private/SDLGlobals.m
index 00d764edb..c9a36c6c2 100644
--- a/SmartDeviceLink/private/SDLGlobals.m
+++ b/SmartDeviceLink/private/SDLGlobals.m
@@ -15,8 +15,8 @@
NS_ASSUME_NONNULL_BEGIN
// VERSION DEPENDENT CODE
-NSString *const SDLMaxProxyProtocolVersion = @"5.3.0";
-NSString *const SDLMaxProxyRPCVersion = @"7.0.0";
+NSString *const SDLMaxProxyProtocolVersion = @"5.4.0";
+NSString *const SDLMaxProxyRPCVersion = @"7.1.0";
NSUInteger const SDLDefaultMTUSize = UINT32_MAX;
NSUInteger const SDLV1MTUSize = 1024;
@@ -60,8 +60,8 @@ typedef NSNumber *MTUBox;
_rpcVersion = [[SDLVersion alloc] initWithString:@"1.0.0"];
_dynamicMTUDict = [NSMutableDictionary dictionary];
- dispatch_queue_attr_t qosSerial = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0);
- dispatch_queue_attr_t qosConcurrent = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INITIATED, 0);
+ dispatch_queue_attr_t qosSerial = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, 0);
+ dispatch_queue_attr_t qosConcurrent = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INTERACTIVE, 0);
_sdlProcessingQueue = dispatch_queue_create(SDLProcessingQueueName, qosSerial);
dispatch_queue_set_specific(_sdlProcessingQueue, SDLProcessingQueueName, SDLProcessingQueueName, NULL);
@@ -131,6 +131,12 @@ typedef NSNumber *MTUBox;
}
}
+- (void)reset {
+ _protocolVersion = [[SDLVersion alloc] initWithString:@"1.0.0"];
+ _maxHeadUnitProtocolVersion = [[SDLVersion alloc] initWithString:@"0.0.0"];
+ _rpcVersion = [[SDLVersion alloc] initWithString:@"1.0.0"];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLIAPControlSession.h b/SmartDeviceLink/private/SDLIAPControlSession.h
index 03940ef98..f9d7ea7a4 100644
--- a/SmartDeviceLink/private/SDLIAPControlSession.h
+++ b/SmartDeviceLink/private/SDLIAPControlSession.h
@@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core.
*/
-@interface SDLIAPControlSession : SDLIAPSession
+@interface SDLIAPControlSession: NSObject <SDLIAPSessionDelegate>
- (instancetype)init NS_UNAVAILABLE;
@@ -32,7 +32,27 @@ NS_ASSUME_NONNULL_BEGIN
* @param delegate The control session delegate
* @return A SDLIAPControlSession object
*/
-- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPControlSessionDelegate>)delegate;
+- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPControlSessionDelegate>)delegate forProtocol:(NSString *)protocol;
+
+/**
+ * Closes the SDLIAPSession used by the SDLIAPControlSession
+ */
+- (void)closeSession;
+
+/**
+ * Returns whether the session has open I/O streams.
+ */
+@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress;
+
+/**
+ * The accessory used to create the EASession.
+ */
+@property (nullable, strong, nonatomic, readonly) EAAccessory *accessory;
+
+/**
+ * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0.
+ */
+@property (assign, nonatomic, readonly) NSUInteger connectionID;
@end
diff --git a/SmartDeviceLink/private/SDLIAPControlSession.m b/SmartDeviceLink/private/SDLIAPControlSession.m
index 50d7a98e4..7a026a025 100644
--- a/SmartDeviceLink/private/SDLIAPControlSession.m
+++ b/SmartDeviceLink/private/SDLIAPControlSession.m
@@ -22,171 +22,67 @@ NS_ASSUME_NONNULL_BEGIN
int const ProtocolIndexTimeoutSeconds = 10;
@interface SDLIAPControlSession ()
-
@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer;
-@property (weak, nonatomic) id<SDLIAPControlSessionDelegate> delegate;
-
+@property (nullable, weak, nonatomic) id<SDLIAPControlSessionDelegate> delegate;
+@property (nullable, nonatomic, strong) SDLIAPSession *iapSession;
@end
@implementation SDLIAPControlSession
#pragma mark - Session lifecycle
-- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPControlSessionDelegate>)delegate {
- SDLLogV(@"SDLIAPControlSession init");
-
- self = [super initWithAccessory:accessory forProtocol:ControlProtocolString];
- if (!self) { return nil; }
-
+- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPControlSessionDelegate>)delegate forProtocol:(NSString *)protocol {
+ SDLLogD(@"SDLIAPControlSession init with protocol %@ and accessory %@", protocol, accessory);
+ self = [super init];
+ _iapSession = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol iAPSessionDelegate:self];
_protocolIndexTimer = nil;
_delegate = delegate;
+ SDLLogD(@"SDLIAPControlSession Waiting for the protocol string from Core, setting timeout timer for %d seconds", ProtocolIndexTimeoutSeconds);
+ self.protocolIndexTimer = [self sdl_createControlSessionProtocolIndexStringDataTimeoutTimer];
return self;
}
-#pragma mark Start
-
-- (void)startSession {
- if (self.accessory == nil) {
- SDLLogW(@"There is no control session in progress, attempting to create a new control session.");
- [self.delegate controlSessionShouldRetry];
- } else {
- SDLLogD(@"Starting a control session with accessory (%@)", self.accessory.name);
- __weak typeof(self) weakSelf = self;
- [self sdl_startStreamsWithCompletionHandler:^(BOOL success) {
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (!success) {
- SDLLogW(@"Control session failed to setup with accessory: %@. Attempting to create a new control session", strongSelf.accessory);
- [strongSelf destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- [strongSelf.delegate controlSessionShouldRetry];
- }];
- } else {
- SDLLogD(@"Waiting for the protocol string from Core, setting timeout timer for %d seconds", ProtocolIndexTimeoutSeconds);
- strongSelf.protocolIndexTimer = [strongSelf sdl_createControlSessionProtocolIndexStringDataTimeoutTimer];
- }
- }];
- }
+- (void)closeSession {
+ [self.iapSession closeSession];
}
-/// Opens the input and output streams for the session on the main thread.
-/// @discussion We must close the input/output streams from the same thread that owns the streams' run loop, otherwise if the streams are closed from another thread a random crash may occur. Since only a small amount of data will be transmitted on this stream before it is closed, we will open and close the streams on the main thread instead of creating a separate thread.
-- (void)sdl_startStreamsWithCompletionHandler:(void (^)(BOOL success))completionHandler {
- if (![super createSession]) {
- return completionHandler(NO);
- }
-
- __weak typeof(self) weakSelf = self;
- dispatch_async(dispatch_get_main_queue(), ^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
-
- SDLLogD(@"Created the control session successfully");
- [super startStream:strongSelf.eaSession.outputStream];
- [super startStream:strongSelf.eaSession.inputStream];
-
- return completionHandler(YES);
- });
+- (nullable EAAccessory *)accessory {
+ return self.iapSession.accessory;
}
-
-#pragma mark Stop
-
-/// Makes sure the session is closed and destroyed on the main thread.
-/// @param disconnectCompletionHandler Handler called when the session has disconnected
-- (void)destroySessionWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {
- SDLLogD(@"Destroying the control session");
- dispatch_async(dispatch_get_main_queue(), ^{
- [self sdl_stopAndDestroySession];
- return disconnectCompletionHandler();
- });
+- (NSUInteger)connectionID {
+ return self.iapSession.connectionID;
}
-/// Closes the session streams and then destroys the session.
-- (void)sdl_stopAndDestroySession {
- NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd));
-
- [super stopStream:self.eaSession.outputStream];
- [super stopStream:self.eaSession.inputStream];
- [super cleanupClosedSession];
+- (BOOL)isSessionInProgress {
+ return [self.iapSession isSessionInProgress];
}
-
#pragma mark - NSStreamDelegate
-/**
- * Handles events on the input/output streams of the open session.
- *
- * @param stream The stream (either input or output) that the event occured on
- * @param eventCode The stream event code
- */
-- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
- switch (eventCode) {
- case NSStreamEventOpenCompleted: {
- [self sdl_streamDidOpen:stream];
- break;
- }
- case NSStreamEventHasBytesAvailable: {
- [self sdl_streamHasBytesAvailable:(NSInputStream *)stream];
- break;
- }
- case NSStreamEventErrorOccurred: {
- [self sdl_streamDidError:stream];
- break;
- }
- case NSStreamEventEndEncountered: {
- [self sdl_streamDidEnd:stream];
- break;
- }
- case NSStreamEventNone:
- case NSStreamEventHasSpaceAvailable:
- default: {
- break;
- }
- }
-}
-/**
- * Called when the session gets a `NSStreamEventOpenCompleted`. When both the input and output streams open, start a timer to get data from Core within a certain timeframe.
- *
- * @param stream The stream that got the event code.
- */
-- (void)sdl_streamDidOpen:(NSStream *)stream {
- if (stream == [self.eaSession outputStream]) {
- SDLLogD(@"Control session output stream opened");
- self.isOutputStreamOpen = YES;
- } else if (stream == [self.eaSession inputStream]) {
- SDLLogD(@"Control session input stream opened");
- self.isInputStreamOpen = YES;
- }
-
- // When both streams are open, session initialization is complete. Let the delegate know.
- if (self.isInputStreamOpen && self.isOutputStreamOpen) {
- SDLLogV(@"Control session I/O streams opened for protocol: %@", self.protocolString);
+- (void)streamsDidOpen {
+ SDLLogD(@"SDLIAPControlSession streams opened for control session instance %@", self);
+ if (self.delegate != nil) {
[self sdl_startControlSessionProtocolIndexStringDataTimeoutTimer];
}
}
-/**
- * Called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted.
- */
-- (void)sdl_streamDidEnd:(NSStream *)stream {
- SDLLogD(@"Control stream ended");
-
- // End events come in pairs, only perform this once per set.
- [self.protocolIndexTimer cancel];
-
- __weak typeof(self) weakSelf = self;
- [self destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- [strongSelf.delegate controlSessionShouldRetry];
- }];
+- (void)streamsDidEnd {
+ SDLLogD(@"SDLIAPControlSession EASession stream ended");
+ if (self.delegate != nil) {
+ [self.delegate controlSessionDidEnd];
+ }
}
+- (void)streamHasSpaceToWrite {}
+
/**
* Called when the session gets a `NSStreamEventHasBytesAvailable` event code. A protocol string is created from the received data. Since a new session needs to be established with the protocol string, the current session is closed and a new session is created.
*/
-- (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream {
- SDLLogV(@"Control stream received data");
-
+- (void)streamHasBytesAvailable:(NSInputStream *)inputStream {
+ SDLLogV(@"SDLIAPControlSession EASession stream received data");
+
// Read in the stream a single byte at a time
uint8_t buf[1];
NSInteger len = [inputStream read:buf maxLength:1];
@@ -194,34 +90,26 @@ int const ProtocolIndexTimeoutSeconds = 10;
SDLLogV(@"No data in the control stream");
return;
}
-
- // If we have data from the control stream, use the data to create the protocol string needed to establish the data session.
+
+ // If we have data from the control stream, use the data to create the protocol string needed to establish a data session.
NSString *indexedProtocolString = [NSString stringWithFormat:@"%@%@", IndexedProtocolStringPrefix, @(buf[0])];
- SDLLogD(@"Control Stream will switch to protocol %@", indexedProtocolString);
-
- // Destroy the control session as it is no longer needed, and then create the data session.
- __weak typeof(self) weakSelf = self;
- [self destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (strongSelf.accessory.isConnected) {
- [strongSelf.protocolIndexTimer cancel];
- [strongSelf.delegate controlSession:strongSelf didReceiveProtocolString:indexedProtocolString];
- }
- }];
+ SDLLogD(@"SDLIAPControlSession EASession Stream will switch to protocol %@", indexedProtocolString);
+
+ [self.protocolIndexTimer cancel];
+ if (self.delegate != nil) {
+ [self.delegate controlSession:self didReceiveProtocolString:indexedProtocolString];
+ }
}
/**
* Called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted.
*/
-- (void)sdl_streamDidError:(NSStream *)stream {
- SDLLogE(@"Control stream error");
-
+- (void)streamDidError {
+ SDLLogE(@"SDLIAPControlSession stream error");
[self.protocolIndexTimer cancel];
- __weak typeof(self) weakSelf = self;
- [self destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- [strongSelf.delegate controlSessionShouldRetry];
- }];
+ if (self.delegate != nil) {
+ [self.delegate controlSessionDidEnd];
+ }
}
#pragma mark - Timer
@@ -233,17 +121,14 @@ int const ProtocolIndexTimeoutSeconds = 10;
*/
- (SDLTimer *)sdl_createControlSessionProtocolIndexStringDataTimeoutTimer {
SDLTimer *protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO];
-
__weak typeof(self) weakSelf = self;
void (^elapsedBlock)(void) = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
- SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds);
- [strongSelf destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- [strongSelf.delegate controlSessionShouldRetry];
- }];
+ SDLLogW(@"SDLIAPControlSession failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds);
+ if (self.delegate != nil) {
+ [strongSelf.delegate controlSessionDidEnd];
+ }
};
-
protocolIndexTimer.elapsedBlock = elapsedBlock;
return protocolIndexTimer;
}
@@ -259,3 +144,5 @@ int const ProtocolIndexTimeoutSeconds = 10;
@end
NS_ASSUME_NONNULL_END
+
+
diff --git a/SmartDeviceLink/private/SDLIAPControlSessionDelegate.h b/SmartDeviceLink/private/SDLIAPControlSessionDelegate.h
index 67ba2b042..0b5946fdd 100644
--- a/SmartDeviceLink/private/SDLIAPControlSessionDelegate.h
+++ b/SmartDeviceLink/private/SDLIAPControlSessionDelegate.h
@@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
@protocol SDLIAPControlSessionDelegate <NSObject>
-- (void)controlSessionShouldRetry;
+- (void)controlSessionDidEnd;
- (void)controlSession:(SDLIAPControlSession *)controlSession didReceiveProtocolString:(NSString *)protocolString;
@end
diff --git a/SmartDeviceLink/private/SDLIAPDataSession.h b/SmartDeviceLink/private/SDLIAPDataSession.h
index 463af6e9f..21917fc8a 100644
--- a/SmartDeviceLink/private/SDLIAPDataSession.h
+++ b/SmartDeviceLink/private/SDLIAPDataSession.h
@@ -7,7 +7,6 @@
//
#import <Foundation/Foundation.h>
-
#import "SDLIAPSession.h"
@protocol SDLIAPDataSessionDelegate;
@@ -15,11 +14,25 @@
NS_ASSUME_NONNULL_BEGIN
-@interface SDLIAPDataSession : SDLIAPSession
+@interface SDLIAPDataSession: NSObject <SDLIAPSessionDelegate>
- (instancetype)init NS_UNAVAILABLE;
/**
+ * Returns whether the session has open I/O streams.
+ */
+@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress;
+
+/**
+ * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0.
+ */
+@property (assign, nonatomic, readonly) NSUInteger connectionID;
+
+/**
+ * The accessory with which to open a session.
+ */
+@property (nullable, strong, nonatomic, readonly) EAAccessory *accessory;
+/**
* Creates a new data session.
*
* @param accessory The new connected accessory.
@@ -29,6 +42,11 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPDataSessionDelegate>)delegate forProtocol:(NSString *)protocol;
/**
+ * Closes the SDLIAPSession used by the SDLIAPDataSession
+ */
+- (void)closeSession;
+
+/**
* Sends data to Core via the data session.
*
* @param data The data to send to Core
@@ -38,3 +56,4 @@ NS_ASSUME_NONNULL_BEGIN
@end
NS_ASSUME_NONNULL_END
+
diff --git a/SmartDeviceLink/private/SDLIAPDataSession.m b/SmartDeviceLink/private/SDLIAPDataSession.m
index 785573fde..8c6cc84e8 100644
--- a/SmartDeviceLink/private/SDLIAPDataSession.m
+++ b/SmartDeviceLink/private/SDLIAPDataSession.m
@@ -7,27 +7,21 @@
//
#import "SDLIAPDataSession.h"
-
#import "SDLGlobals.h"
#import "SDLIAPConstants.h"
#import "SDLIAPDataSessionDelegate.h"
#import "SDLIAPSession.h"
#import "SDLLogMacros.h"
#import "SDLMutableDataQueue.h"
-
-NSString *const IOStreamThreadName = @"com.smartdevicelink.iostream";
-NSTimeInterval const IOStreamThreadCanceledSemaphoreWaitSecs = 1.0;
+#import "SDLLifecycleManager.h"
NS_ASSUME_NONNULL_BEGIN
@interface SDLIAPDataSession ()
-@property (nullable, nonatomic, strong) NSThread *ioStreamThread;
-@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue;
+@property (nullable, nonatomic, strong) SDLIAPSession *iapSession;
@property (weak, nonatomic) id<SDLIAPDataSessionDelegate> delegate;
-/// A semaphore used to block the current thread until we know that the I/O streams have been shutdown on the ioStreamThread
-@property (nonatomic, strong) dispatch_semaphore_t ioStreamThreadCancelledSemaphore;
-
+@property (nullable, nonatomic, strong) SDLMutableDataQueue *sendDataQueue;
@end
@implementation SDLIAPDataSession
@@ -35,341 +29,124 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Lifecycle
- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPDataSessionDelegate>)delegate forProtocol:(NSString *)protocol; {
- SDLLogV(@"iAP data session init for accessory: %@", accessory);
-
- self = [super initWithAccessory:accessory forProtocol:protocol];
- if (!self) { return nil; }
-
+ SDLLogD(@"SDLIAPDataSession iAP data session init for accessory: %@", accessory);
+ self = [super init];
_delegate = delegate;
+ _iapSession = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol iAPSessionDelegate:self];
_sendDataQueue = [[SDLMutableDataQueue alloc] init];
- _ioStreamThreadCancelledSemaphore = dispatch_semaphore_create(0);
-
return self;
}
-
-#pragma mark Start
-
-- (void)startSession {
- if (self.accessory == nil) {
- SDLLogW(@"Failed to setup data session");
- if (self.delegate == nil) { return; }
- [self.delegate dataSessionShouldRetry];
- } else {
- SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.accessory.name, self.protocolString);
-
- if (![super createSession]) {
- SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.accessory);
- __weak typeof(self) weakSelf = self;
- [self destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (strongSelf.delegate == nil) { return; }
- [strongSelf.delegate dataSessionShouldRetry];
- }];
- }
-
- if (self.eaSession != nil) {
- self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil];
- [self.ioStreamThread setName:IOStreamThreadName];
- [self.ioStreamThread start];
- }
- }
-}
-
-#pragma mark Stop
-
-/// Waits for the ioStreamThread to close and destroy the I/O streams.
-/// @param disconnectCompletionHandler Handler called when the session has disconnected
-- (void)destroySessionWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {
- SDLLogD(@"Destroying the data session");
-
- if (self.ioStreamThread == nil) {
- SDLLogV(@"No data session established");
- [super cleanupClosedSession];
- return disconnectCompletionHandler();
- }
-
- // Tell the ioStreamThread to shutdown the I/O streams. The I/O streams must be opened and closed on the same thread; if they are not, random crashes can occur. Dispatch this task to the main queue to ensure that this task is performed on the Main Thread. We are using the Main Thread for ease since we don't want to create a separate thread just to wait on closing the I/O streams. Using the Main Thread ensures that semaphore wait is not called from ioStreamThread, which would block the ioStreamThread and prevent shutdown.
- __weak typeof(self) weakSelf = self;
- dispatch_async(dispatch_get_main_queue(), ^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
-
- // Attempt to cancel the ioStreamThread. Once the thread realizes it has been cancelled, it will cleanup the I/O streams. Make sure to wake up the run loop in case there is no current I/O event running on the ioThread.
- [strongSelf.ioStreamThread cancel];
- [strongSelf performSelector:@selector(sdl_doNothing) onThread:self.ioStreamThread withObject:nil waitUntilDone:NO];
-
- // Block the thread until the semaphore has been released by the ioStreamThread (or a timeout has occured).
- BOOL cancelledSuccessfully = [strongSelf sdl_isIOThreadCancelled];
- if (!cancelledSuccessfully) {
- SDLLogE(@"The I/O streams were not shut down successfully. We might not be able to create a new session with an accessory during the same app session. If this happens, only force quitting and restarting the app will allow new sessions.");
- }
-
- [strongSelf.sendDataQueue removeAllObjects];
-
- disconnectCompletionHandler();
- });
+- (void)closeSession {
+ [self.iapSession closeSession];
}
-/// Wait for the ioStreamThread to destroy the I/O streams. Make sure this method is not called on the ioStreamThread, as it will block the thread until the timeout occurs.
-/// @return Whether or not the session's I/O streams were closed successfully.
-- (BOOL)sdl_isIOThreadCancelled {
- NSAssert(![NSThread.currentThread.name isEqualToString:IOStreamThreadName], @"%@ must not be called from the ioStreamThread!", NSStringFromSelector(_cmd));
-
- long lWait = dispatch_semaphore_wait(self.ioStreamThreadCancelledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(IOStreamThreadCanceledSemaphoreWaitSecs * NSEC_PER_SEC)));
- if (lWait == 0) {
- SDLLogD(@"ioStreamThread cancelled successfully");
- return YES;
- }
-
- SDLLogE(@"Failed to cancel ioStreamThread within %.1f seconds", IOStreamThreadCanceledSemaphoreWaitSecs);
- return NO;
-}
-
-/// Helper method for waking up the ioStreamThread.
-- (void)sdl_doNothing {}
-
-#pragma mark - Sending data
-
- (void)sendData:(NSData *)data {
- // Enqueue the data for transmission on the IO thread
[self.sendDataQueue enqueueBuffer:data.mutableCopy];
-
- [self performSelector:@selector(sdl_dequeueAndWriteToOutputStream) onThread:self.ioStreamThread withObject:nil waitUntilDone:NO];
-}
-
-/**
- * Sends any queued data to Core on the output stream for the session.
- */
-- (void)sdl_dequeueAndWriteToOutputStream {
- if ([self.ioStreamThread isCancelled]) {
- SDLLogW(@"Attempted to send data on I/O thread but the thread is cancelled.");
- return;
- }
-
- NSOutputStream *ostream = self.eaSession.outputStream;
- if (!ostream.hasSpaceAvailable) {
- SDLLogV(@"Attempted to send data with output stream but there is no space available.");
+ if (!self.iapSession.hasSpaceAvailable) {
+ SDLLogD(@"SDLIAPDataSession needs to send data but no space available on IAPSession %@.", self.iapSession);
return;
}
+ [self writeDataToSessionStream];
+}
+- (void)writeDataToSessionStream {
NSMutableData *remainder = [self.sendDataQueue frontBuffer];
- if (remainder == nil) {
- SDLLogV(@"No more data to write to data session's output stream. Returning");
- return;
- }
-
- NSUInteger bytesRemaining = remainder.length;
- NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining];
-
- if (bytesWritten < 0) {
- if (ostream.streamError != nil) {
- // Once a stream has reported an error, it cannot be re-used for read or write operations. Shut down the stream and attempt to create a new session.
- [self sdl_streamDidError:ostream];
- } else {
- // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory.
- SDLLogE(@"Output stream write operation failed");
- }
- } else if (bytesWritten == bytesRemaining) {
- // Remove the data from the queue
- [self.sendDataQueue popBuffer];
+ if (remainder != nil) {
+ NSUInteger bytesRemaining = remainder.length;
+ [self.iapSession write:remainder length:bytesRemaining withCompletionHandler:^(NSInteger bytesWritten) {
+ if (bytesWritten >= 0) {
+ if (bytesWritten == bytesRemaining) {
+ [self.sendDataQueue popBuffer];
+ } else {
+ // Cleave the sent bytes from the data, the remainder will sit at the head of the queue
+ SDLLogD(@"SDLIAPDataSession writeDataToSessionStream bytes written %ld", (long)bytesWritten);
+ [remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0];
+ }
+ } else {
+ // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory.
+ SDLLogE(@"Output stream write operation failed");
+ }
+ }];
} else {
- // Cleave the sent bytes from the data, the remainder will sit at the head of the queue
- [remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0];
+ SDLLogD(@"No more data to write to data session's output stream for IAPSession %@", self.iapSession);
+ return;
}
}
-#pragma mark - NSStreamDelegate
-
-/**
- * Handles events on the input/output streams of the open session.
- *
- * @param stream The stream (either input or output) that the event occured on
- * @param eventCode The stream event code
- */
-- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
- switch (eventCode) {
- case NSStreamEventOpenCompleted: {
- [self sdl_streamDidOpen:stream];
- break;
- }
- case NSStreamEventHasBytesAvailable: {
- [self sdl_streamHasBytesAvailable:(NSInputStream *)stream];
- break;
- }
- case NSStreamEventHasSpaceAvailable: {
- [self sdl_streamHasSpaceToWrite];
- break;
- }
- case NSStreamEventErrorOccurred: {
- [self sdl_streamDidError:stream];
- break;
- }
- case NSStreamEventEndEncountered: {
- [self sdl_streamDidEnd:stream];
- break;
- }
- case NSStreamEventNone:
- default: {
- break;
- }
- }
-}
+#pragma mark - Sending data
-/**
- * Called when the session gets a `NSStreamEventOpenCompleted`. When both the input and output streams open, notify the lifecycle manager that a connection has been established with the accessory.
- *
- * @param stream The stream that got the event code.
- */
-- (void)sdl_streamDidOpen:(NSStream *)stream {
- if (stream == [self.eaSession outputStream]) {
- SDLLogD(@"Data session output stream opened");
- self.isOutputStreamOpen = YES;
- } else if (stream == [self.eaSession inputStream]) {
- SDLLogD(@"Data session input stream opened");
- self.isInputStreamOpen = YES;
- }
+#pragma mark - NSStreamDelegate
- // When both streams are open, session initialization is complete. Let the delegate know.
- if (self.isInputStreamOpen && self.isOutputStreamOpen) {
- SDLLogV(@"Data session I/O streams opened for protocol: %@", self.protocolString);
- if (self.delegate == nil) { return; }
+- (void)streamsDidOpen {
+ SDLLogD(@"SDLIAPDataSession streams opened for data session instance %@", self);
+ if (self.delegate != nil) {
[self.delegate dataSessionDidConnect];
}
}
-/**
- * Called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted.
- */
-- (void)sdl_streamDidEnd:(NSStream *)stream {
- NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd));
-
- SDLLogD(@"Data stream ended");
- if (self.accessory == nil) {
- SDLLogD(@"Data session is nil");
- return;
- }
-
- // The handler will be called on the I/O thread, but the session stop method must be called on the main thread
- dispatch_async(dispatch_get_main_queue(), ^{
- __weak typeof(self) weakSelf = self;
- [self destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (strongSelf.delegate == nil) { return; }
- [strongSelf.delegate dataSessionShouldRetry];
- }];
- });
-
- // To prevent deadlocks the handler must return to the runloop and not block the thread
+- (void)streamHasSpaceToWrite {
+ [self writeDataToSessionStream];
}
-/**
- * Called when the session gets a `NSStreamEventHasBytesAvailable` event code. The data is passed to the listener.
- */
-- (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream {
- NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd));
+- (void)streamHasBytesAvailable:(NSInputStream *)inputStream {
uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]];
+ // It is necessary to check the stream status and whether there are bytes available
+ // because the dataStreamHasBytesHandler is executed on the IO thread and
+ // the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate
+ // if the main thread is tearing down the transport.
while (inputStream.streamStatus == NSStreamStatusOpen && inputStream.hasBytesAvailable) {
- // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport.
NSInteger bytesRead = [inputStream read:buf maxLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]];
if (bytesRead < 0) {
- SDLLogE(@"Failed to read from data stream");
+ SDLLogE(@"Failed to read from EASession data stream %@", inputStream);
break;
}
-
NSData *dataIn = [NSData dataWithBytes:buf length:(NSUInteger)bytesRead];
SDLLogBytes(dataIn, SDLLogBytesDirectionReceive);
if (bytesRead > 0) {
- if (self.delegate == nil) { return; }
- [self.delegate dataSessionDidReceiveData:dataIn];
+ if (self.delegate != nil) {
+ [self.delegate dataSessionDidReceiveData:dataIn];
+ }
} else {
break;
}
}
}
-/**
- * Called when the session gets a `NSStreamEventHasSpaceAvailable` event code. Send any queued data to Core.
- */
-- (void)sdl_streamHasSpaceToWrite {
- [self sdl_dequeueAndWriteToOutputStream];
-}
-
-/**
- * Called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted.
- */
-- (void)sdl_streamDidError:(NSStream *)stream {
- NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd));
-
- SDLLogE(@"Data session %s stream errored", stream == self.eaSession.inputStream ? "input" : "output");
-
- // To prevent deadlocks the handler must return to the runloop and not block the thread
- dispatch_async(dispatch_get_main_queue(), ^{
- __weak typeof(self) weakSelf = self;
- [self destroySessionWithCompletionHandler:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (![strongSelf.protocolString isEqualToString:LegacyProtocolString]) {
- if (strongSelf.delegate == nil) { return; }
- [strongSelf.delegate dataSessionShouldRetry];
- }
- }];
- });
+- (void)streamsDidEnd {
+ SDLLogD(@"SDLIAPDataSession EASession streamsDidEnd");
+ if (self.delegate != nil) {
+ [self.delegate dataSessionDidEnd];
+ }
}
-#pragma mark - Stream lifecycle
-
-// Data session I/O thread
-- (void)sdl_accessoryEventLoop {
- @autoreleasepool {
- NSAssert(self.eaSession != nil, @"Session must be assigned before calling");
- if (!self.eaSession) {
- return;
- }
-
- [self startStream:self.eaSession.inputStream];
- [self startStream:self.eaSession.outputStream];
-
- SDLLogD(@"Starting the accessory event loop on thread: %@", NSThread.currentThread.name);
-
- while (self.ioStreamThread != nil && !self.ioStreamThread.cancelled) {
- // Enqueued data will be written to and read from the streams in the runloop
- [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25f]];
+- (void)streamDidError {
+ SDLLogD(@"SDLIAPDataSession EASession streamDidError");
+ if (![self.iapSession.protocolString isEqualToString:LegacyProtocolString]) {
+ [self.sendDataQueue removeAllObjects];
+ if (self.delegate != nil) {
+ [self.delegate dataSessionDidEnd];
}
-
- SDLLogD(@"Closing the accessory event loop on thread: %@", NSThread.currentThread.name);
-
- // Close I/O streams
- [self sdl_closeSession];
- [super cleanupClosedSession];
-
- // If a thread is blocked waiting on the I/O streams to shutdown, let the thread know that shutdown has completed.
- dispatch_semaphore_signal(self.ioStreamThreadCancelledSemaphore);
}
}
-// Must be called on accessoryEventLoop.
-- (void)sdl_closeSession {
- if (self.eaSession == nil) {
- return;
- }
-
- SDLLogD(@"Closing EASession for accessory connection id: %tu, name: %@", self.connectionID, self.eaSession.accessory.name);
+#pragma mark Getters
- [self stopStream:[self.eaSession inputStream]];
- [self stopStream:[self.eaSession outputStream]];
+- (nullable EAAccessory *) accessory {
+ return self.iapSession.accessory;
}
-- (void)startStream:(NSStream *)stream {
- NSAssert([[NSThread currentThread] isEqual:self.ioStreamThread] || [NSThread isMainThread], @"startStream is being called on the wrong thread!!!");
- [super startStream:stream];
+- (NSUInteger)connectionID {
+ return self.iapSession.connectionID;
}
-- (void)stopStream:(NSStream *)stream {
- NSAssert([[NSThread currentThread] isEqual:self.ioStreamThread] || [NSThread isMainThread], @"stopStream is being called on the wrong thread!!!");
- [super stopStream:stream];
+- (BOOL)isSessionInProgress {
+ return [self.iapSession isSessionInProgress];
}
-
@end
NS_ASSUME_NONNULL_END
+
+
diff --git a/SmartDeviceLink/private/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/private/SDLIAPDataSessionDelegate.h
index 687da5f56..7d864b20f 100644
--- a/SmartDeviceLink/private/SDLIAPDataSessionDelegate.h
+++ b/SmartDeviceLink/private/SDLIAPDataSessionDelegate.h
@@ -12,10 +12,11 @@ NS_ASSUME_NONNULL_BEGIN
@protocol SDLIAPDataSessionDelegate <NSObject>
-- (void)dataSessionShouldRetry;
+- (void)dataSessionDidEnd;
- (void)dataSessionDidReceiveData:(NSData *)data;
- (void)dataSessionDidConnect;
@end
NS_ASSUME_NONNULL_END
+
diff --git a/SmartDeviceLink/private/SDLIAPSession.h b/SmartDeviceLink/private/SDLIAPSession.h
index 6bc62ed5f..208597dbe 100644
--- a/SmartDeviceLink/private/SDLIAPSession.h
+++ b/SmartDeviceLink/private/SDLIAPSession.h
@@ -8,38 +8,44 @@
NS_ASSUME_NONNULL_BEGIN
+@protocol SDLIAPSessionDelegate <NSObject>
-@interface SDLIAPSession : NSObject <NSStreamDelegate>
-
-/**
- * The accessory with which to open a session.
- */
-@property (nullable, strong, nonatomic, readonly) EAAccessory *accessory;
+- (void)streamsDidOpen;
+- (void)streamsDidEnd;
+- (void)streamHasSpaceToWrite;
+- (void)streamDidError;
+- (void)streamHasBytesAvailable:(NSInputStream *)inputStream;
+@end
/**
- * The session created between the app and the accessory.
+ * Responsible for opening a connection with the accessory and transmitting data to and from the accessory. When the accessory disconnects, the connection is closed.
+ * Once the connection with the accessory is closed, the connection can not be reopened; instead, a new `SDLIAPSession` must be created.
*/
-@property (nullable, strong, nonatomic, readonly) EASession *eaSession;
+@interface SDLIAPSession : NSObject <NSStreamDelegate>
/**
- * The unique protocol string used to create the session with the accessory.
+ * Starts a session with the accessory.
+ *
+ * @param accessory The accessory with which to open a session
+ * @param protocol The unique protocol string used to create the session with the accessory
+ * @return A SDLIAPSession object
*/
-@property (nullable, strong, nonatomic, readonly) NSString *protocolString;
+- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory forProtocol:(NSString *)protocol iAPSessionDelegate:(id<SDLIAPSessionDelegate>)iAPSessionDelegate;
/**
- * Returns whether or not both the input and output streams for the session are closed.
+ * The accessory that was used when creating a SLDLIAPSession instance.
*/
-@property (assign, readonly, getter=isStopped) BOOL stopped;
+@property (nullable, strong, nonatomic, readonly) EAAccessory *accessory;
/**
- * The input stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the input stream. The input stream is closed when the stream status is `NSStreamStatusClosed`.
+ * @returns True if both inputStream and outputStream are open
*/
-@property (nonatomic, assign) BOOL isInputStreamOpen;
+@property(nonatomic, assign, readonly) BOOL bothStreamsOpen;
/**
- * The output stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the output stream. The output stream has been closed when the stream status is `NSStreamStatusClosed`.
+ * Closes the session's input and output streams. Once closed, the session can not be reopened.
*/
-@property (nonatomic, assign) BOOL isOutputStreamOpen;
+- (void)closeSession;
/**
* The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0.
@@ -47,55 +53,34 @@ NS_ASSUME_NONNULL_BEGIN
@property (assign, nonatomic, readonly) NSUInteger connectionID;
/**
- * Returns whether the session has open I/O streams.
+ * @returns True if the outputStream has space available to write data
*/
-@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress;
+@property(nonatomic, assign, readonly) BOOL hasSpaceAvailable;
/**
- * Convenience initializer for setting an accessory and protocol string.
- *
- * @param accessory The accessory with which to open a session
- * @param protocol The unique protocol string used to create the session with the accessory
- * @return A SDLIAPSession object
- */
-- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory forProtocol:(NSString *)protocol;
-
-/**
- * Starts a session.
+ * @returns True if the sessions EAAccessory is connected
*/
-- (void)startSession;
-
-/// Stops the current session.
-/// @param disconnectCompletionHandler Handler called when the session has been closed
-- (void)destroySessionWithCompletionHandler:(void (^)(void))disconnectCompletionHandler;
+@property(nonatomic, assign, readonly) BOOL isConnected;
/**
- * Creates a session with the accessory.
- *
- * @return Whether or not the session was created successfully
+ * @returns True if either the inputStream or the outputStream is open
*/
-- (BOOL)createSession;
+@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress;
/**
- * Starts a session input or output stream.
- *
- * @param stream The stream to be started.
+ * The unique protocol string used to create the session with the accessory.
*/
-- (void)startStream:(NSStream *)stream;
+@property (nullable, strong, nonatomic, readonly) NSString *protocolString;
/**
- * Stops a session input or output stream.
*
- * @param stream The stream to be stopped.
- */
-- (void)stopStream:(NSStream *)stream;
-
-/**
- * Cleans up a closed session
+ * @param data The data written to the EASession outputStream
+ * @param length The number of data bytes to write
+ * @param completionHandler The number of data bytes actually written
*/
-- (void)cleanupClosedSession;
-
+- (void)write:(NSMutableData *)data length:(NSUInteger)length withCompletionHandler:(void (^)(NSInteger bytesWritten))completionHandler;
@end
NS_ASSUME_NONNULL_END
+
diff --git a/SmartDeviceLink/private/SDLIAPSession.m b/SmartDeviceLink/private/SDLIAPSession.m
index eaf79725f..ee64b7f1b 100644
--- a/SmartDeviceLink/private/SDLIAPSession.m
+++ b/SmartDeviceLink/private/SDLIAPSession.m
@@ -11,99 +11,285 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLIAPSession ()
-@property (nullable, strong, nonatomic, readwrite) EASession *eaSession;
+@property (nullable, nonatomic, weak) id<SDLIAPSessionDelegate> iAPSessionDelegate;
@property (nullable, strong, nonatomic, readwrite) EAAccessory *accessory;
+@property (nullable, strong, nonatomic, readwrite) EASession *eaSession;
+@property (copy, nonatomic) dispatch_queue_t iapSessionQueue;
@property (nullable, strong, nonatomic, readwrite) NSString *protocolString;
+@property (nonatomic) BOOL inputStreamOpen;
+@property (nonatomic) BOOL outputStreamOpen;
+@property (nonatomic) BOOL runTheLoop;
+@property (nonatomic, weak) NSThread *sessionThread;
+
@end
@implementation SDLIAPSession
#pragma mark - Lifecycle
-- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory forProtocol:(NSString *)protocol {
+- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory
+ forProtocol:(NSString *)protocol
+ iAPSessionDelegate:(id<SDLIAPSessionDelegate>)iAPSessionDelegate {
SDLLogD(@"SDLIAPSession init with accessory:%@ for protocol:%@", accessory.name, protocol);
-
self = [super init];
if (!self) { return nil; }
-
_accessory = accessory;
+ _iAPSessionDelegate = iAPSessionDelegate;
+ _inputStreamOpen = NO;
+ _outputStreamOpen = NO;
_protocolString = protocol;
- _isInputStreamOpen = NO;
- _isOutputStreamOpen = NO;
-
+ _runTheLoop = NO;
+ _iapSessionQueue = dispatch_queue_create("com.sdl.iapsession", DISPATCH_QUEUE_SERIAL);
+ [self sdl_startSession];
return self;
}
-#pragma mark - Abstract Methods
-
-- (void)startSession {}
+- (void)dealloc {
+ if (self.eaSession != nil && self.sessionThread != nil) {
+ [self performSelector:@selector(sdl_peformCloseSession) onThread:self.sessionThread withObject:nil waitUntilDone:YES];
+ }
+}
-- (void)destroySessionWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {}
+- (void)closeSession {
+ bool waitUntilDone = NO;
+ if (NSThread.currentThread == self.sessionThread) {
+ waitUntilDone = YES;
+ }
+ [self performSelector:@selector(sdl_peformCloseSession) onThread:self.sessionThread withObject:nil waitUntilDone:waitUntilDone];
+}
-#pragma mark - Private Stream Lifecycle Helpers
+- (void)write:(NSMutableData *) data length: (NSUInteger) length withCompletionHandler:(void (^)(NSInteger bytesWritten))completionHandler {
+ NSInteger bytesWritten = [self write:data.bytes maxLength: length];
+ completionHandler(bytesWritten);
+}
-- (BOOL)createSession {
- SDLLogD(@"Opening EASession with accessory: %@", self.accessory.name);
- self.eaSession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocolString];
- return (self.eaSession != nil);
+- (NSInteger)write:(const uint8_t *)buffer maxLength:(NSUInteger)len {
+ return [self.eaSession.outputStream write:buffer maxLength:len];
}
-- (void)startStream:(NSStream *)stream {
- stream.delegate = self;
- [stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- [stream open];
+#pragma mark - Private Stream Helpers
+
+- (void)sdl_startSession {
+ dispatch_async(self.iapSessionQueue, ^{
+ self.eaSession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocolString];
+ self.sessionThread = NSThread.currentThread;
+ SDLLogD(@"Created EASession with %@ Protocol and EASession is %@", self.protocolString, self.eaSession);
+ if (self.eaSession != nil) {
+ [self sdl_openStreams];
+ [self sdl_startStreamRunLoop];
+ } else {
+ SDLLogD(@"Failed to create EASession with Protocol : %@", self.protocolString);
+ }
+ });
}
-- (void)stopStream:(NSStream *)stream {
- // Verify stream is in a state that can be closed. Closing a stream that has not been opened has very bad effects.
- NSUInteger status1 = stream.streamStatus;
- if (status1 != NSStreamStatusNotOpen &&
- status1 != NSStreamStatusClosed) {
- [stream close];
- } else if (status1 == NSStreamStatusNotOpen) {
- // It's implicitly removed from the stream when it's closed, but not if it was never opened.
- // When the USB cable is disconnected, the app will will call this method after the `NSStreamEventEndEncountered` event. The stream will already be in the closed state but it still needs to be removed from the run loop.
- [stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+- (void)sdl_openStreams {
+ if (self.eaSession != nil) {
+ [[self.eaSession inputStream] setDelegate: self];
+ [[self.eaSession inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ [[self.eaSession inputStream] open];
+ [[self.eaSession outputStream] setDelegate: self];
+ [[self.eaSession outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ [[self.eaSession outputStream] open];
+ } else {
+ SDLLogD(@"EASession is nil when calling sdl_openStreams()");
}
+}
+- (void)sdl_close:(NSStream *)stream {
+ if (stream.streamStatus == NSStreamStatusClosed) {
+ if ([self sdl_isInputStream:stream]) {
+ SDLLogD(@"EASession inputstream already closed for EASession %@", self.eaSession);
+ }
+ if ([self sdl_isOutputStream:stream]) {
+ SDLLogD(@"EASession outputstream already closed for EASession %@", self.eaSession);
+ }
+ return;
+ }
+
+ [stream close];
+ [stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[stream setDelegate:nil];
+
+ if ([self sdl_isInputStream:stream]) {
+ self.inputStreamOpen = NO;
+ SDLLogD(@"EASession closed input stream for EASession %@", self.eaSession);
+ }
+ if ([self sdl_isOutputStream:stream]) {
+ self.outputStreamOpen = NO;
+ SDLLogD(@"EASession closed output stream for EASession %@", self.eaSession);
+ }
+}
+
+
+- (void)sdl_peformCloseSession {
+ SDLLogD(@"Closing EASession streams");
+ if (self.eaSession != nil) {
+ [self sdl_stopStreamRunLoop];
+ [self sdl_close: self.eaSession.inputStream];
+ [self sdl_close: self.eaSession.outputStream];
+ self.eaSession = nil;
+ } else {
+ SDLLogD(@"Failed to sdl_close streams because EASession is already nil");
+ }
+}
- NSUInteger status2 = stream.streamStatus;
- if (status2 == NSStreamStatusClosed) {
- if (stream == [self.eaSession inputStream]) {
- SDLLogD(@"Input stream closed");
- self.isInputStreamOpen = NO;
- } else if (stream == [self.eaSession outputStream]) {
- SDLLogD(@"Output stream closed");
- self.isOutputStreamOpen = NO;
+- (void)sdl_startStreamRunLoop {
+ self.runTheLoop = YES;
+ @autoreleasepool {
+ while(self.runTheLoop) {
+ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25f]];
}
}
}
-- (void)cleanupClosedSession {
- if (self.eaSession == nil) {
- SDLLogD(@"Attempting to close session with accessory: %@, but it is already closed", self.accessory.name);
- return;
+- (void)sdl_stopStreamRunLoop {
+ self.runTheLoop = NO;
+}
+
+#pragma mark - Delegate Stuff
+
+/**
+ * Handles events on the input/output streams of the open session.
+ *
+ * @param stream The stream (either input or output) that the event occured on
+ * @param eventCode The stream event code
+ */
+- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
+ switch (eventCode) {
+ case NSStreamEventOpenCompleted: {
+ [self sdl_streamDidOpen:stream];
+ break;
+ }
+ case NSStreamEventHasBytesAvailable: {
+ [self sdl_streamHasBytesAvailable:(NSInputStream *)stream];
+ break;
+ }
+ case NSStreamEventHasSpaceAvailable: {
+ [self sdl_streamHasSpaceToWrite];
+ break;
+ }
+ case NSStreamEventErrorOccurred: {
+ [self sdl_streamDidError:stream];
+ break;
+ }
+ case NSStreamEventEndEncountered: {
+ [self sdl_streamDidEnd:stream];
+ break;
+ }
+ case NSStreamEventNone:
+ default: {
+ break;
+ }
}
+}
- self.eaSession = nil;
- SDLLogD(@"Session closed with: %@", self.accessory.name);
- self.accessory.delegate = nil;
+/**
+ * Called when the session gets a `NSStreamEventOpenCompleted`. When both the input and output streams open, notify the lifecycle manager that a connection has been established with the accessory.
+ *
+ * @param stream The stream that got the event code.
+ */
+- (void)sdl_streamDidOpen:(NSStream *)stream {
+ if ([self sdl_isInputStream:stream]) {
+ self.inputStreamOpen = YES;
+ }
+ if ([self sdl_isOutputStream: stream]) {
+ self.outputStreamOpen = YES;
+ }
+ if (self.bothStreamsOpen) {
+ SDLLogD(@"EASession input and output streams did open for protocol: %@ SDLIAPSession: %@", self.protocolString, self);
+ if (self.iAPSessionDelegate != nil) {
+ [self.iAPSessionDelegate streamsDidOpen];
+ }
+ }
+}
+
+/**
+ * Called when the session gets a `NSStreamEventHasBytesAvailable` event code. The data is passed to the listener.
+ */
+- (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream {
+ if (self.iAPSessionDelegate != nil) {
+ [self.iAPSessionDelegate streamHasBytesAvailable:inputStream];
+ }
+}
+
+/**
+ * Called when the session gets a `NSStreamEventHasSpaceAvailable` event code. Send any queued data to Core.
+ */
+- (void)sdl_streamHasSpaceToWrite {
+ if (self.iAPSessionDelegate != nil) {
+ [self.iAPSessionDelegate streamHasSpaceToWrite];
+ }
+}
+
+/**
+ * Called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted.
+ */
+- (void)sdl_streamDidEnd:(NSStream *)stream {
+ [self closeSession];
+ if (self.iAPSessionDelegate != nil) {
+ [self.iAPSessionDelegate streamsDidEnd];
+ }
+}
+
+/**
+ * Called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted.
+ */
+- (void)sdl_streamDidError:(NSStream *)stream {
+ if ([self sdl_isInputStream:stream]) {
+ SDLLogE(@"EASession input stream errored");
+ }
+ if ([self sdl_isOutputStream:stream]) {
+ SDLLogE(@"EASession output stream errored");
+ }
+ [self closeSession];
+ if (self.iAPSessionDelegate != nil) {
+ [self.iAPSessionDelegate streamDidError];
+ }
}
#pragma mark - Getters
-- (BOOL)isStopped {
- return !self.isOutputStreamOpen && !self.isInputStreamOpen;
+- (BOOL)bothStreamsOpen {
+ if (self.inputStreamOpen && self.outputStreamOpen) {
+ return YES;
+ }
+ return NO;
}
- (NSUInteger)connectionID {
return self.eaSession.accessory.connectionID;
}
+- (BOOL)hasSpaceAvailable {
+ return self.eaSession.outputStream.hasSpaceAvailable;
+}
+
+- (BOOL)isConnected {
+ return self.accessory.isConnected;
+}
+
+- (BOOL)sdl_isInputStream:(NSStream *)stream {
+ if (stream == self.eaSession.inputStream) {
+ return YES;
+ }
+ return NO;
+}
+
+- (BOOL)sdl_isOutputStream:(NSStream *)stream {
+ if (stream == self.eaSession.outputStream) {
+ return YES;
+ }
+ return NO;
+}
+
- (BOOL)isSessionInProgress {
- return !self.isStopped;
+ if (!self.inputStreamOpen && !self.outputStreamOpen) {
+ SDLLogD(@"EASession not in progress");
+ return NO;
+ }
+ return YES;
}
@end
diff --git a/SmartDeviceLink/private/SDLIAPTransport.m b/SmartDeviceLink/private/SDLIAPTransport.m
index 11da3a1d6..7f6fab7ec 100644
--- a/SmartDeviceLink/private/SDLIAPTransport.m
+++ b/SmartDeviceLink/private/SDLIAPTransport.m
@@ -1,6 +1,5 @@
// SDLIAPTransport.h
-
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@@ -57,6 +56,16 @@ int const CreateSessionRetries = 3;
return self;
}
+- (void)dealloc {
+ SDLLogV(@"SDLIAPTransport dealloc executed");
+ if (self.dataSession != nil) {
+ [self.dataSession closeSession];
+ }
+ if (self.controlSession != nil) {
+ [self.controlSession closeSession];
+ }
+}
+
#pragma mark - Notifications
/**
@@ -141,37 +150,36 @@ int const CreateSessionRetries = 3;
if (!self.controlSession.isSessionInProgress && !self.dataSession.isSessionInProgress) {
SDLLogV(@"Accessory (%@, %@), disconnected, but no session is in progress.", accessory.name, accessory.serialNumber);
- [self sdl_closeSessions];
+ [self sdl_destroySessions];
} else if (self.dataSession.isSessionInProgress) {
- if (self.dataSession.connectionID != accessory.connectionID) {
- SDLLogD(@"Accessory's connectionID, %lu, does not match the connectionID of the current data session, %lu. Another phone disconnected from the head unit. The session will not be closed.", accessory.connectionID, self.dataSession.connectionID);
- return;
+ if (self.dataSession.connectionID == accessory.connectionID) {
+ // The data session has been established. Tell the delegate that the transport has disconnected. The lifecycle manager will destroy and create a new transport object.
+ SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber);
+ [self sdl_destroyTransport];
+ } else {
+ SDLLogD(@"Accessory connectionID, %lu, does not match the connectionID of the current data session, %lu. Another phone disconnected from the head unit. The session will not be closed.", accessory.connectionID, self.dataSession.connectionID);
}
- // The data session has been established. Tell the delegate that the transport has disconnected. The lifecycle manager will destroy and create a new transport object.
- SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber);
- [self sdl_destroyTransport];
} else if (self.controlSession.isSessionInProgress) {
- if (self.controlSession.connectionID != accessory.connectionID) {
+ if (self.controlSession.connectionID == accessory.connectionID) {
+ // The data session has yet to be established so the transport has not yet connected. DO NOT unregister for notifications from the accessory.
+ SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber);
+ [self sdl_destroySessions];
+ } else {
SDLLogD(@"Accessory's connectionID, %lu, does not match the connectionID of the current control session, %lu. Another phone disconnected from the head unit. The session will not be closed.", accessory.connectionID, self.controlSession.connectionID);
- return;
}
- // The data session has yet to be established so the transport has not yet connected. DO NOT unregister for notifications from the accessory.
- SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber);
- [self sdl_closeSessions];
} else {
SDLLogV(@"Accessory (%@, %@) disconnecting during an unknown session", accessory.name, accessory.serialNumber);
- [self sdl_closeSessions];
+ [self sdl_destroySessions];
}
}
/**
- * Closes and cleans up the sessions after a control session has been closed. Since a data session has not been established, the lifecycle manager has not transitioned to state started. Do not unregister for notifications from accessory connections/disconnections otherwise the library will not be able to connect to an accessory again.
+ * Destroys and cleans up the sessions after a control session has been closed. Since a data session has not been established, the lifecycle manager has not transitioned to state started. Do not unregister for notifications from accessory connections/disconnections otherwise the library will not be able to connect to an accessory again.
*/
-- (void)sdl_closeSessions {
+- (void)sdl_destroySessions {
self.retryCounter = 0;
self.sessionSetupInProgress = NO;
-
- [self sdl_closeSessionsWithCompletionHandler:nil];
+ [self sdl_closeSessions:nil];
}
/**
@@ -224,10 +232,9 @@ int const CreateSessionRetries = 3;
self.sessionSetupInProgress = NO;
self.transportDestroyed = YES;
- [self sdl_closeSessionsWithCompletionHandler:disconnectCompletionHandler];
+ [self sdl_closeSessions:disconnectCompletionHandler];
}
-
#pragma mark Helpers
/**
@@ -290,7 +297,7 @@ int const CreateSessionRetries = 3;
self.sessionSetupInProgress = NO;
__weak typeof(self) weakSelf = self;
- [self sdl_closeSessionsWithCompletionHandler:^{
+ [self sdl_closeSessions:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
// Search connected accessories
[strongSelf sdl_connect:nil];
@@ -298,34 +305,31 @@ int const CreateSessionRetries = 3;
}
/// Helper method for closing both the data and control sessions.
-/// @param disconnectCompletionHandler Handler called when both the data and control sessions have been disconnected successfully
-- (void)sdl_closeSessionsWithCompletionHandler:(nullable void (^)(void))disconnectCompletionHandler {
+/// @param completionHandler Handler called when both the data and control sessions have been disconnected successfully
+- (void)sdl_closeSessions:(nullable void (^)(void))completionHandler {
dispatch_group_t endSessionsTask = dispatch_group_create();
+
dispatch_group_enter(endSessionsTask);
-
if (self.controlSession != nil) {
dispatch_group_enter(endSessionsTask);
- [self.controlSession destroySessionWithCompletionHandler:^{
- SDLLogV(@"Control session destroyed");
- dispatch_group_leave(endSessionsTask);
- }];
+ [self.controlSession closeSession];
+ self.controlSession = nil;
+ SDLLogV(@"Control session tear down complete");
+ dispatch_group_leave(endSessionsTask);
}
-
if (self.dataSession != nil) {
dispatch_group_enter(endSessionsTask);
- [self.dataSession destroySessionWithCompletionHandler:^{
- SDLLogV(@"Data session destroyed");
- dispatch_group_leave(endSessionsTask);
- }];
+ [self.dataSession closeSession];
+ self.dataSession = nil;
+ SDLLogV(@"Data session tear down complete");
+ dispatch_group_leave(endSessionsTask);
}
-
dispatch_group_leave(endSessionsTask);
-
- // This will always run after all `leave` calls
+
dispatch_group_notify(endSessionsTask, [SDLGlobals sharedGlobals].sdlProcessingQueue, ^{
SDLLogV(@"Both the data and control sessions are closed");
- if (disconnectCompletionHandler != nil) {
- disconnectCompletionHandler();
+ if (completionHandler != nil) {
+ completionHandler();
}
});
}
@@ -338,7 +342,7 @@ int const CreateSessionRetries = 3;
/**
* Called when the control session should be retried.
*/
-- (void)controlSessionShouldRetry {
+- (void)controlSessionDidEnd {
SDLLogV(@"Retrying the control session");
[self sdl_retryEstablishSession];
}
@@ -351,8 +355,10 @@ int const CreateSessionRetries = 3;
*/
- (void)controlSession:(nonnull SDLIAPControlSession *)controlSession didReceiveProtocolString:(nonnull NSString *)protocolString {
SDLLogD(@"Control transport session received data session number: %@", protocolString);
- self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:controlSession.accessory delegate:self forProtocol:protocolString];
- [self.dataSession startSession];
+ EAAccessory *accessory = self.controlSession.accessory;
+ [self.controlSession closeSession];
+ self.controlSession = nil;
+ self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocolString];
}
@@ -370,7 +376,7 @@ int const CreateSessionRetries = 3;
/**
* Called when the data session should be retried.
*/
-- (void)dataSessionShouldRetry {
+- (void)dataSessionDidEnd {
SDLLogV(@"Retrying the data session");
[self sdl_retryEstablishSession];
}
@@ -539,18 +545,21 @@ int const CreateSessionRetries = 3;
if (![self.class sdl_plistContainsAllSupportedProtocolStrings]) {
return NO;
}
-
+
if ([protocolString isEqualToString:MultiSessionProtocolString] && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) {
+ if (self.dataSession != nil) {
+ [self.dataSession closeSession];
+ }
self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocolString];
- [self.dataSession startSession];
return YES;
} else if ([protocolString isEqualToString:ControlProtocolString]) {
- self.controlSession = [[SDLIAPControlSession alloc] initWithAccessory:accessory delegate:self];
- [self.controlSession startSession];
+ if (self.controlSession != nil) {
+ [self.controlSession closeSession];
+ }
+ self.controlSession = [[SDLIAPControlSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocolString];
return YES;
} else if ([protocolString isEqualToString:LegacyProtocolString]) {
self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocolString];
- [self.dataSession startSession];
return YES;
}
@@ -560,3 +569,5 @@ int const CreateSessionRetries = 3;
@end
NS_ASSUME_NONNULL_END
+
+
diff --git a/SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.h b/SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.h
new file mode 100644
index 000000000..bf1f98795
--- /dev/null
+++ b/SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.h
@@ -0,0 +1,40 @@
+// SDLImageResolution + StreamingVideoExtensions.h
+//
+
+#import <CoreGraphics/CGGeometry.h>
+#import "SDLImageResolution.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NS_ENUM(NSInteger, SDLImageResolutionKind) {
+ SDLImageResolutionKindUndefined,
+ SDLImageResolutionKindLandscape,
+ SDLImageResolutionKindPortrait,
+ SDLImageResolutionKindSquare,
+};
+
+/**
+ * The resolution of an image
+ */
+@interface SDLImageResolution (StreamingVideoExtensions)
+
+/**
+ * SDLImageResolutionKind
+ */
+@property (nonatomic, readonly) SDLImageResolutionKind kind;
+
+/**
+ * Creates and returns a CGSize struct initialized with the resolution width and height
+ * @return CGSize struct
+ */
+- (CGSize)makeSize;
+
+/**
+ * The return value is always equals or above 1.0 if valid, or is 0.0 if size is invalid
+ * @return The normalized aspect ratio
+ */
+- (float)normalizedAspectRatio;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.m b/SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.m
new file mode 100644
index 000000000..ce9b9941e
--- /dev/null
+++ b/SmartDeviceLink/private/SDLImageResolution+StreamingVideoExtensions.m
@@ -0,0 +1,46 @@
+// SDLImageResolution + StreamingVideoExtensions.m
+//
+
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLImageResolution+StreamingVideoExtensions.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLImageResolution (StreamingVideoExtensions)
+
+- (CGSize)makeSize {
+ return CGSizeMake(self.resolutionWidth.floatValue, self.resolutionHeight.floatValue);
+}
+
+- (float)normalizedAspectRatio {
+ const float width = self.resolutionWidth.floatValue;
+ const float height = self.resolutionHeight.floatValue;
+ return (width == 0 || height == 0) ? 0 : fmaxf(width, height)/fminf(width, height);
+}
+
+- (SDLImageResolutionKind)kind {
+ if (!self.resolutionHeight || !self.resolutionWidth) {
+ return SDLImageResolutionKindUndefined;
+ }
+ const float ratio = self.resolutionWidth.floatValue/self.resolutionHeight.floatValue;
+ const float ratioSquared = ratio * ratio;
+ const float tolerance = 0.001f;
+ if (ratioSquared < 1.0 - tolerance) {
+ return SDLImageResolutionKindPortrait;
+ }
+ if (ratioSquared > 1.0 + tolerance) {
+ return SDLImageResolutionKindLandscape;
+ }
+ return SDLImageResolutionKindSquare;
+}
+
+- (NSString *)description {
+ NSString *kindString = @{@(SDLImageResolutionKindUndefined):@"Undef", @(SDLImageResolutionKindLandscape):@"Landscape", @(SDLImageResolutionKindPortrait):@"Portrait", @(SDLImageResolutionKindSquare):@"Square"}[@(self.kind)];
+ return [NSString stringWithFormat:@"<%@:%p> {%@ x %@ : %@}", NSStringFromClass(self.class), self, self.resolutionWidth, self.resolutionHeight, kindString];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLLifecycleManager.h b/SmartDeviceLink/private/SDLLifecycleManager.h
index 1911c4877..fdda17f40 100644
--- a/SmartDeviceLink/private/SDLLifecycleManager.h
+++ b/SmartDeviceLink/private/SDLLifecycleManager.h
@@ -35,6 +35,7 @@
@class SDLStateMachine;
@class SDLStreamingMediaManager;
@class SDLSystemCapabilityManager;
+@class SDLSystemInfo;
@protocol SDLManagerDelegate;
@@ -83,6 +84,7 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
@property (copy, nonatomic, nullable) SDLVideoStreamingState videoStreamingState;
@property (copy, nonatomic, nullable) SDLSystemContext systemContext;
@property (strong, nonatomic, nullable) SDLRegisterAppInterfaceResponse *registerResponse;
+@property (strong, nonatomic, nullable) SDLSystemInfo *systemInfo;
@property (strong, nonatomic) NSOperationQueue *rpcOperationQueue;
diff --git a/SmartDeviceLink/private/SDLLifecycleManager.m b/SmartDeviceLink/private/SDLLifecycleManager.m
index 8d25b79f7..9fc7d088d 100644
--- a/SmartDeviceLink/private/SDLLifecycleManager.m
+++ b/SmartDeviceLink/private/SDLLifecycleManager.m
@@ -14,7 +14,6 @@
#import "SDLLifecycleRPCAdapter.h"
#import "SDLAsynchronousRPCOperation.h"
#import "SDLAsynchronousRPCRequestOperation.h"
-#import "SDLBackgroundTaskManager.h"
#import "SDLChangeRegistration.h"
#import "SDLConfiguration.h"
#import "SDLConnectionManagerType.h"
@@ -60,6 +59,7 @@
#import "SDLStreamingMediaConfiguration.h"
#import "SDLStreamingMediaManager.h"
#import "SDLSystemCapabilityManager.h"
+#import "SDLSystemInfo.h"
#import "SDLTCPTransport.h"
#import "SDLUnregisterAppInterface.h"
#import "SDLVersion.h"
@@ -107,7 +107,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
@property (copy, nonatomic) SDLManagerReadyBlock readyHandler;
@property (copy, nonatomic) dispatch_queue_t lifecycleQueue;
@property (assign, nonatomic) int32_t lastCorrelationId;
-@property (copy, nonatomic) SDLBackgroundTaskManager *backgroundTaskManager;
@property (strong, nonatomic) SDLLanguage currentVRLanguage;
// RPC Handlers
@@ -157,6 +156,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
_rpcOperationQueue = [[NSOperationQueue alloc] init];
_rpcOperationQueue.name = @"com.sdl.lifecycle.rpcOperation.concurrent";
+ _rpcOperationQueue.qualityOfService = NSQualityOfServiceUserInteractive;
_rpcOperationQueue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
_lifecycleQueue = dispatch_queue_create_with_target("com.sdl.lifecycle", DISPATCH_QUEUE_SERIAL, [SDLGlobals sharedGlobals].sdlProcessingQueue);
@@ -167,7 +167,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
_permissionManager = [[SDLPermissionManager alloc] init];
_lockScreenManager = [[SDLLockScreenManager alloc] initWithConfiguration:_configuration.lockScreenConfig notificationDispatcher:_notificationDispatcher presenter:[[SDLLockScreenPresenter alloc] init]];
_systemCapabilityManager = [[SDLSystemCapabilityManager alloc] initWithConnectionManager:self];
- _screenManager = [[SDLScreenManager alloc] initWithConnectionManager:self fileManager:_fileManager systemCapabilityManager:_systemCapabilityManager];
+ _screenManager = [[SDLScreenManager alloc] initWithConnectionManager:self fileManager:_fileManager systemCapabilityManager:_systemCapabilityManager permissionManager:_permissionManager];
if ([self.class sdl_isStreamingConfiguration:self.configuration]) {
_streamManager = [[SDLStreamingMediaManager alloc] initWithConnectionManager:self configuration:configuration systemCapabilityManager:self.systemCapabilityManager];
@@ -190,8 +190,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hmiStatusDidChange:) name:SDLDidChangeHMIStatusNotification object:_notificationDispatcher];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(remoteHardwareDidUnregister:) name:SDLDidReceiveAppUnregisteredNotification object:_notificationDispatcher];
- _backgroundTaskManager = [[SDLBackgroundTaskManager alloc] initWithBackgroundTaskName:BackgroundTaskTransportName];
-
return self;
}
@@ -254,9 +252,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
}
- (void)didEnterStateStarted {
- // Start a background task so a session can be established even when the app is backgrounded.
- [self.backgroundTaskManager startBackgroundTask];
-
// Start up the internal protocol, transport, and other internal managers
self.secondaryTransportManager = nil;
SDLLifecycleConfiguration *lifecycleConfig = self.configuration.lifecycleConfig;
@@ -357,9 +352,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
if (shouldRestart) {
[strongSelf sdl_transitionToState:SDLLifecycleStateStarted];
- } else {
- // End the background task because a session will not be established
- [strongSelf.backgroundTaskManager endBackgroundTask];
}
});
}
@@ -373,6 +365,21 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return;
}
+ // If we received vehicle details in the protocol layer, we need to check if the developer wants to disconnect
+ self.systemInfo = self.protocolHandler.protocol.systemInfo;
+ if (self.systemInfo != nil) {
+ SDLLogD(@"System info received via protocol layer: %@", self.systemInfo);
+ if ([self.delegate respondsToSelector:@selector(didReceiveSystemInfo:)]) {
+ BOOL shouldConnect = [self.delegate didReceiveSystemInfo:self.systemInfo];
+ if (!shouldConnect) {
+ SDLLogW(@"Developer chose to disconnect from the head unit; disconnecting now");
+ [self.protocolHandler.protocol endServiceWithType:SDLServiceTypeRPC];
+ [self sdl_transitionToState:SDLLifecycleStateStopped];
+ return;
+ }
+ }
+ }
+
// Build a register app interface request with the configuration data
SDLRegisterAppInterface *regRequest = [[SDLRegisterAppInterface alloc] initWithLifecycleConfiguration:self.configuration.lifecycleConfig];
@@ -395,6 +402,8 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
weakSelf.registerResponse = (SDLRegisterAppInterfaceResponse *)response;
[SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithSDLMsgVersion:weakSelf.registerResponse.sdlMsgVersion];
+ SDLLogD(@"Did register app; RPC version: %@, starting languages: (VR) %@, (HMI) %@", weakSelf.registerResponse.sdlMsgVersion, weakSelf.registerResponse.language, weakSelf.registerResponse.hmiDisplayLanguage);
+
[weakSelf sdl_transitionToState:SDLLifecycleStateRegistered];
}];
}
@@ -407,6 +416,29 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return;
}
+ // If we did not receive vehicle details in the protocol layer, we need to check if the developer wants to disconnect based on vehicle details from the RAIR
+ if (self.systemInfo == nil) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ SDLVehicleType *vehicleType = self.registerResponse.vehicleType;
+ NSString *softwareVersion = self.registerResponse.systemSoftwareVersion;
+#pragma clang diagnostic pop
+ if ((vehicleType != nil) || (softwareVersion != nil)) {
+ self.systemInfo = [[SDLSystemInfo alloc] initWithVehicleType:vehicleType softwareVersion:softwareVersion hardwareVersion:nil];
+ SDLLogD(@"System info received by RPC layer, using RAIR system info: %@", self.systemInfo);
+
+ if ([self.delegate respondsToSelector:@selector(didReceiveSystemInfo:)]) {
+ BOOL shouldConnect = [self.delegate didReceiveSystemInfo:self.systemInfo];
+ if (!shouldConnect) {
+ SDLLogW(@"Developer chose to disconnect from the head unit; disconnecting now");
+ [self.protocolHandler.protocol endServiceWithType:SDLServiceTypeRPC];
+ [self sdl_transitionToState:SDLLifecycleStateStopped];
+ return;
+ }
+ }
+ }
+ }
+
NSArray<SDLLanguage> *supportedLanguages = self.configuration.lifecycleConfig.languagesSupported;
SDLLanguage desiredHMILanguage = self.configuration.lifecycleConfig.language;
SDLLanguage desiredVRLanguage = self.currentVRLanguage;
@@ -467,7 +499,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return;
}
- SDLLogD(@"Successfully updated language with change registration. Request sent: %@", request);
+ SDLLogD(@"Successfully updated language with change registration. Request sent: %@, response received: %@", request, response);
}];
}
@@ -586,9 +618,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
if ([self.delegate respondsToSelector:@selector(videoStreamingState:didChangetoState:)]) {
[self.delegate videoStreamingState:SDLVideoStreamingStateNotStreamable didChangetoState:self.videoStreamingState];
}
-
- // Stop the background task now that setup has completed
- [self.backgroundTaskManager endBackgroundTask];
}
- (void)didEnterStateUnregistering {
diff --git a/SmartDeviceLink/private/SDLLifecycleProtocolHandler.m b/SmartDeviceLink/private/SDLLifecycleProtocolHandler.m
index 858b0bdaf..e415af391 100644
--- a/SmartDeviceLink/private/SDLLifecycleProtocolHandler.m
+++ b/SmartDeviceLink/private/SDLLifecycleProtocolHandler.m
@@ -92,6 +92,7 @@ NS_ASSUME_NONNULL_BEGIN
/// Called when the transport is closed.
- (void)protocolDidClose:(SDLProtocol *)protocol {
if (self.protocol != protocol) { return; }
+ [[SDLGlobals sharedGlobals] reset];
SDLLogW(@"Transport disconnected");
[self.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
diff --git a/SmartDeviceLink/private/SDLLockScreenManager.m b/SmartDeviceLink/private/SDLLockScreenManager.m
index b5d0cddde..1e3318b9a 100644
--- a/SmartDeviceLink/private/SDLLockScreenManager.m
+++ b/SmartDeviceLink/private/SDLLockScreenManager.m
@@ -165,8 +165,13 @@ NS_ASSUME_NONNULL_BEGIN
if (![notification isNotificationMemberOfClass:[SDLOnDriverDistraction class]]) {
return;
}
-
- self.lastDriverDistractionNotification = notification.notification;
+ // When an `OnDriverDistraction` notification is sent with a `lockScreenDismissalEnabled` value, keep track of said value if subsequent `OnDriverDistraction`s are missing the `lockScreenDismissalEnabled` value. This is done because the `lockScreenDismissalEnabled` state is assumed to be the same value until a new `lockScreenDismissalEnabled` value is received.
+ SDLOnDriverDistraction *currentDriverDistraction = notification.notification;
+ if (currentDriverDistraction.lockScreenDismissalEnabled == nil && self.lastDriverDistractionNotification.lockScreenDismissalEnabled != nil){
+ currentDriverDistraction.lockScreenDismissalEnabled = self.lastDriverDistractionNotification.lockScreenDismissalEnabled;
+ currentDriverDistraction.lockScreenDismissalWarning = self.lastDriverDistractionNotification.lockScreenDismissalWarning;
+ }
+ self.lastDriverDistractionNotification = currentDriverDistraction;
[self sdl_updateLockScreenDismissable];
}
@@ -185,7 +190,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)sdl_updatePresentation {
if (self.config.displayMode == SDLLockScreenConfigurationDisplayModeAlways) {
- if (self.canPresent) {
+ if (self.canPresent && !self.lockScreenDismissedByUser && !self.lockScreenDismissable) {
[self.presenter updateLockScreenToShow:YES withCompletionHandler:nil];
}
} else if (self.lastLockNotification.lockScreenStatus == SDLLockScreenStatusRequired) {
diff --git a/SmartDeviceLink/private/SDLLogFileModuleMap.m b/SmartDeviceLink/private/SDLLogFileModuleMap.m
index 403a82258..44b6b47dd 100644
--- a/SmartDeviceLink/private/SDLLogFileModuleMap.m
+++ b/SmartDeviceLink/private/SDLLogFileModuleMap.m
@@ -36,6 +36,7 @@
[self sdl_screenManagerSubscribeButtonModule],
[self sdl_screenManagerMenuModule],
[self sdl_screenManagerChoiceSetModule],
+ [self sdl_screenManagerAlertModule],
[self sdl_utilitiesModule]]];
}
@@ -129,8 +130,12 @@
return [SDLLogFileModule moduleWithName:@"Screen/SubscribeButton" files:[NSSet setWithArray:@[@"SDLSubscribeButtonManager", @"SDLSubscribeButtonObserver"]]];
}
++ (SDLLogFileModule *)sdl_screenManagerAlertModule {
+ return [SDLLogFileModule moduleWithName:@"Screen/Alert" files:[NSSet setWithArray:@[@"SDLAlertManager", @"SDLAlertView", @"SDLAlertAudioData", @"SDLPresentAlertOperation"]]];
+}
+
+ (SDLLogFileModule *)sdl_screenManagerMenuModule {
- return [SDLLogFileModule moduleWithName:@"Screen/Menu" files:[NSSet setWithArray:@[@"SDLMenuManager", @"SDLVoiceCommandManager"]]];
+ return [SDLLogFileModule moduleWithName:@"Screen/Menu" files:[NSSet setWithArray:@[@"SDLMenuManager", @"SDLVoiceCommandManager", @"SDLVoiceCommandUpdateOperation"]]];
}
+ (SDLLogFileModule *)sdl_screenManagerChoiceSetModule {
diff --git a/SmartDeviceLink/private/SDLMacros.h b/SmartDeviceLink/private/SDLMacros.h
new file mode 100644
index 000000000..fff4ccbdf
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMacros.h
@@ -0,0 +1,16 @@
+//
+// SDLMacros.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 2/8/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern NSUInteger const NSUIntBitCell;
+extern NSUInteger NSUIntRotateCell(NSUInteger val, NSUInteger howMuch);
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMacros.m b/SmartDeviceLink/private/SDLMacros.m
new file mode 100644
index 000000000..ed92ea8e5
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMacros.m
@@ -0,0 +1,14 @@
+//
+// SDLMacros.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 2/8/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMacros.h"
+
+NSUInteger const NSUIntBitCell = (CHAR_BIT * sizeof(NSUInteger));
+NSUInteger NSUIntRotateCell(NSUInteger val, NSUInteger howMuch) {
+ return ((((NSUInteger)val) << howMuch) | (((NSUInteger)val) >> (NSUIntBitCell - howMuch)));
+}
diff --git a/SmartDeviceLink/private/SDLMenuManager.m b/SmartDeviceLink/private/SDLMenuManager.m
index af91dc3a1..ea6e1cd74 100644
--- a/SmartDeviceLink/private/SDLMenuManager.m
+++ b/SmartDeviceLink/private/SDLMenuManager.m
@@ -48,6 +48,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (assign, nonatomic) UInt32 parentCellId;
@property (assign, nonatomic) UInt32 cellId;
+@property (strong, nonatomic, readwrite) NSString *uniqueTitle;
@end
@@ -105,7 +106,7 @@ UInt32 const MenuCellIdMin = 1;
}
- (void)start {
- [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate:)];
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate)];
}
- (void)stop {
@@ -160,6 +161,9 @@ UInt32 const MenuCellIdMin = 1;
}
- (void)setMenuCells:(NSArray<SDLMenuCell *> *)menuCells {
+ // Check for cell lists with completely duplicate information, or any duplicate voiceCommands and return if it fails (logs are in the called method).
+ if (![self sdl_menuCellsAreUnique:menuCells allVoiceCommands:[NSMutableArray array]]) { return; }
+
if (self.currentHMILevel == nil
|| [self.currentHMILevel isEqualToEnum:SDLHMILevelNone]
|| [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) {
@@ -171,26 +175,10 @@ UInt32 const MenuCellIdMin = 1;
self.waitingOnHMIUpdate = NO;
- NSMutableSet *titleCheckSet = [NSMutableSet set];
- NSMutableSet<NSString *> *allMenuVoiceCommands = [NSMutableSet set];
- NSUInteger voiceCommandCount = 0;
- for (SDLMenuCell *cell in menuCells) {
- [titleCheckSet addObject:cell.title];
- if (cell.voiceCommands == nil) { continue; }
- [allMenuVoiceCommands addObjectsFromArray:cell.voiceCommands];
- voiceCommandCount += cell.voiceCommands.count;
- }
-
- // Check for duplicate titles
- if (titleCheckSet.count != menuCells.count) {
- SDLLogE(@"Not all cell titles are unique. The menu will not be set.");
- return;
- }
-
- // Check for duplicate voice recognition commands
- if (allMenuVoiceCommands.count != voiceCommandCount) {
- SDLLogE(@"Attempted to create a menu with duplicate voice commands. Voice commands must be unique. The menu will not be set.");
- return;
+ // If connected over RPC < 7.1, append unique identifiers to cell titles that are duplicates even if other properties are identical
+ SDLVersion *menuUniquenessSupportedVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
+ if ([[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:menuUniquenessSupportedVersion]) {
+ [self sdl_addUniqueNamesToCells:menuCells];
}
_oldMenuCells = _menuCells;
@@ -212,7 +200,6 @@ UInt32 const MenuCellIdMin = 1;
}
SDLShowAppMenu *openMenu = [[SDLShowAppMenu alloc] init];
-
[self.connectionManager sendConnectionRequest:openMenu withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if ([response.resultCode isEqualToEnum:SDLResultWarnings]) {
SDLLogW(@"Warning opening application menu: %@", error);
@@ -239,7 +226,6 @@ UInt32 const MenuCellIdMin = 1;
}
SDLShowAppMenu *subMenu = [[SDLShowAppMenu alloc] initWithMenuID:cell.cellId];
-
[self.connectionManager sendConnectionRequest:subMenu withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if ([response.resultCode isEqualToEnum:SDLResultWarnings]) {
SDLLogW(@"Warning opening application menu to submenu cell %@, with error: %@", cell, error);
@@ -472,7 +458,7 @@ UInt32 const MenuCellIdMin = 1;
NSArray<SDLRPCRequest *> *mainMenuCommands = nil;
NSArray<SDLRPCRequest *> *subMenuCommands = nil;
- if ([self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells].count > 0 || ![self.windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
+ if (![self sdl_shouldRPCsIncludeImages:self.menuCells] || ![self.windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
// Send artwork-less menu
mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO usingIndexesFrom:menu];
subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:NO];
@@ -516,6 +502,9 @@ UInt32 const MenuCellIdMin = 1;
#pragma mark - Helpers
+/// Determine if the dynamic mode is active based on the set value.
+/// @param dynamicMenuUpdatesMode The set dynamic mode
+/// @returns YES if dynamic mode is forced on, or is on with compatibility, which only turns it on for Ford's Sync Gen 3 8-inch display type
- (BOOL)sdl_isDynamicMenuUpdateActive:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode {
switch (dynamicMenuUpdatesMode) {
case SDLDynamicMenuUpdatesModeForceOn:
@@ -530,8 +519,74 @@ UInt32 const MenuCellIdMin = 1;
}
}
+/// Checks if 2 or more cells have the same text/title. In case this condition is true, this function will handle the presented issue by adding "(count)".
+/// E.g. Choices param contains 2 cells with text/title "Address" will be handled by updating the uniqueText/uniqueTitle of the second cell to "Address (2)".
+/// @param choices The choices to be uploaded.
+- (void)sdl_addUniqueNamesToCells:(nullable NSArray<SDLMenuCell *> *)choices {
+ // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
+ NSMutableDictionary<NSString *, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
+ for (SDLMenuCell *cell in choices) {
+ NSString *cellName = cell.title;
+ NSNumber *counter = dictCounter[cellName];
+ if (counter != nil) {
+ counter = @(counter.intValue + 1);
+ dictCounter[cellName] = counter;
+ } else {
+ dictCounter[cellName] = @1;
+ }
+
+ counter = dictCounter[cellName];
+ if (counter.intValue > 1) {
+ cell.uniqueTitle = [NSString stringWithFormat: @"%@ (%d)", cell.title, counter.intValue];
+ }
+
+ if (cell.subCells.count > 0) {
+ [self sdl_addUniqueNamesToCells:cell.subCells];
+ }
+ }
+}
+
+/// Check for cell lists with completely duplicate information, or any duplicate voiceCommands
+///
+/// @param cells The cells you will be adding
+/// @return Boolean that indicates whether menuCells are unique or not
+- (BOOL)sdl_menuCellsAreUnique:(NSArray<SDLMenuCell *> *)cells allVoiceCommands:(NSMutableArray<NSString *> *)allVoiceCommands {
+ ///Check all voice commands for identical items and check each list of cells for identical cells
+ NSMutableSet<SDLMenuCell *> *identicalCellsCheckSet = [NSMutableSet set];
+ for (SDLMenuCell *cell in cells) {
+ [identicalCellsCheckSet addObject:cell];
+
+ // Recursively check the subcell lists to see if they are all unique as well. If anything is not, this will chain back up the list to return false.
+ if (cell.subCells.count > 0) {
+ BOOL subcellsAreUnique = [self sdl_menuCellsAreUnique:cell.subCells allVoiceCommands:allVoiceCommands];
+ if (!subcellsAreUnique) { return NO; }
+ }
+
+ // Voice commands have to be identical across all lists
+ if (cell.voiceCommands == nil) { continue; }
+ [allVoiceCommands addObjectsFromArray:cell.voiceCommands];
+ }
+
+ // Check for duplicate cells
+ if (identicalCellsCheckSet.count != cells.count) {
+ SDLLogE(@"Not all cells are unique. Cells in each list (such as main menu or subcell list) must have some differentiating property other than the subcells within a cell. The menu will not be set.");
+ return NO;
+ }
+
+ // All the VR commands must be unique
+ if (allVoiceCommands.count != [NSSet setWithArray:allVoiceCommands].count) {
+ SDLLogE(@"Attempted to create a menu with duplicate voice commands, but voice commands must be unique across all menu items including main menu and subcell lists. The menu will not be set.");
+ return NO;
+ }
+
+ return YES;
+}
+
#pragma mark Artworks
+/// Get an array of artwork that needs to be uploaded form a list of menu cells
+/// @param cells The menu cells to get artwork from
+/// @returns The array of artwork that needs to be uploaded
- (NSArray<SDLArtwork *> *)sdl_findAllArtworksToBeUploadedFromCells:(NSArray<SDLMenuCell *> *)cells {
if (![self.windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
return @[];
@@ -539,10 +594,20 @@ UInt32 const MenuCellIdMin = 1;
NSMutableSet<SDLArtwork *> *mutableArtworks = [NSMutableSet set];
for (SDLMenuCell *cell in cells) {
- if ([self sdl_artworkNeedsUpload:cell.icon]) {
+ if ([self.fileManager fileNeedsUpload:cell.icon]) {
[mutableArtworks addObject:cell.icon];
}
+ if (cell.subCells.count > 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) {
+ if ([self.fileManager fileNeedsUpload:cell.secondaryArtwork]) {
+ [mutableArtworks addObject:cell.secondaryArtwork];
+ }
+ } else if (cell.subCells.count == 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) {
+ if ([self.fileManager fileNeedsUpload:cell.secondaryArtwork]) {
+ [mutableArtworks addObject:cell.secondaryArtwork];
+ }
+ }
+
if (cell.subCells.count > 0) {
[mutableArtworks addObjectsFromArray:[self sdl_findAllArtworksToBeUploadedFromCells:cell.subCells]];
}
@@ -551,12 +616,42 @@ UInt32 const MenuCellIdMin = 1;
return [mutableArtworks allObjects];
}
-- (BOOL)sdl_artworkNeedsUpload:(SDLArtwork *)artwork {
- return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && !artwork.isStaticIcon);
+/// Determine if cells should or should not be uploaded to the head unit with artworks.
+///
+/// No artworks will be uploaded if:
+///
+/// 1. If any cell has a dynamic artwork that is not uploaded
+/// 2. If any cell contains a secondary artwork may be used on the head unit, and the cell has a dynamic secondary artwork that is not uploaded
+/// 3. If any cell's subcells fails check (1) or (2)
+/// @param cells The cells to check
+/// @return True if the cells should be uploaded with artwork, false if they should not
+- (BOOL)sdl_shouldRPCsIncludeImages:(NSArray<SDLMenuCell *> *)cells {
+ for (SDLMenuCell *cell in cells) {
+ SDLArtwork *artwork = cell.icon;
+ SDLArtwork *secondaryArtwork = cell.secondaryArtwork;
+ if (artwork != nil && !artwork.isStaticIcon && ![self.fileManager hasUploadedFile:artwork]) {
+ return NO;
+ } else if (cell.subCells.count > 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) {
+ if (secondaryArtwork != nil && !secondaryArtwork.isStaticIcon && ![self.fileManager hasUploadedFile:secondaryArtwork]) {
+ return NO;
+ }
+ } else if (cell.subCells.count == 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) {
+ if (secondaryArtwork != nil && !secondaryArtwork.isStaticIcon && ![self.fileManager hasUploadedFile:secondaryArtwork]) {
+ return NO;
+ }
+ } else if (cell.subCells.count > 0 && ![self sdl_shouldRPCsIncludeImages:cell.subCells]) {
+ return NO;
+ }
+ }
+
+ return YES;
}
#pragma mark IDs
+/// Assign cell ids on an array of menu cells given a parent id (or no parent id)
+/// @param menuCells The array of menu cells to update
+/// @param parentId The parent id to assign if needed
- (void)sdl_updateIdsOnMenuCells:(NSArray<SDLMenuCell *> *)menuCells parentId:(UInt32)parentId {
for (SDLMenuCell *cell in menuCells) {
cell.cellId = self.lastMenuId++;
@@ -569,6 +664,8 @@ UInt32 const MenuCellIdMin = 1;
#pragma mark Deletes
+/// Create an array of DeleteCommand and DeleteSubMenu RPCs from an array of menu cells
+/// @param cells The array of menu cells to use
- (NSArray<SDLRPCRequest *> *)sdl_deleteCommandsForCells:(NSArray<SDLMenuCell *> *)cells {
NSMutableArray<SDLRPCRequest *> *mutableDeletes = [NSMutableArray array];
for (SDLMenuCell *cell in cells) {
@@ -585,15 +682,14 @@ UInt32 const MenuCellIdMin = 1;
}
#pragma mark Commands / SubMenu RPCs
-/**
- This method will receive the cells to be added and the updated menu array. It will then build an array of add commands using the correct index to position the new items in the correct location.
- @param cells that will be added to the menu, this array must contain only cells that are not already in the menu.
- @param shouldHaveArtwork artwork bool
- @param menu the new menu array, this array should contain all the values the develeoper has set to be included in the new menu. This is used for placing the newly added cells in the correct locaiton.
- e.g. If the new menu array is [A, B, C, D] but only [C, D] are new we need to pass [A, B , C , D] so C and D can be added to index 2 and 3 respectively.
- @return list of SDLRPCRequest addCommands
- */
+/// This method will receive the cells to be added and the updated menu array. It will then build an array of add commands using the correct index to position the new items in the correct location.
+/// e.g. If the new menu array is [A, B, C, D] but only [C, D] are new we need to pass [A, B , C , D] so C and D can be added to index 2 and 3 respectively.
+///
+/// @param cells that will be added to the menu, this array must contain only cells that are not already in the menu.
+/// @param shouldHaveArtwork artwork bool
+/// @param menu the new menu array, this array should contain all the values the developer has set to be included in the new menu. This is used for placing the newly added cells in the correct location.
+/// @return list of SDLRPCRequest addCommands
- (NSArray<SDLRPCRequest *> *)sdl_mainMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexesFrom:(NSArray<SDLMenuCell *> *)menu {
NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
@@ -612,6 +708,10 @@ UInt32 const MenuCellIdMin = 1;
return [mutableCommands copy];
}
+/// Creates SDLAddSubMenu RPCs for the passed array of menu cells, AND all of those cells' subcell RPCs, both SDLAddCommands and SDLAddSubMenus
+/// @param cells The cells to create RPCs for
+/// @param shouldHaveArtwork Whether artwork should be applied to the RPCs
+/// @returns An array of RPCs of SDLAddSubMenus and their associated subcell RPCs
- (NSArray<SDLRPCRequest *> *)sdl_subMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells withArtwork:(BOOL)shouldHaveArtwork {
NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
for (SDLMenuCell *cell in cells) {
@@ -623,6 +723,10 @@ UInt32 const MenuCellIdMin = 1;
return [mutableCommands copy];
}
+/// Creates SDLAddCommand and SDLAddSubMenu RPCs for a passed array of cells, AND all of those cells' subcell RPCs, both SDLAddCommands and SDLAddSubmenus
+/// @param cells The cells to create RPCs for
+/// @param shouldHaveArtwork Whether artwork should be applied to the RPCs
+/// @returns An array of RPCs of SDLAddCommand and SDLAddSubMenus for the array of menu cells and their subcells, recursively
- (NSArray<SDLRPCRequest *> *)sdl_allCommandsForCells:(NSArray<SDLMenuCell *> *)cells withArtwork:(BOOL)shouldHaveArtwork {
NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
@@ -638,24 +742,38 @@ UInt32 const MenuCellIdMin = 1;
return [mutableCommands copy];
}
+/// An individual SDLAddCommand RPC for a given SDLMenuCell
+/// @param cell The cell to create the RPC for
+/// @param shouldHaveArtwork Whether artwork should be applied to the RPC
+/// @param position The position the SDLAddCommand RPC should be given
+/// @returns The SDLAddCommand RPC
- (SDLAddCommand *)sdl_commandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position {
SDLAddCommand *command = [[SDLAddCommand alloc] init];
SDLMenuParams *params = [[SDLMenuParams alloc] init];
- params.menuName = cell.title;
+ params.menuName = cell.uniqueTitle;
params.parentID = cell.parentCellId != UINT32_MAX ? @(cell.parentCellId) : nil;
params.position = @(position);
+ params.secondaryText = (cell.secondaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandSecondaryText]) ? cell.secondaryText : nil;
+ params.tertiaryText = (cell.tertiaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandTertiaryText]) ? cell.tertiaryText : nil;
command.menuParams = params;
command.vrCommands = (cell.voiceCommands.count == 0) ? nil : cell.voiceCommands;
command.cmdIcon = (cell.icon && shouldHaveArtwork) ? cell.icon.imageRPC : nil;
command.cmdID = @(cell.cellId);
+ command.secondaryImage = (cell.secondaryArtwork && shouldHaveArtwork && ![self.fileManager fileNeedsUpload:cell.secondaryArtwork]) ? cell.secondaryArtwork.imageRPC : nil;
return command;
}
+/// An individual SDLAddSubMenu RPC for a given SDLMenuCell
+/// @param cell The cell to create the RPC for
+/// @param shouldHaveArtwork Whether artwork should be applied to the RPC
+/// @param position The position the SDLAddSubMenu RPC should be given
+/// @returns The SDLAddSubMenu RPC
- (SDLAddSubMenu *)sdl_subMenuCommandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position {
SDLImage *icon = (shouldHaveArtwork && (cell.icon.name != nil)) ? cell.icon.imageRPC : nil;
+ SDLImage *secondaryImage = (shouldHaveArtwork && ![self.fileManager fileNeedsUpload:cell.secondaryArtwork] && (cell.secondaryArtwork.name != nil)) ? cell.secondaryArtwork.imageRPC : nil;
SDLMenuLayout submenuLayout = nil;
if (cell.submenuLayout && [self.systemCapabilityManager.defaultMainWindowCapability.menuLayoutsAvailable containsObject:cell.submenuLayout]) {
@@ -663,12 +781,18 @@ UInt32 const MenuCellIdMin = 1;
} else {
submenuLayout = self.menuConfiguration.defaultSubmenuLayout;
}
-
- return [[SDLAddSubMenu alloc] initWithMenuID:cell.cellId menuName:cell.title position:@(position) menuIcon:icon menuLayout:submenuLayout parentID:nil];
+
+ NSString *secondaryText = (cell.secondaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuSecondaryText]) ? cell.secondaryText : nil;
+ NSString *tertiaryText = (cell.tertiaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuTertiaryText]) ? cell.tertiaryText : nil;
+ return [[SDLAddSubMenu alloc] initWithMenuID:cell.cellId menuName:cell.uniqueTitle position:@(position) menuIcon:icon menuLayout:submenuLayout parentID:nil secondaryText:secondaryText tertiaryText:tertiaryText secondaryImage:secondaryImage];
}
#pragma mark - Calling handlers
+/// Call a handler for a currently displayed SDLMenuCell based on the incoming SDLOnCommand notification
+/// @param cells The menu cells to check (including their subcells)
+/// @param onCommand The notification retrieved
+/// @returns True if the handler was found, false if it was not found
- (BOOL)sdl_callHandlerForCells:(NSArray<SDLMenuCell *> *)cells command:(SDLOnCommand *)onCommand {
for (SDLMenuCell *cell in cells) {
if (cell.cellId == onCommand.cmdID.unsignedIntegerValue && cell.handler != nil) {
@@ -693,8 +817,7 @@ UInt32 const MenuCellIdMin = 1;
[self sdl_callHandlerForCells:self.menuCells command:onCommand];
}
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
- // We won't use the object in the parameter but the convenience method of the system capability manager
+- (void)sdl_displayCapabilityDidUpdate {
self.windowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
}
diff --git a/SmartDeviceLink/private/SDLPreloadChoicesOperation.h b/SmartDeviceLink/private/SDLPreloadChoicesOperation.h
index 965a0c176..d13207705 100644
--- a/SmartDeviceLink/private/SDLPreloadChoicesOperation.h
+++ b/SmartDeviceLink/private/SDLPreloadChoicesOperation.h
@@ -29,7 +29,7 @@ typedef NS_ENUM(NSUInteger, SDLPreloadChoicesOperationState) {
@property (assign, nonatomic) SDLPreloadChoicesOperationState currentState;
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSSet<SDLChoiceCell *> *)cells;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSOrderedSet<SDLChoiceCell *> *)cells;
- (BOOL)removeChoicesFromUpload:(NSSet<SDLChoiceCell *> *)choices;
diff --git a/SmartDeviceLink/private/SDLPreloadChoicesOperation.m b/SmartDeviceLink/private/SDLPreloadChoicesOperation.m
index 82f7435ff..1390169c6 100644
--- a/SmartDeviceLink/private/SDLPreloadChoicesOperation.m
+++ b/SmartDeviceLink/private/SDLPreloadChoicesOperation.m
@@ -45,7 +45,7 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLPreloadChoicesOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSSet<SDLChoiceCell *> *)cells {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSOrderedSet<SDLChoiceCell *> *)cells {
self = [super init];
if (!self) { return nil; }
@@ -87,10 +87,10 @@ NS_ASSUME_NONNULL_BEGIN
NSMutableArray<SDLArtwork *> *artworksToUpload = [NSMutableArray arrayWithCapacity:self.cellsToUpload.count];
for (SDLChoiceCell *cell in self.cellsToUpload) {
- if ([self sdl_shouldSendChoicePrimaryImage] && [self sdl_artworkNeedsUpload:cell.artwork]) {
+ if ([self sdl_shouldSendChoicePrimaryImage] && [self.fileManager fileNeedsUpload:cell.artwork]) {
[artworksToUpload addObject:cell.artwork];
}
- if ([self sdl_shouldSendChoiceSecondaryImage] && [self sdl_artworkNeedsUpload:cell.secondaryArtwork]) {
+ if ([self sdl_shouldSendChoiceSecondaryImage] && [self.fileManager fileNeedsUpload:cell.secondaryArtwork]) {
[artworksToUpload addObject:cell.secondaryArtwork];
}
}
@@ -113,10 +113,6 @@ NS_ASSUME_NONNULL_BEGIN
}];
}
-- (BOOL)sdl_artworkNeedsUpload:(SDLArtwork *)artwork {
- return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && !artwork.isStaticIcon);
-}
-
- (void)sdl_preloadCells {
_currentState = SDLPreloadChoicesOperationStatePreloadingChoices;
@@ -164,7 +160,7 @@ NS_ASSUME_NONNULL_BEGIN
NSString *menuName = nil;
if ([self sdl_shouldSendChoiceText]) {
- menuName = cell.text;
+ menuName = cell.uniqueText;
}
if(!menuName) {
diff --git a/SmartDeviceLink/private/SDLPresentAlertOperation.h b/SmartDeviceLink/private/SDLPresentAlertOperation.h
new file mode 100644
index 000000000..22cd56fb3
--- /dev/null
+++ b/SmartDeviceLink/private/SDLPresentAlertOperation.h
@@ -0,0 +1,38 @@
+//
+// SDLPresentAlertOperation.h
+// SmartDeviceLink
+//
+// Created by Nicole on 11/12/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAsynchronousOperation.h"
+
+@class SDLAlertView;
+@class SDLFileManager;
+@class SDLSystemCapabilityManager;
+@class SDLWindowCapability;
+
+@protocol SDLConnectionManagerType;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// Operation that handles uploading images and audio data needed by the alert and, once the data uploads are complete, sending the alert.
+@interface SDLPresentAlertOperation : SDLAsynchronousOperation
+
+/// The current window capabilities
+@property (copy, nonatomic, nullable) SDLWindowCapability *currentWindowCapability;
+
+/// An operation to present an alert.
+/// @param connectionManager The connection manager
+/// @param fileManager The file manager
+/// @param systemCapabilityManager The system capability manager
+/// @param currentWindowCapability The current window capability
+/// @param alertView The alert to be displayed
+/// @param cancelID A unique ID for this specific choice set that allows cancellation through the `CancelInteraction` RPC
+/// @return A SDLPresentAlertOperation object
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager currentWindowCapability:(nullable SDLWindowCapability *)currentWindowCapability alertView:(SDLAlertView *)alertView cancelID:(UInt16)cancelID;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPresentAlertOperation.m b/SmartDeviceLink/private/SDLPresentAlertOperation.m
new file mode 100644
index 000000000..6999bf55d
--- /dev/null
+++ b/SmartDeviceLink/private/SDLPresentAlertOperation.m
@@ -0,0 +1,451 @@
+//
+// SDLPresentAlertOperation.m
+// SmartDeviceLink
+//
+// Created by Nicole on 11/12/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLPresentAlertOperation.h"
+
+#import "SDLAlert.h"
+#import "SDLAlertAudioData.h"
+#import "SDLAlertResponse.h"
+#import "SDLAlertView.h"
+#import "SDLArtwork.h"
+#import "SDLCancelInteraction.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLError.h"
+#import "SDLFile.h"
+#import "SDLFileManager.h"
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLSoftButton.h"
+#import "SDLSoftButtonCapabilities.h"
+#import "SDLSoftButtonObject.h"
+#import "SDLSoftButtonState.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLTextField.h"
+#import "SDLTTSChunk.h"
+#import "SDLVersion.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+static const int SDLAlertSoftButtonIDMin = 10;
+static const int SDLAlertSoftButtonCount = 4;
+
+@interface SDLAlertAudioData()
+
+@property (nullable, copy, nonatomic, readonly) NSDictionary<SDLFileName *, SDLFile *> *audioFileData;
+
+@end
+
+@interface SDLAlertView()
+
+/// Handler called when the alert should be dismissed.
+@property (copy, nonatomic) SDLAlertCanceledHandler canceledHandler;
+
+@end
+
+@interface SDLSoftButtonObject()
+
+/// Unique id assigned to the soft button.
+@property (assign, nonatomic) NSUInteger buttonId;
+
+@end
+
+@interface SDLPresentAlertOperation()
+
+@property (strong, nonatomic) NSUUID *operationId;
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
+@property (strong, nonatomic, readwrite) SDLAlertView *alertView;
+@property (assign, nonatomic) UInt16 cancelId;
+@property (copy, nonatomic, nullable) NSError *internalError;
+@property (assign, atomic) BOOL isAlertPresented;
+
+@end
+
+@implementation SDLPresentAlertOperation
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager currentWindowCapability:(nullable SDLWindowCapability *)currentWindowCapability alertView:(SDLAlertView *)alertView cancelID:(UInt16)cancelID {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _connectionManager = connectionManager;
+ _fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
+
+ __weak typeof(self) weakSelf = self;
+ alertView.canceledHandler = ^{
+ [weakSelf sdl_cancelInteraction];
+ };
+ _alertView = [alertView copy];
+
+ _cancelId = cancelID;
+ _operationId = [NSUUID UUID];
+ _currentWindowCapability = currentWindowCapability;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+ if (self.isCancelled) { return; }
+
+ NSError *alertViewValidatedError = [self sdl_isValidAlertViewData:self.alertView];
+ if (alertViewValidatedError != nil) {
+ [self finishOperation];
+ self.internalError = alertViewValidatedError;
+ return;
+ }
+
+ dispatch_group_t uploadFilesTask = dispatch_group_create();
+ dispatch_group_enter(uploadFilesTask);
+
+ dispatch_group_enter(uploadFilesTask);
+ [self sdl_uploadImagesWithCompletionHandler:^{
+ dispatch_group_leave(uploadFilesTask);
+ }];
+
+ dispatch_group_enter(uploadFilesTask);
+ [self sdl_uploadAudioFilesWithCompletionHandler:^{
+ dispatch_group_leave(uploadFilesTask);
+ }];
+
+ dispatch_group_leave(uploadFilesTask);
+ // This will always run after all `leave`s
+ __weak typeof(self) weakSelf = self;
+ dispatch_group_notify(uploadFilesTask, [SDLGlobals sharedGlobals].sdlConcurrentQueue, ^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ [strongSelf sdl_presentAlert];
+ });
+}
+
+/// Checks the `AlertView` data to make sure it conforms to the RPC Spec, which says that at least either `alertText1`, `alertText2` or `TTSChunks` need to be provided.
+/// @return The error if the alert view does not have valid data; nil if the alert view data is valid
+- (nullable NSError *)sdl_isValidAlertViewData:(SDLAlertView *)alertView {
+ BOOL isValidData = NO;
+ if ((alertView.text.length > 0)
+ || (alertView.secondaryText.length > 0)
+ || ([self sdl_ttsChunksForAlertView:alertView].count > 0)) {
+ isValidData = YES;
+ }
+
+ if (isValidData) {
+ return nil;
+ } else if (alertView.audio.audioData.count > 0) {
+ return [NSError sdl_alertManager_alertAudioFileNotSupported];
+ } else {
+ return [NSError sdl_alertManager_alertDataInvalid];
+ }
+}
+
+#pragma mark Uploads
+
+/// Upload the alert audio files.
+/// @param handler Called when all audio files have been uploaded
+- (void)sdl_uploadAudioFilesWithCompletionHandler:(void (^)(void))handler {
+ if (![self sdl_supportsAlertAudioFile]) {
+ SDLLogD(@"Module does not support audio files for alerts, skipping upload of audio files");
+ return handler();
+ }
+
+ NSMutableArray<SDLFile *> *filesToBeUploaded = [NSMutableArray array];
+ for (SDLTTSChunk *ttsChunk in self.alertView.audio.audioData) {
+ if (ttsChunk.type != SDLSpeechCapabilitiesFile) { continue; }
+
+ SDLFile *audioFile = self.alertView.audio.audioFileData[ttsChunk.text];
+ if (![self.fileManager fileNeedsUpload:audioFile]) { continue; }
+ [filesToBeUploaded addObject:audioFile];
+ }
+
+ if (filesToBeUploaded.count == 0) {
+ SDLLogV(@"No audio files need to be uploaded for alert");
+ return handler();
+ }
+
+ SDLLogD(@"Uploading audio files for alert");
+ __weak typeof(self) weakself = self;
+ [self.fileManager uploadFiles:filesToBeUploaded progressHandler:^BOOL(SDLFileName * _Nonnull fileName, float uploadPercentage, NSError * _Nullable error) {
+ __strong typeof(weakself) strongself = weakself;
+ SDLLogD(@"Uploaded alert audio file: %@, error: %@, percent complete: %f.2%%", fileName, error, uploadPercentage * 100);
+ if (strongself.isCancelled) { return NO; }
+
+ return YES;
+ } completionHandler:^(NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error uploading alert audio files: %@", error);
+ } else {
+ SDLLogD(@"All alert audio files uploaded");
+ }
+
+ handler();
+ }];
+}
+
+/// Upload the alert icon and soft button images.
+/// @param handler Called when all images have been uploaded.
+- (void)sdl_uploadImagesWithCompletionHandler:(void (^)(void))handler {
+ NSMutableArray<SDLArtwork *> *artworksToBeUploaded = [NSMutableArray array];
+ if ([self sdl_supportsAlertIcon] && [self.fileManager fileNeedsUpload:self.alertView.icon]) {
+ [artworksToBeUploaded addObject:self.alertView.icon];
+ }
+
+ // Don't upload artworks for buttons that will not be shown.
+ for (NSUInteger i = 0; i < [self sdl_softButtonCount]; i++) {
+ SDLSoftButtonObject *object = self.alertView.softButtons[i];
+ if ([self sdl_supportsSoftButtonImages] && [self.fileManager fileNeedsUpload:object.currentState.artwork]) {
+ [artworksToBeUploaded addObject:object.currentState.artwork];
+ }
+ }
+
+ if (artworksToBeUploaded.count == 0) {
+ SDLLogV(@"No images to upload for alert");
+ return handler();
+ }
+
+ SDLLogD(@"Uploading images for alert");
+ __weak typeof(self) weakself = self;
+ [self.fileManager uploadArtworks:[artworksToBeUploaded copy] progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) {
+ __strong typeof(weakself) strongself = weakself;
+ SDLLogD(@"Uploaded alert images: %@, error: %@, percent complete: %f.2%%", artworkName, error, uploadPercentage * 100);
+ if (strongself.isCancelled) { return NO; }
+
+ return YES;
+ } completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error uploading alert images: %@", error);
+ } else {
+ SDLLogD(@"All alert images uploaded");
+ }
+
+ return handler();
+ }];
+}
+
+/// Sends the alert RPC to the module. The operation is finished once a response has been received from the module.
+- (void)sdl_presentAlert {
+ if (self.isCancelled) { return [self finishOperation]; }
+
+ self.isAlertPresented = YES;
+
+ __weak typeof(self) weakSelf = self;
+ [self.connectionManager sendConnectionRequest:self.alertRPC withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (error != nil) {
+ SDLAlertResponse *alertResponse = (SDLAlertResponse *)response;
+ strongSelf.internalError = [NSError sdl_alertManager_presentationFailedWithError:error tryAgainTime:alertResponse.tryAgainTime.intValue];
+ }
+
+ [strongSelf finishOperation];
+ }];
+}
+
+#pragma mark - Cancel
+
+/// Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC spec versions 6.0+. On older versions alert will not be dismissed.
+- (void)sdl_cancelInteraction {
+ if (self.isFinished) {
+ SDLLogW(@"This operation has already finished so it can not be canceled.");
+ return;
+ } else if (self.isCancelled) {
+ SDLLogW(@"This operation has already been canceled. It will be finished at some point during the operation.");
+ return;
+ } else if (self.isExecuting) {
+ if ([SDLGlobals.sharedGlobals.rpcVersion isLessThanVersion:[[SDLVersion alloc] initWithMajor:6 minor:0 patch:0]]) {
+ SDLLogD(@"Attempting to cancel this operation in-progress; if the alert is already presented on the module, it cannot be dismissed.");
+ [self cancel];
+ return;
+ } else if (self.isAlertPresented == NO) {
+ SDLLogD(@"Alert has not yet been sent to the module. Alert will not be shown.");
+ [self cancel];
+ return;
+ }
+
+ SDLLogD(@"Canceling the presented alert");
+ __weak typeof(self) weakSelf = self;
+ SDLCancelInteraction *cancelInteraction = [[SDLCancelInteraction alloc] initWithAlertCancelID:self.cancelId];
+ [self.connectionManager sendConnectionRequest:cancelInteraction withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if (error != nil) {
+ weakSelf.internalError = error;
+ SDLLogE(@"Error canceling the presented alert: %@, with error: %@", request, error);
+ return;
+ }
+ SDLLogD(@"The presented alert was canceled successfully");
+ }];
+ } else {
+ SDLLogD(@"Canceling an alert that has not started: %@", self);
+ [self cancel];
+ }
+}
+
+#pragma mark - Private Getters / Setters
+
+/// Assembles an `Alert` RPC from the `SDLAlertView` information.
+/// @return The `Alert` RPC to be sent to the module.
+- (SDLAlert *)alertRPC {
+ SDLAlert *alert = [[SDLAlert alloc] init];
+ [self sdl_assembleAlertText:alert];
+ alert.duration = @((NSUInteger)(self.alertView.timeout * 1000));
+ alert.alertIcon = ([self sdl_supportsAlertIcon] && ![self.fileManager fileNeedsUpload:self.alertView.icon]) ? self.alertView.icon.imageRPC : nil;
+ alert.progressIndicator = @(self.alertView.showWaitIndicator);
+ alert.cancelID = @(self.cancelId);
+
+ // The number of alert soft buttons sent must be capped so there are no clashes with soft button ids assigned by other managers (And thus leading to clashes saving/retreiving the button handlers in the `SDLResponseDispatcher` class)
+ NSMutableArray<SDLSoftButton *> *softButtons = [NSMutableArray arrayWithCapacity:[self sdl_softButtonCount]];
+ for (NSUInteger i = 0; i < [self sdl_softButtonCount]; i += 1) {
+ SDLSoftButtonObject *button = self.alertView.softButtons[i];
+ button.buttonId = SDLAlertSoftButtonIDMin + i;
+ [softButtons addObject:button.currentStateSoftButton.copy];
+ }
+ alert.softButtons = softButtons;
+
+ alert.playTone = @(self.alertView.audio.playTone);
+ alert.ttsChunks = [self sdl_ttsChunksForAlertView:self.alertView];
+
+ return alert;
+}
+
+/// Checks the number of soft buttons added to the alert view against the max number of soft buttons allowed by the RPC Spec and returns the smaller of the two values.
+/// @return The maximum number of soft buttons that can be sent to the module
+- (unsigned long)sdl_softButtonCount {
+ return MIN(self.alertView.softButtons.count, SDLAlertSoftButtonCount);
+}
+
+/// Creates an array of text-to-speech chunks for the `Alert` RPC from the text strings and the audio data files.
+/// @param alertView The alert view
+/// @return An array of TTS chunks or nil if there are no TTS chunks
+- (nullable NSArray<SDLTTSChunk *> *)sdl_ttsChunksForAlertView:(SDLAlertView *)alertView {
+ SDLAlertAudioData *alertAudio = alertView.audio;
+ NSMutableArray<SDLTTSChunk *> *ttsChunks = [NSMutableArray array];
+
+ for (SDLTTSChunk *audioData in alertAudio.audioData) {
+ // If the audio data is a file and the connected system doesn't support files, skip that audio data
+ if (audioData.type == SDLSpeechCapabilitiesFile && ![self sdl_supportsAlertAudioFile]) { continue; }
+ [ttsChunks addObject:audioData];
+ }
+
+ return ttsChunks.count > 0 ? [ttsChunks copy] : nil;
+}
+
+/// Checks if the connected module or current template supports soft button images.
+/// @return True if soft button images are currently supported; false if not.
+- (BOOL)sdl_supportsSoftButtonImages {
+ return self.currentWindowCapability.softButtonCapabilities.firstObject.imageSupported.boolValue;
+}
+
+/// Checks if the connected module supports audio files. Using an audio file in an alert will only work if connected to modules supporting RPC spec versions 5.0+. If the module does not return a speechCapabilities, assume that the module supports playing an audio file.
+/// @return True if the module supports playing audio files in an alert; false if not.
+- (BOOL)sdl_supportsAlertAudioFile {
+ NSUInteger majorVersion = [SDLGlobals sharedGlobals].rpcVersion.major;
+ BOOL supportSpeechCapabilities = (self.systemCapabilityManager.speechCapabilities != nil) ? [self.systemCapabilityManager.speechCapabilities containsObject:SDLSpeechCapabilitiesFile] : YES;
+ return (majorVersion >= 5 && supportSpeechCapabilities);
+}
+
+/// Checks if the connected module or current template supports alert icons.
+/// @return True if alert icons are currently supported; false if not.
+- (BOOL)sdl_supportsAlertIcon {
+ return [self.currentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon];
+}
+
+#pragma mark - Text Helpers
+
+/// Populates the alert RPC text-fields based on the number of text-fields the current template supports. If more text-fields are set in the SDLAlertView than the template supports, the text is concancated so all text fits in the currently available text-fields.
+/// @param alert The alert RPC with no text-fields set
+/// @return An alert RPC with the text-fields set
+- (SDLAlert *)sdl_assembleAlertText:(SDLAlert *)alert {
+ NSArray *nonNilFields = [self sdl_findNonNilTextFields];
+ if (nonNilFields.count == 0) { return alert; }
+
+ NSUInteger maxNumberOfLines = (self.currentWindowCapability != nil) ? self.currentWindowCapability.maxNumberOfAlertFieldLines : MaxAlertTextFieldLineCount;
+ if (maxNumberOfLines == 1) {
+ alert = [self sdl_assembleOneLineAlertText:alert withAlertFields:nonNilFields];
+ } else if (maxNumberOfLines == 2) {
+ alert = [self sdl_assembleTwoLineAlertText:alert withAlertFields:nonNilFields];
+ } else if (maxNumberOfLines == 3) {
+ alert = [self sdl_assembleThreeLineAlertText:alert withAlertFields:nonNilFields];
+ }
+
+ return alert;
+}
+
+/// Generates a list of all non-empty text-fields set in the SDLAlertView in order from first, second to third.
+/// @return An array of all the text-fields set in the SDLAlertView
+- (NSArray<NSString *> *)sdl_findNonNilTextFields {
+ NSMutableArray *array = [NSMutableArray array];
+ (self.alertView.text.length > 0) ? [array addObject:self.alertView.text] : nil;
+ (self.alertView.secondaryText.length > 0) ? [array addObject:self.alertView.secondaryText] : nil;
+ (self.alertView.tertiaryText.length > 0) ? [array addObject:self.alertView.tertiaryText] : nil;
+
+ return [array copy];
+}
+
+/// Called if the alert template only supports one line of text. A single string is created from all the text and is used to set the first text-field in the alert RPC.
+/// @param alert The alert RPC
+/// @param fields A list all the text set in the SDLAlertView
+/// @return An alert RPC with the text-fields set
+- (SDLAlert *)sdl_assembleOneLineAlertText:(SDLAlert *)alert withAlertFields:(NSArray<NSString *> *)fields {
+ NSMutableString *alertString = [NSMutableString stringWithString:[fields objectAtIndex:0]];
+ for (NSUInteger i = 1; i < fields.count; i+= 1) {
+ [alertString appendFormat:@" - %@", fields[i]];
+ }
+ alert.alertText1 = alertString.copy;
+
+ return alert;
+}
+
+/// Called if the alert template only supports two lines of text. The first text-field in the alert RPC is set with the first available text and the second text-field is set with a single string created from all remaining text.
+/// @param alert The alert RPC
+/// @param fields A list all the text set in the SDLAlertView
+/// @return An alert RPC with the text-fields set
+- (SDLAlert *)sdl_assembleTwoLineAlertText:(SDLAlert *)alert withAlertFields:(NSArray<NSString *> *)fields {
+ if (fields.count <= 2) {
+ alert.alertText1 = fields.count > 0 ? fields[0] : nil;
+ alert.alertText2 = fields.count > 1 ? [fields objectAtIndex:1] : nil;
+ } else {
+ alert.alertText1 = fields.count > 0 ? [fields objectAtIndex:0] : nil;
+ alert.alertText2 = [NSString stringWithFormat:@"%@ - %@", [fields objectAtIndex:1], [fields objectAtIndex:2]];
+ }
+
+ return alert;
+}
+
+/// Called if the alert template supports all three lines of text. Each text-field in the alert RPC is set with its corresponding text.
+/// @param alert The alert RPC
+/// @param fields A list all the text set in the SDLAlertView
+/// @return An alert RPC with the text-fields set
+- (SDLAlert *)sdl_assembleThreeLineAlertText:(SDLAlert *)alert withAlertFields:(NSArray<NSString *> *)fields {
+ alert.alertText1 = fields.count > 0 ? fields[0] : nil;
+ alert.alertText2 = fields.count > 1 ? [fields objectAtIndex:1] : nil;
+ alert.alertText3 = fields.count > 2 ? [fields objectAtIndex:2] : nil;
+ return alert;
+}
+
+#pragma mark - Property Overrides
+
+- (void)finishOperation {
+ SDLLogV(@"Finishing present alert operation");
+ [super finishOperation];
+}
+
+- (nullable NSString *)name {
+ return @"com.sdl.alertManager.present";
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+- (nullable NSError *)error {
+ return self.internalError;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
index df82bfa22..b2589a280 100644
--- a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
+++ b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
@@ -15,6 +15,7 @@
@class SDLChoiceCell;
@class SDLChoiceSet;
@class SDLKeyboardProperties;
+@class SDLWindowCapability;
@protocol SDLConnectionManagerType;
@protocol SDLKeyboardDelegate;
@@ -54,7 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
@param cancelID A unique ID for this specific choice set that allows cancellation through the `CancelInteraction` RPC.
@return A SDLPresentChoiceSetOperation object
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability;
@end
diff --git a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
index 0788b0b97..121383ce7 100644
--- a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
+++ b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
@@ -24,6 +24,7 @@
#import "SDLRPCNotificationNotification.h"
#import "SDLSetGlobalProperties.h"
#import "SDLVersion.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -60,12 +61,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readwrite, nullable) SDLChoiceCell *selectedCell;
@property (strong, nonatomic, readwrite, nullable) SDLTriggerSource selectedTriggerSource;
@property (assign, nonatomic, readwrite) NSUInteger selectedCellRow;
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
@end
@implementation SDLPresentChoiceSetOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability {
self = [super init];
if (!self) { return self; }
@@ -86,6 +88,7 @@ NS_ASSUME_NONNULL_BEGIN
_cancelId = cancelID;
_selectedCellRow = NSNotFound;
+ _windowCapability = windowCapability;
return self;
}
@@ -121,15 +124,16 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Sending Requests
- (void)sdl_updateKeyboardPropertiesWithCompletionHandler:(nullable void(^)(void))completionHandler {
- if (self.keyboardProperties == nil) {
+ // Create the keyboard configuration based on the window capability's keyboard capabilities
+ SDLKeyboardProperties *modifiedKeyboardConfig = [self.windowCapability createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:self.keyboardProperties];
+ if (modifiedKeyboardConfig == nil) {
if (completionHandler != nil) {
completionHandler();
}
return;
}
-
SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
- setProperties.keyboardProperties = self.keyboardProperties;
+ setProperties.keyboardProperties = modifiedKeyboardConfig;
__weak typeof(self) weakself = self;
[self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
@@ -278,7 +282,10 @@ NS_ASSUME_NONNULL_BEGIN
}
weakself.keyboardProperties.autoCompleteList = (newList.count > 0) ? newList : @[];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
weakself.keyboardProperties.autoCompleteText = (newList.count > 0) ? newList.firstObject : nil;
+#pragma clang diagnostic pop
[weakself sdl_updateKeyboardPropertiesWithCompletionHandler:nil];
}];
}
@@ -292,6 +299,12 @@ NS_ASSUME_NONNULL_BEGIN
} else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventAborted] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventCancelled]) {
// Notify of abort / cancellation
[self.keyboardDelegate keyboardDidAbortWithReason:onKeyboard.event];
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskDisabled]) {
+ // Notify of key mask change
+ if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidUpdateInputMask:)]) {
+ BOOL isEnabled = [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ [self.keyboardDelegate keyboardDidUpdateInputMask:isEnabled];
+ }
}
}
diff --git a/SmartDeviceLink/private/SDLPresentKeyboardOperation.h b/SmartDeviceLink/private/SDLPresentKeyboardOperation.h
index 9a5a6cfb5..508c948b4 100644
--- a/SmartDeviceLink/private/SDLPresentKeyboardOperation.h
+++ b/SmartDeviceLink/private/SDLPresentKeyboardOperation.h
@@ -10,6 +10,8 @@
#import "NSNumber+NumberType.h"
@class SDLKeyboardProperties;
+@class SDLWindowCapability;
+
@protocol SDLConnectionManagerType;
@protocol SDLKeyboardDelegate;
@@ -33,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
@param cancelID An ID for this specific keyboard to allow cancellation through the `CancelInteraction` RPC.
@return A SDLPresentKeyboardOperation object
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability;
/**
Cancels the keyboard-only interface if it is currently showing. If the keyboard has not yet been sent to Core, it will not be sent.
diff --git a/SmartDeviceLink/private/SDLPresentKeyboardOperation.m b/SmartDeviceLink/private/SDLPresentKeyboardOperation.m
index 633ccfba6..939869680 100644
--- a/SmartDeviceLink/private/SDLPresentKeyboardOperation.m
+++ b/SmartDeviceLink/private/SDLPresentKeyboardOperation.m
@@ -21,6 +21,7 @@
#import "SDLRPCNotificationNotification.h"
#import "SDLSetGlobalProperties.h"
#import "SDLVersion.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -37,12 +38,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readonly) SDLPerformInteraction *performInteraction;
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
@end
@implementation SDLPresentKeyboardOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability {
self = [super init];
if (!self) { return self; }
@@ -53,6 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
_keyboardProperties = originalKeyboardProperties;
_cancelId = cancelID;
_operationId = [NSUUID UUID];
+ _windowCapability = windowCapability;
return self;
}
@@ -87,8 +90,16 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Sending Requests
- (void)sdl_updateKeyboardPropertiesWithCompletionHandler:(nullable void(^)(void))completionHandler {
+ // Create the keyboard configuration based on the window capability's keyboard capabilities
+ SDLKeyboardProperties *keyboardConfiguration = [self.windowCapability createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:self.keyboardProperties];
+ if (keyboardConfiguration == nil) {
+ if (completionHandler != nil) {
+ completionHandler();
+ }
+ return;
+ }
SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
- setProperties.keyboardProperties = self.keyboardProperties;
+ setProperties.keyboardProperties = keyboardConfiguration;
[self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (error != nil) {
@@ -192,7 +203,10 @@ NS_ASSUME_NONNULL_BEGIN
}
weakself.keyboardProperties.autoCompleteList = (newList.count > 0) ? newList : @[];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
weakself.keyboardProperties.autoCompleteText = (newList.count > 0) ? newList.firstObject : nil;
+#pragma clang diagnostic pop
[weakself sdl_updateKeyboardPropertiesWithCompletionHandler:nil];
}];
}
@@ -206,6 +220,12 @@ NS_ASSUME_NONNULL_BEGIN
} else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventAborted] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventCancelled]) {
// Notify of abort / cancellation
[self.keyboardDelegate keyboardDidAbortWithReason:onKeyboard.event];
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskDisabled]) {
+ // Notify of key mask change
+ if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidUpdateInputMask:)]) {
+ BOOL isEnabled = [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ [self.keyboardDelegate keyboardDidUpdateInputMask:isEnabled];
+ }
}
}
diff --git a/SmartDeviceLink/private/SDLProtocol.h b/SmartDeviceLink/private/SDLProtocol.h
index a9a21f66d..9fdc25192 100644
--- a/SmartDeviceLink/private/SDLProtocol.h
+++ b/SmartDeviceLink/private/SDLProtocol.h
@@ -13,6 +13,7 @@
@class SDLProtocolHeader;
@class SDLProtocolRecievedMessageRouter;
@class SDLRPCMessage;
+@class SDLSystemInfo;
NS_ASSUME_NONNULL_BEGIN
@@ -65,6 +66,9 @@ extern NSString *const SDLProtocolSecurityErrorDomain;
*/
@property (strong, nonatomic, readonly, nullable) NSString *authToken;
+/// The connected module's information if it's available
+@property (strong, nonatomic, readonly, nullable) SDLSystemInfo *systemInfo;
+
#pragma mark - Init
- (instancetype)init NS_UNAVAILABLE;
diff --git a/SmartDeviceLink/private/SDLProtocol.m b/SmartDeviceLink/private/SDLProtocol.m
index a76e6a24d..348543801 100644
--- a/SmartDeviceLink/private/SDLProtocol.m
+++ b/SmartDeviceLink/private/SDLProtocol.m
@@ -9,8 +9,10 @@
#import "SDLControlFramePayloadEndService.h"
#import "SDLControlFramePayloadNak.h"
#import "SDLControlFramePayloadRegisterSecondaryTransportNak.h"
+#import "SDLControlFramePayloadAudioStartServiceAck.h"
#import "SDLControlFramePayloadRPCStartService.h"
#import "SDLControlFramePayloadRPCStartServiceAck.h"
+#import "SDLControlFramePayloadVideoStartServiceAck.h"
#import "SDLEncryptionLifecycleManager.h"
#import "SDLLogMacros.h"
#import "SDLGlobals.h"
@@ -25,6 +27,7 @@
#import "SDLRPCRequest.h"
#import "SDLRPCResponse.h"
#import "SDLSecurityType.h"
+#import "SDLSystemInfo.h"
#import "SDLTimer.h"
#import "SDLVersion.h"
#import "SDLV2ProtocolHeader.h"
@@ -50,6 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
// Readonly public properties
@property (strong, nonatomic, readwrite, nullable) NSString *authToken;
+@property (strong, nonatomic, readwrite, nullable) SDLSystemInfo *systemInfo;
@end
@@ -513,7 +517,6 @@ NS_ASSUME_NONNULL_BEGIN
switch (startServiceACK.header.serviceType) {
case SDLServiceTypeRPC: {
SDLControlFramePayloadRPCStartServiceAck *startServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:startServiceACK.payload];
-
if (startServiceACKPayload.mtu != SDLControlFrameInt64NotFound) {
[[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)startServiceACKPayload.mtu forServiceType:startServiceACK.header.serviceType];
}
@@ -523,20 +526,20 @@ NS_ASSUME_NONNULL_BEGIN
[SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = (startServiceACKPayload.protocolVersion != nil) ? [SDLVersion versionWithString:startServiceACKPayload.protocolVersion] : [SDLVersion versionWithMajor:startServiceACK.header.version minor:0 patch:0];
- self.authToken = [SDLGlobals.sharedGlobals.maxHeadUnitProtocolVersion isGreaterThanOrEqualToVersion:[[SDLVersion alloc] initWithMajor:5 minor:2 patch:0]] ? startServiceACKPayload.authToken : nil;
+ self.authToken = startServiceACKPayload.authToken;
- // TODO: Hash id?
+ if ((startServiceACKPayload.make != nil) || (startServiceACKPayload.systemHardwareVersion != nil) || (startServiceACKPayload.systemSoftwareVersion != nil)) {
+ self.systemInfo = [[SDLSystemInfo alloc] initWithMake:startServiceACKPayload.make model:startServiceACKPayload.model trim:startServiceACKPayload.trim modelYear:startServiceACKPayload.modelYear softwareVersion:startServiceACKPayload.systemSoftwareVersion hardwareVersion:startServiceACKPayload.systemHardwareVersion];
+ }
} break;
case SDLServiceTypeAudio: {
- SDLControlFramePayloadRPCStartServiceAck *startServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:startServiceACK.payload];
-
+ SDLControlFramePayloadAudioStartServiceAck *startServiceACKPayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithData:startServiceACK.payload];
if (startServiceACKPayload.mtu != SDLControlFrameInt64NotFound) {
[[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)startServiceACKPayload.mtu forServiceType:SDLServiceTypeAudio];
}
} break;
case SDLServiceTypeVideo: {
- SDLControlFramePayloadRPCStartServiceAck *startServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:startServiceACK.payload];
-
+ SDLControlFramePayloadVideoStartServiceAck *startServiceACKPayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithData:startServiceACK.payload];
if (startServiceACKPayload.mtu != SDLControlFrameInt64NotFound) {
[[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)startServiceACKPayload.mtu forServiceType:SDLServiceTypeVideo];
}
diff --git a/SmartDeviceLink/private/SDLRPCParameterNames.h b/SmartDeviceLink/private/SDLRPCParameterNames.h
index 7222039de..ba1281533 100644
--- a/SmartDeviceLink/private/SDLRPCParameterNames.h
+++ b/SmartDeviceLink/private/SDLRPCParameterNames.h
@@ -46,6 +46,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameAcceptsWayPoints;
extern SDLRPCParameterName const SDLRPCParameterNameAction;
extern SDLRPCParameterName const SDLRPCParameterNameActual;
extern SDLRPCParameterName const SDLRPCParameterNameActualGear;
+extern SDLRPCParameterName const SDLRPCParameterNameAdditionalVideoStreamingCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameAddress;
extern SDLRPCParameterName const SDLRPCParameterNameAddressLines;
extern SDLRPCParameterName const SDLRPCParameterNameAdministrativeArea;
@@ -69,6 +70,8 @@ extern SDLRPCParameterName const SDLRPCParameterNameApparentTemperatureHigh;
extern SDLRPCParameterName const SDLRPCParameterNameApparentTemperatureLow;
extern SDLRPCParameterName const SDLRPCParameterNameApproximatePosition;
extern SDLRPCParameterName const SDLRPCParameterNameAppBundleId;
+extern SDLRPCParameterName const SDLRPCParameterNameAppCapability;
+extern SDLRPCParameterName const SDLRPCParameterNameAppCapabilityType;
extern SDLRPCParameterName const SDLRPCParameterNameAppDisplayName;
extern SDLRPCParameterName const SDLRPCParameterNameAppHMIType;
extern SDLRPCParameterName const SDLRPCParameterNameAppId;
@@ -81,6 +84,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameAppServices;
extern SDLRPCParameterName const SDLRPCParameterNameAppServicesCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameAppVersion;
extern SDLRPCParameterName const SDLRPCParameterNameAssociatedServiceType;
+extern SDLRPCParameterName const SDLRPCParameterNameAtmosphericPressure;
extern SDLRPCParameterName const SDLRPCParameterNameAutoCompleteList;
extern SDLRPCParameterName const SDLRPCParameterNameAudioControlCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameAudioControlData;
@@ -104,6 +108,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameBackTiltAngle;
extern SDLRPCParameterName const SDLRPCParameterNameBackTiltAngleAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameBackVerticalPosition;
extern SDLRPCParameterName const SDLRPCParameterNameBackVerticalPositionAvailable;
+extern SDLRPCParameterName const SDLRPCParameterNameBackSeekIndicator;
extern SDLRPCParameterName const SDLRPCParameterNameBand;
extern SDLRPCParameterName const SDLRPCParameterNameBatteryLevelStatus;
extern SDLRPCParameterName const SDLRPCParameterNameBearing;
@@ -117,6 +122,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameButtonCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameButtonEventMode;
extern SDLRPCParameterName const SDLRPCParameterNameButtonName;
extern SDLRPCParameterName const SDLRPCParameterNameButtonPressMode;
+extern SDLRPCParameterName const SDLRPCParameterNameCabinTemperature;
extern SDLRPCParameterName const SDLRPCParameterNameCancelID;
extern SDLRPCParameterName const SDLRPCParameterNameCapacity;
extern SDLRPCParameterName const SDLRPCParameterNameCapacityUnit;
@@ -141,6 +147,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameChoiceSet;
extern SDLRPCParameterName const SDLRPCParameterNameCirculateAirEnable;
extern SDLRPCParameterName const SDLRPCParameterNameCirculateAirEnableAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameClimateControlData;
+extern SDLRPCParameterName const SDLRPCParameterNameClimateData;
extern SDLRPCParameterName const SDLRPCParameterNameClimateControlCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameCloudCover;
extern SDLRPCParameterName const SDLRPCParameterNameClusterModes;
@@ -148,7 +155,9 @@ extern SDLRPCParameterName const SDLRPCParameterNameClusterModeStatus;
extern SDLRPCParameterName const SDLRPCParameterNameCommandIcon;
extern SDLRPCParameterName const SDLRPCParameterNameCommandId;
extern SDLRPCParameterName const SDLRPCParameterNameCompassDirection;
+extern SDLRPCParameterName const SDLRPCParameterNameConditionActive;
extern SDLRPCParameterName const SDLRPCParameterNameCorrelationId;
+extern SDLRPCParameterName const SDLRPCParameterNameCountRate;
extern SDLRPCParameterName const SDLRPCParameterNameCountryCode;
extern SDLRPCParameterName const SDLRPCParameterNameCountryName;
extern SDLRPCParameterName const SDLRPCParameterNameCRC;
@@ -160,6 +169,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameCurrentForecastSupported;
extern SDLRPCParameterName const SDLRPCParameterNameCurrentTemperature;
extern SDLRPCParameterName const SDLRPCParameterNameCushion;
extern SDLRPCParameterName const SDLRPCParameterNameCustomButtonId;
+extern SDLRPCParameterName const SDLRPCParameterNameCustomKeys;
extern SDLRPCParameterName const SDLRPCParameterNameCustomPresets;
extern SDLRPCParameterName const SDLRPCParameterNameOEMCustomDataType;
extern SDLRPCParameterName const SDLRPCParameterNameData;
@@ -197,6 +207,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameDistanceToEmpty;
extern SDLRPCParameterName const SDLRPCParameterNameDistanceToManeuver;
extern SDLRPCParameterName const SDLRPCParameterNameDistanceToManeuverScale;
extern SDLRPCParameterName const SDLRPCParameterNameDistanceUnitAvailable;
+extern SDLRPCParameterName const SDLRPCParameterNameDoorStatuses;
extern SDLRPCParameterName const SDLRPCParameterNameDoublePressAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameDriverAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNameDriverBeltDeployed;
@@ -206,7 +217,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameDriverCurtainAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNameDriverDistraction;
extern SDLRPCParameterName const SDLRPCParameterNameDriverDistractionCapability;
extern SDLRPCParameterName const SDLRPCParameterNameDriverDistractionStatus;
-extern SDLRPCParameterName const SDLRPCParameterNameDriverDoorAjar;
+extern SDLRPCParameterName const SDLRPCParameterNameDriverDoorAjar __deprecated;
extern SDLRPCParameterName const SDLRPCParameterNameDriverKneeAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNameDriverSideAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNameDrivingSide;
@@ -248,6 +259,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameFilenames;
extern SDLRPCParameterName const SDLRPCParameterNameFileType;
extern SDLRPCParameterName const SDLRPCParameterNameFirmness;
extern SDLRPCParameterName const SDLRPCParameterNameFirmwareRevision;
+extern SDLRPCParameterName const SDLRPCParameterNameForwardSeekIndicator;
extern SDLRPCParameterName const SDLRPCParameterNameFreeModules;
extern SDLRPCParameterName const SDLRPCParameterNameFrequencyInteger;
extern SDLRPCParameterName const SDLRPCParameterNameFrequencyFraction;
@@ -260,6 +272,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameFuelMaintenanceMode;
extern SDLRPCParameterName const SDLRPCParameterNameFuelRange;
extern SDLRPCParameterName const SDLRPCParameterNameFullAppID;
extern SDLRPCParameterName const SDLRPCParameterNameFunctionID;
+extern SDLRPCParameterName const SDLRPCParameterNameGateStatuses;
extern SDLRPCParameterName const SDLRPCParameterNameGetWayPointsEnabled;
extern SDLRPCParameterName const SDLRPCParameterNameGPS;
extern SDLRPCParameterName const SDLRPCParameterNameGearStatus;
@@ -345,6 +358,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameIsSubscribed;
extern SDLRPCParameterName const SDLRPCParameterNameJunctionType;
extern SDLRPCParameterName const SDLRPCParameterNameKeepContext;
extern SDLRPCParameterName const SDLRPCParameterNameKeepContextAvailable;
+extern SDLRPCParameterName const SDLRPCParameterNameKeyboardCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameKeyboardLayout;
extern SDLRPCParameterName const SDLRPCParameterNameKeyboardProperties;
extern SDLRPCParameterName const SDLRPCParameterNameKeypressMode;
@@ -391,6 +405,8 @@ extern SDLRPCParameterName const SDLRPCParameterNameMajorVersion;
extern SDLRPCParameterName const SDLRPCParameterNameMake;
extern SDLRPCParameterName const SDLRPCParameterNameManeuverComplete;
extern SDLRPCParameterName const SDLRPCParameterNameManualTextEntry;
+extern SDLRPCParameterName const SDLRPCParameterNameMaskInputCharacters;
+extern SDLRPCParameterName const SDLRPCParameterNameMaskInputCharactersSupported;
extern SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmness;
extern SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmnessAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameMassageEnabled;
@@ -476,6 +492,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameNotification;
extern SDLRPCParameterName const SDLRPCParameterNameNumber;
extern SDLRPCParameterName const SDLRPCParameterNameNumberCustomPresetsAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameNumberTicks;
+extern SDLRPCParameterName const SDLRPCParameterNameNumConfigurableKeys;
extern SDLRPCParameterName const SDLRPCParameterNameOdometer;
extern SDLRPCParameterName const SDLRPCParameterNameOffset;
extern SDLRPCParameterName const SDLRPCParameterNameOnLockScreenStatus;
@@ -494,7 +511,7 @@ extern SDLRPCParameterName const SDLRPCParameterNamePassengerBeltDeployed;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerBuckleBelted;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerChildDetected;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerCurtainAirbagDeployed;
-extern SDLRPCParameterName const SDLRPCParameterNamePassengerDoorAjar;
+extern SDLRPCParameterName const SDLRPCParameterNamePassengerDoorAjar __deprecated;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerKneeAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerSideAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNamePatchVersion;
@@ -518,6 +535,7 @@ extern SDLRPCParameterName const SDLRPCParameterNamePrecipAccumulation;
extern SDLRPCParameterName const SDLRPCParameterNamePrecipIntensity;
extern SDLRPCParameterName const SDLRPCParameterNamePrecipProbability;
extern SDLRPCParameterName const SDLRPCParameterNamePrecipType;
+extern SDLRPCParameterName const SDLRPCParameterNamePreferredFPS;
extern SDLRPCParameterName const SDLRPCParameterNamePreferredResolution;
extern SDLRPCParameterName const SDLRPCParameterNamePrerecordedSpeech;
extern SDLRPCParameterName const SDLRPCParameterNamePresetBankCapabilities;
@@ -546,8 +564,8 @@ extern SDLRPCParameterName const SDLRPCParameterNameRadioFrequencyAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameRange;
extern SDLRPCParameterName const SDLRPCParameterNameRDSData;
extern SDLRPCParameterName const SDLRPCParameterNameRDSDataAvailable;
-extern SDLRPCParameterName const SDLRPCParameterNameRearLeftDoorAjar;
-extern SDLRPCParameterName const SDLRPCParameterNameRearRightDoorAjar;
+extern SDLRPCParameterName const SDLRPCParameterNameRearLeftDoorAjar __deprecated;
+extern SDLRPCParameterName const SDLRPCParameterNameRearRightDoorAjar __deprecated;
extern SDLRPCParameterName const SDLRPCParameterNameReason;
extern SDLRPCParameterName const SDLRPCParameterNameRect;
extern SDLRPCParameterName const SDLRPCParameterNameRed;
@@ -573,6 +591,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameRightRearInflatableBelted;
extern SDLRPCParameterName const SDLRPCParameterNameRightRow2BuckleBelted;
extern SDLRPCParameterName const SDLRPCParameterNameRightRow3BuckleBelted;
extern SDLRPCParameterName const SDLRPCParameterNameRolloverEvent;
+extern SDLRPCParameterName const SDLRPCParameterNameRoofStatuses;
extern SDLRPCParameterName const SDLRPCParameterNameRow;
extern SDLRPCParameterName const SDLRPCParameterNameRows;
extern SDLRPCParameterName const SDLRPCParameterNameRowSpan;
@@ -591,13 +610,17 @@ extern SDLRPCParameterName const SDLRPCParameterNameSeatControlData;
extern SDLRPCParameterName const SDLRPCParameterNameSeatControlCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameSeatLocation;
extern SDLRPCParameterName const SDLRPCParameterNameSeatLocationCapability;
+extern SDLRPCParameterName const SDLRPCParameterNameSeatOccupancy;
extern SDLRPCParameterName const SDLRPCParameterNameSeats;
+extern SDLRPCParameterName const SDLRPCParameterNameSeatsBelted;
+extern SDLRPCParameterName const SDLRPCParameterNameSeatsOccupied;
extern SDLRPCParameterName const SDLRPCParameterNameSecondaryColor;
extern SDLRPCParameterName const SDLRPCParameterNameSecondaryGraphic;
extern SDLRPCParameterName const SDLRPCParameterNameSecondaryImage;
extern SDLRPCParameterName const SDLRPCParameterNameSecondaryText;
extern SDLRPCParameterName const SDLRPCParameterNameSecond;
extern SDLRPCParameterName const SDLRPCParameterNameSeconds;
+extern SDLRPCParameterName const SDLRPCParameterNameSeekTime;
extern SDLRPCParameterName const SDLRPCParameterNameSendLocationEnabled;
extern SDLRPCParameterName const SDLRPCParameterNameServiceActive;
extern SDLRPCParameterName const SDLRPCParameterNameServiceArea;
@@ -660,6 +683,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameSupportedDiagnosticModes;
extern SDLRPCParameterName const SDLRPCParameterNameSupportedDynamicImageFieldNames;
extern SDLRPCParameterName const SDLRPCParameterNameSupportsDynamicSubMenus;
extern SDLRPCParameterName const SDLRPCParameterNameSupportedFormats;
+extern SDLRPCParameterName const SDLRPCParameterNameSupportedKeyboards;
extern SDLRPCParameterName const SDLRPCParameterNameSupportedLights;
extern SDLRPCParameterName const SDLRPCParameterNameSyncFileName;
extern SDLRPCParameterName const SDLRPCParameterNameSyncMessageVersion;
diff --git a/SmartDeviceLink/private/SDLRPCParameterNames.m b/SmartDeviceLink/private/SDLRPCParameterNames.m
index 353b4d779..b951c763d 100644
--- a/SmartDeviceLink/private/SDLRPCParameterNames.m
+++ b/SmartDeviceLink/private/SDLRPCParameterNames.m
@@ -45,6 +45,7 @@ SDLRPCParameterName const SDLRPCParameterNameAcceptsWayPoints = @"acceptsWayPoin
SDLRPCParameterName const SDLRPCParameterNameAction = @"action";
SDLRPCParameterName const SDLRPCParameterNameActual = @"actual";
SDLRPCParameterName const SDLRPCParameterNameActualGear = @"actualGear";
+SDLRPCParameterName const SDLRPCParameterNameAdditionalVideoStreamingCapabilities = @"additionalVideoStreamingCapabilities";
SDLRPCParameterName const SDLRPCParameterNameAddress = @"address";
SDLRPCParameterName const SDLRPCParameterNameAddressLines = @"addressLines";
SDLRPCParameterName const SDLRPCParameterNameAdministrativeArea = @"administrativeArea";
@@ -68,6 +69,8 @@ SDLRPCParameterName const SDLRPCParameterNameApparentTemperatureHigh = @"apparen
SDLRPCParameterName const SDLRPCParameterNameApparentTemperatureLow = @"apparentTemperatureLow";
SDLRPCParameterName const SDLRPCParameterNameApproximatePosition = @"approximatePosition";
SDLRPCParameterName const SDLRPCParameterNameAppBundleId = @"appBundleID";
+SDLRPCParameterName const SDLRPCParameterNameAppCapability = @"appCapability";
+SDLRPCParameterName const SDLRPCParameterNameAppCapabilityType = @"appCapabilityType";
SDLRPCParameterName const SDLRPCParameterNameAppHMIType = @"appHMIType";
SDLRPCParameterName const SDLRPCParameterNameAppId = @"appID";
SDLRPCParameterName const SDLRPCParameterNameAppInfo = @"appInfo";
@@ -82,6 +85,7 @@ SDLRPCParameterName const SDLRPCParameterNameAppVersion = @"appVersion";
SDLRPCParameterName const SDLRPCParameterNameAudioControlCapabilities = @"audioControlCapabilities";
SDLRPCParameterName const SDLRPCParameterNameAudioControlData = @"audioControlData";
SDLRPCParameterName const SDLRPCParameterNameAssociatedServiceType = @"associatedServiceType";
+SDLRPCParameterName const SDLRPCParameterNameAtmosphericPressure = @"atmosphericPressure";
SDLRPCParameterName const SDLRPCParameterNameAudioPassThruCapabilities = @"audioPassThruCapabilities";
SDLRPCParameterName const SDLRPCParameterNameAudioPassThruDisplayText1 = @"audioPassThruDisplayText1";
SDLRPCParameterName const SDLRPCParameterNameAudioPassThruDisplayText2 = @"audioPassThruDisplayText2";
@@ -103,6 +107,7 @@ SDLRPCParameterName const SDLRPCParameterNameBackTiltAngle = @"backTiltAngle";
SDLRPCParameterName const SDLRPCParameterNameBackTiltAngleAvailable = @"backTiltAngleAvailable";
SDLRPCParameterName const SDLRPCParameterNameBackVerticalPosition = @"backVerticalPosition";
SDLRPCParameterName const SDLRPCParameterNameBackVerticalPositionAvailable = @"backVerticalPositionAvailable";
+SDLRPCParameterName const SDLRPCParameterNameBackSeekIndicator = @"backSeekIndicator";
SDLRPCParameterName const SDLRPCParameterNameBand = @"band";
SDLRPCParameterName const SDLRPCParameterNameBatteryLevelStatus = @"battLevelStatus";
SDLRPCParameterName const SDLRPCParameterNameBearing = @"bearing";
@@ -116,6 +121,7 @@ SDLRPCParameterName const SDLRPCParameterNameButtonCapabilities = @"buttonCapabi
SDLRPCParameterName const SDLRPCParameterNameButtonEventMode = @"buttonEventMode";
SDLRPCParameterName const SDLRPCParameterNameButtonName = @"buttonName";
SDLRPCParameterName const SDLRPCParameterNameButtonPressMode = @"buttonPressMode";
+SDLRPCParameterName const SDLRPCParameterNameCabinTemperature = @"cabinTemperature";
SDLRPCParameterName const SDLRPCParameterNameCancelID = @"cancelID";
SDLRPCParameterName const SDLRPCParameterNameCapacity = @"capacity";
SDLRPCParameterName const SDLRPCParameterNameCapacityUnit = @"capacityUnit";
@@ -136,6 +142,7 @@ SDLRPCParameterName const SDLRPCParameterNameChoiceSet = @"choiceSet";
SDLRPCParameterName const SDLRPCParameterNameCirculateAirEnable = @"circulateAirEnable";
SDLRPCParameterName const SDLRPCParameterNameCirculateAirEnableAvailable = @"circulateAirEnableAvailable";
SDLRPCParameterName const SDLRPCParameterNameClimateControlData = @"climateControlData";
+SDLRPCParameterName const SDLRPCParameterNameClimateData = @"climateData";
SDLRPCParameterName const SDLRPCParameterNameClimateControlCapabilities = @"climateControlCapabilities";
SDLRPCParameterName const SDLRPCParameterNameCloudCover = @"cloudCover";
SDLRPCParameterName const SDLRPCParameterNameClusterModes = @"clusterModes";
@@ -147,7 +154,9 @@ SDLRPCParameterName const SDLRPCParameterNameColumns = @"columns";
SDLRPCParameterName const SDLRPCParameterNameCommandIcon = @"cmdIcon";
SDLRPCParameterName const SDLRPCParameterNameCommandId = @"cmdID";
SDLRPCParameterName const SDLRPCParameterNameCompassDirection = @"compassDirection";
+SDLRPCParameterName const SDLRPCParameterNameConditionActive = @"conditionActive";
SDLRPCParameterName const SDLRPCParameterNameCorrelationId = @"correlationID";
+SDLRPCParameterName const SDLRPCParameterNameCountRate = @"countRate";
SDLRPCParameterName const SDLRPCParameterNameCountryCode = @"countryCode";
SDLRPCParameterName const SDLRPCParameterNameCountryName = @"countryName";
SDLRPCParameterName const SDLRPCParameterNameCRC = @"crc";
@@ -159,6 +168,7 @@ SDLRPCParameterName const SDLRPCParameterNameCurrentForecastSupported = @"curren
SDLRPCParameterName const SDLRPCParameterNameCurrentTemperature = @"currentTemperature";
SDLRPCParameterName const SDLRPCParameterNameCushion = @"cushion";
SDLRPCParameterName const SDLRPCParameterNameCustomButtonId = @"customButtonID";
+SDLRPCParameterName const SDLRPCParameterNameCustomKeys = @"customKeys";
SDLRPCParameterName const SDLRPCParameterNameCustomPresets = @"customPresets";
SDLRPCParameterName const SDLRPCParameterNameData = @"data";
SDLRPCParameterName const SDLRPCParameterNameDataResult = @"dataResult";
@@ -195,6 +205,7 @@ SDLRPCParameterName const SDLRPCParameterNameDistanceToManeuver = @"distanceToMa
SDLRPCParameterName const SDLRPCParameterNameDistanceToManeuverScale = @"distanceToManeuverScale";
SDLRPCParameterName const SDLRPCParameterNameDistanceUnitAvailable = @"distanceUnitAvailable";
SDLRPCParameterName const SDLRPCParameterNameDistanceUnit = @"distanceUnit";
+SDLRPCParameterName const SDLRPCParameterNameDoorStatuses = @"doorStatuses";
SDLRPCParameterName const SDLRPCParameterNameDoublePressAvailable = @"doublePressAvailable";
SDLRPCParameterName const SDLRPCParameterNameDriverAirbagDeployed = @"driverAirbagDeployed";
SDLRPCParameterName const SDLRPCParameterNameDriverBeltDeployed = @"driverBeltDeployed";
@@ -246,6 +257,7 @@ SDLRPCParameterName const SDLRPCParameterNameFilenames = @"filenames";
SDLRPCParameterName const SDLRPCParameterNameFileType = @"fileType";
SDLRPCParameterName const SDLRPCParameterNameFirmness = @"firmness";
SDLRPCParameterName const SDLRPCParameterNameFirmwareRevision = @"firmwareRev";
+SDLRPCParameterName const SDLRPCParameterNameForwardSeekIndicator = @"forwardSeekIndicator";
SDLRPCParameterName const SDLRPCParameterNameFreeModules = @"freeModules";
SDLRPCParameterName const SDLRPCParameterNameFrequencyInteger = @"frequencyInteger";
SDLRPCParameterName const SDLRPCParameterNameFrequencyFraction = @"frequencyFraction";
@@ -258,6 +270,7 @@ SDLRPCParameterName const SDLRPCParameterNameFuelMaintenanceMode = @"fuelMainten
SDLRPCParameterName const SDLRPCParameterNameFuelRange = @"fuelRange";
SDLRPCParameterName const SDLRPCParameterNameFunctionID = @"functionID";
SDLRPCParameterName const SDLRPCParameterNameFullAppID = @"fullAppID";
+SDLRPCParameterName const SDLRPCParameterNameGateStatuses = @"gateStatuses";
SDLRPCParameterName const SDLRPCParameterNameGearStatus = @"gearStatus";
SDLRPCParameterName const SDLRPCParameterNameGetWayPointsEnabled = @"getWayPointsEnabled";
SDLRPCParameterName const SDLRPCParameterNameGPS = @"gps";
@@ -344,6 +357,7 @@ SDLRPCParameterName const SDLRPCParameterNameIsSubscribed = @"isSubscribed";
SDLRPCParameterName const SDLRPCParameterNameJunctionType = @"junctionType";
SDLRPCParameterName const SDLRPCParameterNameKeepContext = @"keepContext";
SDLRPCParameterName const SDLRPCParameterNameKeepContextAvailable = @"keepContextAvailable";
+SDLRPCParameterName const SDLRPCParameterNameKeyboardCapabilities = @"keyboardCapabilities";
SDLRPCParameterName const SDLRPCParameterNameKeyboardLayout = @"keyboardLayout";
SDLRPCParameterName const SDLRPCParameterNameKeyboardProperties = @"keyboardProperties";
SDLRPCParameterName const SDLRPCParameterNameKeypressMode = @"keypressMode";
@@ -386,6 +400,8 @@ SDLRPCParameterName const SDLRPCParameterNameMajorVersion = @"majorVersion";
SDLRPCParameterName const SDLRPCParameterNameMake = @"make";
SDLRPCParameterName const SDLRPCParameterNameManeuverComplete = @"maneuverComplete";
SDLRPCParameterName const SDLRPCParameterNameManualTextEntry = @"manualTextEntry";
+SDLRPCParameterName const SDLRPCParameterNameMaskInputCharacters = @"maskInputCharacters";
+SDLRPCParameterName const SDLRPCParameterNameMaskInputCharactersSupported = @"maskInputCharactersSupported";
SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmness = @"massageCushionFirmness";
SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmnessAvailable = @"massageCushionFirmnessAvailable";
SDLRPCParameterName const SDLRPCParameterNameMassageEnabled = @"massageEnabled";
@@ -471,6 +487,7 @@ SDLRPCParameterName const SDLRPCParameterNameNotification = @"notification";
SDLRPCParameterName const SDLRPCParameterNameNumber = @"number";
SDLRPCParameterName const SDLRPCParameterNameNumberCustomPresetsAvailable = @"numCustomPresetsAvailable";
SDLRPCParameterName const SDLRPCParameterNameNumberTicks = @"numTicks";
+SDLRPCParameterName const SDLRPCParameterNameNumConfigurableKeys = @"numConfigurableKeys";
SDLRPCParameterName const SDLRPCParameterNameOdometer = @"odometer";
SDLRPCParameterName const SDLRPCParameterNameOEMCustomDataType = @"oemCustomDataType";
SDLRPCParameterName const SDLRPCParameterNameOffset = @"offset";
@@ -515,6 +532,7 @@ SDLRPCParameterName const SDLRPCParameterNamePrecipType = @"precipType";
SDLRPCParameterName const SDLRPCParameterNamePowerModeActive = @"powerModeActive";
SDLRPCParameterName const SDLRPCParameterNamePowerModeQualificationStatus = @"powerModeQualificationStatus";
SDLRPCParameterName const SDLRPCParameterNamePowerModeStatus = @"powerModeStatus";
+SDLRPCParameterName const SDLRPCParameterNamePreferredFPS = @"preferredFPS";
SDLRPCParameterName const SDLRPCParameterNamePreferredResolution = @"preferredResolution";
SDLRPCParameterName const SDLRPCParameterNamePrerecordedSpeech = @"prerecordedSpeech";
SDLRPCParameterName const SDLRPCParameterNamePresetBankCapabilities = @"presetBankCapabilities";
@@ -570,6 +588,7 @@ SDLRPCParameterName const SDLRPCParameterNameRightRearInflatableBelted = @"right
SDLRPCParameterName const SDLRPCParameterNameRightRow2BuckleBelted = @"rightRow2BuckleBelted";
SDLRPCParameterName const SDLRPCParameterNameRightRow3BuckleBelted = @"rightRow3BuckleBelted";
SDLRPCParameterName const SDLRPCParameterNameRolloverEvent = @"rolloverEvent";
+SDLRPCParameterName const SDLRPCParameterNameRoofStatuses = @"roofStatuses";
SDLRPCParameterName const SDLRPCParameterNameRow = @"row";
SDLRPCParameterName const SDLRPCParameterNameRows = @"rows";
SDLRPCParameterName const SDLRPCParameterNameRowSpan = @"rowspan";
@@ -588,12 +607,16 @@ SDLRPCParameterName const SDLRPCParameterNameSeatControlData = @"seatControlData
SDLRPCParameterName const SDLRPCParameterNameSeatControlCapabilities = @"seatControlCapabilities";
SDLRPCParameterName const SDLRPCParameterNameSeatLocation = @"seatLocation";
SDLRPCParameterName const SDLRPCParameterNameSeatLocationCapability = @"seatLocationCapability";
+SDLRPCParameterName const SDLRPCParameterNameSeatOccupancy = @"seatOccupancy";
SDLRPCParameterName const SDLRPCParameterNameSeats = @"seats";
+SDLRPCParameterName const SDLRPCParameterNameSeatsBelted = @"seatsBelted";
+SDLRPCParameterName const SDLRPCParameterNameSeatsOccupied = @"seatsOccupied";
SDLRPCParameterName const SDLRPCParameterNameSecondaryGraphic = @"secondaryGraphic";
SDLRPCParameterName const SDLRPCParameterNameSecondaryImage = @"secondaryImage";
SDLRPCParameterName const SDLRPCParameterNameSecondaryText = @"secondaryText";
SDLRPCParameterName const SDLRPCParameterNameSecond = @"second";
SDLRPCParameterName const SDLRPCParameterNameSeconds = @"seconds";
+SDLRPCParameterName const SDLRPCParameterNameSeekTime = @"seekTime";
SDLRPCParameterName const SDLRPCParameterNameSendLocationEnabled = @"sendLocationEnabled";
SDLRPCParameterName const SDLRPCParameterNameServiceActive = @"serviceActive";
SDLRPCParameterName const SDLRPCParameterNameServiceArea = @"serviceArea";
@@ -656,6 +679,7 @@ SDLRPCParameterName const SDLRPCParameterNameSupportedDiagnosticModes = @"suppor
SDLRPCParameterName const SDLRPCParameterNameSupportedDynamicImageFieldNames = @"supportedDynamicImageFieldNames";
SDLRPCParameterName const SDLRPCParameterNameSupportsDynamicSubMenus = @"supportsDynamicSubMenus";
SDLRPCParameterName const SDLRPCParameterNameSupportedFormats = @"supportedFormats";
+SDLRPCParameterName const SDLRPCParameterNameSupportedKeyboards = @"supportedKeyboards";
SDLRPCParameterName const SDLRPCParameterNameSupportedLights = @"supportedLights";
SDLRPCParameterName const SDLRPCParameterNameSyncFileName = @"syncFileName";
SDLRPCParameterName const SDLRPCParameterNameSyncMessageVersion = @"syncMsgVersion";
diff --git a/SmartDeviceLink/private/SDLSoftButtonManager.m b/SmartDeviceLink/private/SDLSoftButtonManager.m
index 01a8d0c05..7a2725c7c 100644
--- a/SmartDeviceLink/private/SDLSoftButtonManager.m
+++ b/SmartDeviceLink/private/SDLSoftButtonManager.m
@@ -11,6 +11,7 @@
#import "SDLConnectionManagerType.h"
#import "SDLError.h"
#import "SDLFileManager.h"
+#import "SDLGlobals.h"
#import "SDLLogMacros.h"
#import "SDLOnHMIStatus.h"
#import "SDLPredefinedWindows.h"
@@ -32,6 +33,9 @@
NS_ASSUME_NONNULL_BEGIN
+static const int SDLShowSoftButtonIDMin = 1;
+static const int SDLShowSoftButtonIDCount = 8;
+
@interface SDLSoftButtonObject()
@property (assign, nonatomic) NSUInteger buttonId;
@@ -75,7 +79,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)start {
- [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate:)];
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate)];
}
- (void)stop {
@@ -94,7 +98,8 @@ NS_ASSUME_NONNULL_BEGIN
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.name = @"SDLSoftButtonManager Transaction Queue";
queue.maxConcurrentOperationCount = 1;
- queue.qualityOfService = NSQualityOfServiceUserInitiated;
+ queue.qualityOfService = NSQualityOfServiceUserInteractive;
+ queue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
queue.suspended = YES;
return queue;
@@ -122,15 +127,19 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
- // Set the soft button ids. Check to make sure no two soft buttons have the same name, there aren't many soft buttons, so n^2 isn't going to be bad
- for (NSUInteger i = 0; i < softButtonObjects.count; i++) {
+ // Set the soft button ids. The number of soft buttons is maxed at 8 according to the RPC spec. We will only send the first 8 soft buttons if more are set into the array.
+ // Check to make sure no two soft buttons have the same name, there aren't many soft buttons, so n^2 isn't going to be bad
+ NSUInteger softButtonCount = MIN(softButtonObjects.count, SDLShowSoftButtonIDCount);
+ for (NSUInteger i = 0; i < softButtonCount; i++) {
NSString *buttonName = softButtonObjects[i].name;
- softButtonObjects[i].buttonId = i * 100;
- for (NSUInteger j = (i + 1); j < softButtonObjects.count; j++) {
+ // HAX: Due to a SYNC 3.0 bug (https://github.com/smartdevicelink/sdl_ios/issues/1793#issue-708356008), a `buttonId` can not be zero. As a workaround we will start the `buttonId`s from 1.
+ // Offset the soft buttons based on the minimum ID number to prevent clashes with other managers.
+ softButtonObjects[i].buttonId = i + SDLShowSoftButtonIDMin;
+ for (NSUInteger j = (i + 1); j < softButtonCount; j++) {
if ([softButtonObjects[j].name isEqualToString:buttonName]) {
_softButtonObjects = @[];
SDLLogE(@"Attempted to set soft button objects, but two buttons had the same name: %@", softButtonObjects);
- return;
+ @throw [NSException sdl_duplicateSoftButtonsNameException];
}
}
}
@@ -210,23 +219,12 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Observers
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
+- (void)sdl_displayCapabilityDidUpdate {
SDLSoftButtonCapabilities *oldCapabilities = self.softButtonCapabilities;
// Extract and update the capabilities
- NSArray<SDLDisplayCapability *> *capabilities = systemCapability.displayCapabilities;
- if (capabilities == nil || capabilities.count == 0) {
- self.softButtonCapabilities = nil;
- } else {
- SDLDisplayCapability *mainDisplay = capabilities[0];
- for (SDLWindowCapability *windowCapability in mainDisplay.windowCapabilities) {
- NSUInteger currentWindowID = windowCapability.windowID != nil ? windowCapability.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
- if (currentWindowID != SDLPredefinedWindowsDefaultWindow) { continue; }
-
- self.softButtonCapabilities = windowCapability.softButtonCapabilities.firstObject;
- break;
- }
- }
+ SDLWindowCapability *currentWindowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
+ self.softButtonCapabilities = currentWindowCapability.softButtonCapabilities.firstObject;
// Update the queue's suspend state
[self sdl_updateTransactionQueueSuspended];
diff --git a/SmartDeviceLink/private/SDLSoftButtonReplaceOperation.m b/SmartDeviceLink/private/SDLSoftButtonReplaceOperation.m
index d3a68735c..8897f4b10 100644
--- a/SmartDeviceLink/private/SDLSoftButtonReplaceOperation.m
+++ b/SmartDeviceLink/private/SDLSoftButtonReplaceOperation.m
@@ -103,7 +103,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)sdl_uploadInitialStateImagesWithCompletionHandler:(void (^)(void))handler {
NSMutableArray<SDLArtwork *> *initialStatesToBeUploaded = [NSMutableArray array];
for (SDLSoftButtonObject *object in self.softButtonObjects) {
- if ([self sdl_artworkNeedsUpload:object.currentState.artwork]) {
+ if ([self.fileManager fileNeedsUpload:object.currentState.artwork]) {
[initialStatesToBeUploaded addObject:object.currentState.artwork];
}
}
@@ -118,7 +118,7 @@ NS_ASSUME_NONNULL_BEGIN
for (SDLSoftButtonObject *object in self.softButtonObjects) {
for (SDLSoftButtonState *state in object.states) {
if ([state.name isEqualToString:object.currentState.name]) { continue; }
- if ([self sdl_artworkNeedsUpload:state.artwork]) {
+ if ([self.fileManager fileNeedsUpload:state.artwork]) {
[otherStatesToBeUploaded addObject:state.artwork];
}
}
@@ -174,8 +174,9 @@ NS_ASSUME_NONNULL_BEGIN
[softButtons addObject:buttonObject.currentStateSoftButton];
}
+ // HAX: Work around a bug in Sync where not sending a main field when sending soft buttons will lock up the head unit for 10-15 seconds.
SDLShow *show = [[SDLShow alloc] init];
- show.mainField1 = self.mainField1;
+ show.mainField1 = self.mainField1 ?: @"";
show.softButtons = [softButtons copy];
[self.connectionManager sendConnectionRequest:show withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
@@ -227,17 +228,13 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Images
-- (BOOL)sdl_artworkNeedsUpload:(SDLArtwork *)artwork {
- return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && self.softButtonCapabilities.imageSupported.boolValue && !artwork.isStaticIcon);
-}
-
/// Checks all the button states for images that need to be uploaded.
/// @return True if all images have been uploaded; false at least one image needs to be uploaded
- (BOOL)sdl_allStateImagesAreUploaded {
for (SDLSoftButtonObject *button in self.softButtonObjects) {
for (SDLSoftButtonState *state in button.states) {
SDLArtwork *artwork = state.artwork;
- if (![self sdl_artworkNeedsUpload:artwork]) { continue; }
+ if (![self.fileManager fileNeedsUpload:artwork]) { continue; }
return NO;
}
}
diff --git a/SmartDeviceLink/private/SDLSoftButtonTransitionOperation.m b/SmartDeviceLink/private/SDLSoftButtonTransitionOperation.m
index add03489c..23265319f 100644
--- a/SmartDeviceLink/private/SDLSoftButtonTransitionOperation.m
+++ b/SmartDeviceLink/private/SDLSoftButtonTransitionOperation.m
@@ -50,8 +50,9 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdl_sendNewSoftButtons {
+ // HAX: Work around a bug in Sync where not sending a main field when sending soft buttons will lock up the head unit for 10-15 seconds.
SDLShow *newShow = [[SDLShow alloc] init];
- newShow.mainField1 = self.mainField1;
+ newShow.mainField1 = self.mainField1 ?: @"";
newShow.softButtons = [self sdl_currentStateSoftButtonsForObjects:self.softButtons];
[self.connectionManager sendConnectionRequest:newShow withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
diff --git a/SmartDeviceLink/private/SDLStreamingAudioLifecycleManager.m b/SmartDeviceLink/private/SDLStreamingAudioLifecycleManager.m
index 5e77bb305..4a3195613 100644
--- a/SmartDeviceLink/private/SDLStreamingAudioLifecycleManager.m
+++ b/SmartDeviceLink/private/SDLStreamingAudioLifecycleManager.m
@@ -15,6 +15,7 @@
#import "SDLControlFramePayloadConstants.h"
#import "SDLControlFramePayloadNak.h"
#import "SDLDisplayCapabilities.h"
+#import "SDLEncryptionConfiguration.h"
#import "SDLGlobals.h"
#import "SDLHMICapabilities.h"
#import "SDLLogMacros.h"
@@ -28,7 +29,7 @@
#import "SDLStateMachine.h"
#import "SDLStreamingMediaConfiguration.h"
#import "SDLSystemCapabilityManager.h"
-#import "SDLEncryptionConfiguration.h"
+#import "SDLSystemInfo.h"
#import "SDLVehicleType.h"
NS_ASSUME_NONNULL_BEGIN
@@ -44,7 +45,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic) SDLProtocol *protocol;
@property (copy, nonatomic) NSArray<NSString *> *secureMakes;
-@property (copy, nonatomic, nullable) NSString *connectedVehicleMake;
@property (assign, nonatomic, readwrite, getter=isAudioEncrypted) BOOL audioEncrypted;
@property (nonatomic, copy, nullable) void (^audioServiceEndedCompletionHandler)(void);
@@ -72,7 +72,6 @@ NS_ASSUME_NONNULL_BEGIN
_audioStreamStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLAudioStreamManagerStateStopped states:[self.class sdl_audioStreamingStateTransitionDictionary]];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_didReceiveRegisterAppInterfaceResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiLevelDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
return self;
@@ -96,7 +95,6 @@ NS_ASSUME_NONNULL_BEGIN
SDLLogD(@"Stopping manager");
_protocol = nil;
_hmiLevel = SDLHMILevelNone;
- _connectedVehicleMake = nil;
[self.audioTranscodingManager stop];
[self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
@@ -162,7 +160,9 @@ NS_ASSUME_NONNULL_BEGIN
- (void)didEnterStateAudioStreamStarting {
SDLLogD(@"Audio stream starting");
- if ((self.requestedEncryptionType != SDLStreamingEncryptionFlagNone) && ([self.secureMakes containsObject:self.connectedVehicleMake])) {
+
+ NSString *connectedVehicleMake = self.connectionManager.systemInfo.vehicleType.make;
+ if ((self.requestedEncryptionType != SDLStreamingEncryptionFlagNone) && ([self.secureMakes containsObject:connectedVehicleMake])) {
[self.protocol startSecureServiceWithType:SDLServiceTypeAudio payload:nil tlsInitializationHandler:^(BOOL success, NSError * _Nonnull error) {
if (error) {
SDLLogE(@"TLS setup error: %@", error);
@@ -227,18 +227,6 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - SDL RPC Notification callbacks
-- (void)sdl_didReceiveRegisterAppInterfaceResponse:(SDLRPCResponseNotification *)notification {
- NSAssert([notification.response isKindOfClass:[SDLRegisterAppInterfaceResponse class]], @"A notification was sent with an unanticipated object");
- if (![notification.response isKindOfClass:[SDLRegisterAppInterfaceResponse class]]) {
- return;
- }
-
- SDLLogV(@"Received Register App Interface response");
- SDLRegisterAppInterfaceResponse *registerResponse = (SDLRegisterAppInterfaceResponse*)notification.response;
-
- self.connectedVehicleMake = registerResponse.vehicleType.make;
-}
-
- (void)sdl_hmiLevelDidChange:(SDLRPCNotificationNotification *)notification {
NSAssert([notification.notification isKindOfClass:[SDLOnHMIStatus class]], @"A notification was sent with an unanticipated object");
if (![notification.notification isKindOfClass:[SDLOnHMIStatus class]]) {
diff --git a/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.h b/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.h
index 9fb1b39a1..3ba42bd5b 100644
--- a/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.h
+++ b/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.h
@@ -20,7 +20,6 @@
@class SDLImageResolution;
@class SDLProtocol;
@class SDLStateMachine;
-@class SDLStreamingMediaConfiguration;
@class SDLStreamingVideoScaleManager;
@class SDLSystemCapabilityManager;
@class SDLTouchManager;
diff --git a/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m b/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m
index 5d1236a98..1a052eee2 100644
--- a/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m
+++ b/SmartDeviceLink/private/SDLStreamingVideoLifecycleManager.m
@@ -9,6 +9,7 @@
#import "SDLStreamingVideoLifecycleManager.h"
#import "CVPixelBufferRef+SDLUtil.h"
+#import "SDLAppCapability.h"
#import "SDLCarWindow.h"
#import "SDLConfiguration.h"
#import "SDLConnectionManagerType.h"
@@ -24,10 +25,12 @@
#import "SDLGlobals.h"
#import "SDLH264VideoEncoder.h"
#import "SDLHMILevel.h"
-#import "SDLImageResolution.h"
+#import "SDLImageResolution+StreamingVideoExtensions.h"
#import "SDLLifecycleConfiguration.h"
#import "SDLLogMacros.h"
+#import "SDLOnAppCapabilityUpdated.h"
#import "SDLOnHMIStatus.h"
+#import "SDLOnSystemCapabilityUpdated.h"
#import "SDLProtocol.h"
#import "SDLProtocolMessage.h"
#import "SDLPredefinedWindows.h"
@@ -36,16 +39,19 @@
#import "SDLRPCResponseNotification.h"
#import "SDLScreenParams.h"
#import "SDLStateMachine.h"
+#import "SDLStreamingVideoDelegate.h"
#import "SDLStreamingMediaConfiguration.h"
#import "SDLEncryptionConfiguration.h"
#import "SDLStreamingMediaManagerDataSource.h"
#import "SDLStreamingVideoScaleManager.h"
+#import "SDLVideoStreamingRange.h"
#import "SDLSystemCapability.h"
#import "SDLSystemCapabilityManager.h"
+#import "SDLSystemInfo.h"
#import "SDLTouchManager.h"
#import "SDLVehicleType.h"
#import "SDLVideoEncoderDelegate.h"
-#import "SDLVideoStreamingCapability.h"
+#import "SDLVideoStreamingCapability+StreamingVideoExtensions.h"
static NSUInteger const FramesToSendOnBackground = 30;
@@ -71,7 +77,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
@property (strong, nonatomic) NSMutableDictionary *videoEncoderSettings;
@property (copy, nonatomic) NSDictionary<NSString *, id> *customEncoderSettings;
@property (copy, nonatomic) NSArray<NSString *> *secureMakes;
-@property (copy, nonatomic, nullable) NSString *connectedVehicleMake;
@property (copy, nonatomic, readonly) NSString *appName;
@property (assign, nonatomic) CV_NULLABLE CVPixelBufferRef backgroundingPixelBuffer;
@@ -81,6 +86,15 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
@property (assign, nonatomic, readwrite, getter=isVideoEncrypted) BOOL videoEncrypted;
+@property (strong, nonatomic, nullable) SDLVideoStreamingCapability *videoStreamingCapability;
+@property (strong, nonatomic, nullable) SDLVideoStreamingCapability *videoStreamingCapabilityUpdated;
+@property (assign, nonatomic) BOOL shouldAutoResume;
+@property (assign, nonatomic) BOOL shouldSendOnAppCapabilityUpdated;
+@property (assign, nonatomic) BOOL shouldUpdateDelegateOnSizeChange;
+@property (strong, nonatomic, nullable) SDLVideoStreamingRange *supportedLandscapeStreamingRange;
+@property (strong, nonatomic, nullable) SDLVideoStreamingRange *supportedPortraitStreamingRange;
+@property (weak, nonatomic, nullable) id<SDLStreamingVideoDelegate> delegate;
+
/**
* SSRC of RTP header field.
*
@@ -95,6 +109,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
@property (copy, nonatomic, readonly) NSString *videoStreamBackgroundString;
@property (nonatomic, copy, nullable) void (^videoServiceEndedCompletionHandler)(void);
+@property (assign, nonatomic) BOOL isSubscribedForNotifications;
@end
@implementation SDLStreamingVideoLifecycleManager
@@ -113,6 +128,9 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
_customEncoderSettings = configuration.streamingMediaConfig.customVideoEncoderSettings;
_videoScaleManager = [[SDLStreamingVideoScaleManager alloc] init];
+ _supportedLandscapeStreamingRange = configuration.streamingMediaConfig.supportedLandscapeStreamingRange;
+ _supportedPortraitStreamingRange = configuration.streamingMediaConfig.supportedPortraitStreamingRange;
+
if (configuration.streamingMediaConfig.rootViewController != nil) {
NSAssert(configuration.streamingMediaConfig.enableForcedFramerateSync, @"When using CarWindow (rootViewController != nil), forceFrameRateSync must be YES");
@@ -126,6 +144,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
_touchManager = [[SDLTouchManager alloc] initWithHitTester:(id)_focusableItemManager videoScaleManager:_videoScaleManager];
+ _delegate = configuration.streamingMediaConfig.delegate;
_requestedEncryptionType = configuration.streamingMediaConfig.maximumDesiredEncryption;
_dataSource = configuration.streamingMediaConfig.dataSource;
_useDisplayLink = configuration.streamingMediaConfig.enableForcedFramerateSync;
@@ -159,11 +178,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
_appStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:initialState states:[self.class sdl_appStateTransitionDictionary]];
_videoStreamStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLVideoStreamManagerStateStopped states:[self.class sdl_videoStreamStateTransitionDictionary]];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_didReceiveRegisterAppInterfaceResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationDidBecomeActiveNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationWillResignActiveNotification object:nil];
+ [self sdl_subscribeToNotifications];
_ssrc = arc4random_uniform(UINT32_MAX);
_lastPresentationTimestamp = kCMTimeInvalid;
@@ -171,17 +186,25 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
return self;
}
+- (void)sdl_shutDown {
+ [self.systemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypeVideoStreaming withObserver:self];
+ [self sdl_unsubscribeNotifications];
+}
+
+- (void)dealloc {
+ [self sdl_shutDown];
+}
+
- (void)startWithProtocol:(SDLProtocol *)protocol {
SDLLogD(@"Starting with protocol: %@", protocol);
_protocol = protocol;
-
@synchronized(self.protocol.protocolDelegateTable) {
if (![self.protocol.protocolDelegateTable containsObject:self]) {
[self.protocol.protocolDelegateTable addObject:self];
}
}
-
[self.focusableItemManager start];
+ self.shouldSendOnAppCapabilityUpdated = YES;
// attempt to start streaming since we may already have necessary conditions met
[self sdl_startVideoSession];
@@ -196,11 +219,15 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
_lastPresentationTimestamp = kCMTimeInvalid;
_hmiLevel = SDLHMILevelNone;
_videoStreamingState = SDLVideoStreamingStateNotStreamable;
- _protocol = nil;
[self.videoScaleManager stop];
[self.focusableItemManager stop];
- _connectedVehicleMake = nil;
+ @synchronized(self.protocol.protocolDelegateTable) {
+ if ([self.protocol.protocolDelegateTable containsObject:self]) {
+ [self.protocol.protocolDelegateTable removeObject:self];
+ }
+ }
+ _protocol = nil;
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
}
@@ -304,21 +331,21 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
if (_showVideoBackgroundDisplay) {
[self sdl_sendBackgroundFrames];
}
- [self.touchManager cancelPendingTouches];
-
- if (self.isVideoConnected) {
- [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateSuspended];
- } else {
- [self sdl_stopVideoSession];
- }
+ [self sdl_suspendVideo];
}
// Per Apple's guidelines: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StrategiesforHandlingAppStateTransitions/StrategiesforHandlingAppStateTransitions.html
// We should be waiting to start any OpenGL drawing until UIApplicationDidBecomeActive is called.
- (void)didEnterStateAppActive {
SDLLogD(@"App became active");
+ [self sdl_resumeVideo];
+}
+
+- (void)sdl_resumeVideo {
+ self.shouldAutoResume = NO;
+
if (self.protocol == nil) {
- SDLLogV(@"No session established with head unit. Ignoring app foregounded notification");
+ SDLLogV(@"No session established with head unit. Cannot continue video.");
return;
}
@@ -329,11 +356,26 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
}
+- (void)sdl_suspendVideo {
+ if (!self.protocol) {
+ SDLLogV(@"No session established with head unit. Cannot suspend video.");
+ return;
+ }
+
+ [self.touchManager cancelPendingTouches];
+
+ if (self.isVideoConnected) {
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateSuspended];
+ } else {
+ [self sdl_stopVideoSession];
+ }
+}
+
#pragma mark Video Streaming
+ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_videoStreamStateTransitionDictionary {
return @{
SDLVideoStreamManagerStateStopped : @[SDLVideoStreamManagerStateStarting],
- SDLVideoStreamManagerStateStarting : @[SDLVideoStreamManagerStateStopped, SDLVideoStreamManagerStateReady],
+ SDLVideoStreamManagerStateStarting : @[SDLVideoStreamManagerStateStopped, SDLVideoStreamManagerStateReady, SDLVideoStreamManagerStateSuspended],
SDLVideoStreamManagerStateReady : @[SDLVideoStreamManagerStateSuspended, SDLVideoStreamManagerStateShuttingDown, SDLVideoStreamManagerStateStopped],
SDLVideoStreamManagerStateSuspended : @[SDLVideoStreamManagerStateReady, SDLVideoStreamManagerStateShuttingDown, SDLVideoStreamManagerStateStopped],
SDLVideoStreamManagerStateShuttingDown : @[SDLVideoStreamManagerStateStopped]
@@ -347,10 +389,17 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
self.displayLink = nil;
}
+#pragma mark - Video State Machine callbacks
+
- (void)didEnterStateVideoStreamStopped {
SDLLogD(@"Video stream stopped");
_videoEncrypted = NO;
_videoFormat = nil;
+ self.shouldUpdateDelegateOnSizeChange = NO;
+
+ if (!self.shouldAutoResume) {
+ [self.systemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypeVideoStreaming withObserver:self];
+ }
if (_videoEncoder != nil) {
[_videoEncoder stop];
@@ -370,66 +419,36 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
self.videoServiceEndedCompletionHandler();
self.videoServiceEndedCompletionHandler = nil;
}
+
+ if (self.shouldAutoResume) {
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStarting];
+ }
}
- (void)didEnterStateVideoStreamStarting {
SDLLogD(@"Video stream starting");
- __weak typeof(self) weakSelf = self;
- [self sdl_requestVideoCapabilities:^(SDLVideoStreamingCapability * _Nullable capability) {
- SDLLogD(@"Received video capability response");
- SDLLogV(@"Capability: %@", capability);
-
- if (capability != nil) {
- // If we got a response, get the head unit's preferred formats and resolutions
- weakSelf.preferredFormats = capability.supportedFormats;
- weakSelf.preferredResolutions = @[capability.preferredResolution];
- if (capability.maxBitrate != nil) {
- weakSelf.videoEncoderSettings[(__bridge NSString *) kVTCompressionPropertyKey_AverageBitRate] = [[NSNumber alloc] initWithUnsignedLongLong:(capability.maxBitrate.unsignedLongLongValue * 1000)];
- }
-
- if (weakSelf.dataSource != nil) {
- SDLLogV(@"Calling data source for modified preferred formats");
- weakSelf.preferredFormats = [weakSelf.dataSource preferredVideoFormatOrderFromHeadUnitPreferredOrder:weakSelf.preferredFormats];
- }
-
- if (weakSelf.focusableItemManager != nil) {
- weakSelf.focusableItemManager.enableHapticDataRequests = capability.hapticSpatialDataSupported.boolValue;
- }
-
- SDLLogD(@"Got specialized video capabilites, preferred formats: %@, haptics enabled %@", weakSelf.preferredFormats, (capability.hapticSpatialDataSupported.boolValue ? @"YES" : @"NO"));
- } else {
- // If no response, assume that the format is H264 RAW and get the screen resolution from the RAI response's display capabilities.
- SDLVideoStreamingFormat *format = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRAW];
- SDLImageResolution *resolution = [[SDLImageResolution alloc] initWithWidth:(uint16_t)weakSelf.videoScaleManager.displayViewportResolution.width height:(uint16_t)weakSelf.videoScaleManager.displayViewportResolution.height];
- weakSelf.preferredFormats = @[format];
- weakSelf.preferredResolutions = @[resolution];
-
- if (weakSelf.focusableItemManager != nil) {
- weakSelf.focusableItemManager.enableHapticDataRequests = NO;
- }
-
- SDLLogD(@"Using generic video capabilites, preferred formats: %@, resolutions: %@, haptics disabled", weakSelf.preferredFormats, weakSelf.preferredResolutions);
- }
-
- // Apply customEncoderSettings here. Note that value from HMI (such as maxBitrate) will be overwritten by custom settings.
- for (id key in self.customEncoderSettings.keyEnumerator) {
- self.videoEncoderSettings[key] = [self.customEncoderSettings valueForKey:key];
- }
-
- if (weakSelf.dataSource != nil) {
- SDLLogV(@"Calling data source for modified preferred resolutions");
- weakSelf.preferredResolutions = [weakSelf.dataSource resolutionFromHeadUnitPreferredResolution:weakSelf.preferredResolutions.firstObject];
- SDLLogD(@"Got specialized video resolutions: %@", weakSelf.preferredResolutions);
- }
-
- [self sdl_sendVideoStartService];
- }];
+ const BOOL applyCapabilities = self.shouldAutoResume && (self.videoStreamingCapabilityUpdated != nil);
+ if (applyCapabilities) {
+ //apply previously received video capabilities
+ [self sdl_applyVideoCapabilityWhileStarting:self.videoStreamingCapabilityUpdated];
+ }
+ self.shouldAutoResume = NO;
+ self.videoStreamingCapabilityUpdated = nil;
+ if (!applyCapabilities) {
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeVideoStreaming withObserver:self selector:@selector(sdl_videoStreamingCapabilityDidUpdate:)];
+ }
}
- (void)didEnterStateVideoStreamReady {
SDLLogD(@"Video stream ready");
+ if ([self.currentAppState isEqual:SDLAppStateInactive]) {
+ SDLLogD(@"Video streaming will not start until the app becomes active");
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateSuspended];
+ return;
+ }
+
if (self.videoEncoder != nil) {
[self.videoEncoder stop];
self.videoEncoder = nil;
@@ -439,6 +458,16 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[[NSNotificationCenter defaultCenter] postNotificationName:SDLVideoStreamDidStartNotification object:nil];
+ // Don't update the delegate if video is resuming after being suspended.
+ if (self.shouldUpdateDelegateOnSizeChange && self.delegate != nil) {
+ const CGSize displaySize = self.videoStreamingCapability.makeImageResolution.makeSize;
+ __weak typeof(self) weakSelf = self;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [weakSelf.delegate videoStreamingSizeDidUpdate:displaySize];
+ });
+ }
+ self.shouldUpdateDelegateOnSizeChange = NO;
+
if (!self.isAppStateVideoStreamCapable) {
SDLLogD(@"App is in the background and can not stream video. Video will resume when app is foregrounded");
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateSuspended];
@@ -449,8 +478,9 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
NSError* error = nil;
NSAssert(self.videoFormat != nil, @"No video format is known, but it must be if we got a protocol start service response");
- SDLLogD(@"Attempting to create video encoder");
- self.videoEncoder = [[SDLH264VideoEncoder alloc] initWithProtocol:self.videoFormat.protocol dimensions:self.videoScaleManager.appViewportFrame.size ssrc:self.ssrc properties:self.videoEncoderSettings delegate:self error:&error];
+ const CGSize dimensions = self.videoScaleManager.appViewportFrame.size;
+ SDLLogD(@"Attempting to create video encoder (dimensions: %@; protocol: %@)", NSStringFromCGSize(dimensions), self.videoFormat.protocol);
+ self.videoEncoder = [[SDLH264VideoEncoder alloc] initWithProtocol:self.videoFormat.protocol dimensions:dimensions ssrc:self.ssrc properties:self.videoEncoderSettings delegate:self error:&error];
if (error || self.videoEncoder == nil) {
SDLLogE(@"Could not create a video encoder: %@", error);
@@ -460,7 +490,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
if (!self.backgroundingPixelBuffer) {
CVPixelBufferRef backgroundingPixelBuffer = [self.videoEncoder newPixelBuffer];
- if (CVPixelBufferAddText(backgroundingPixelBuffer, self.videoStreamBackgroundString) == NO) {
+ if (!CVPixelBufferAddText(backgroundingPixelBuffer, self.videoStreamBackgroundString)) {
SDLLogE(@"Could not create a backgrounding frame");
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
return;
@@ -477,6 +507,9 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
__strong typeof(weakSelf) strongSelf = weakSelf;
NSInteger targetFramerate = ((NSNumber *)strongSelf.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).integerValue;
SDLLogD(@"Initializing CADisplayLink with framerate: %ld", (long)targetFramerate);
+ if (strongSelf.displayLink) {
+ SDLLogW(@"The display link was not disposed in good time");
+ }
strongSelf.displayLink = [CADisplayLink displayLinkWithTarget:strongSelf selector:@selector(sdl_displayLinkFired:)];
strongSelf.displayLink.preferredFramesPerSecond = targetFramerate;
[strongSelf.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
@@ -489,6 +522,17 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
- (void)didEnterStateVideoStreamSuspended {
SDLLogD(@"Video stream suspended");
[self sdl_disposeDisplayLink];
+ if (self.shouldAutoResume) {
+ self.shouldAutoResume = NO;
+ SDLVideoStreamingCapability *capability = (self.videoStreamingCapabilityUpdated == nil) ? self.videoStreamingCapability : self.videoStreamingCapabilityUpdated;
+ typeof(self) weakSelf = self;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if (capability) {
+ [weakSelf sdl_applyVideoCapability:capability];
+ }
+ [weakSelf sdl_resumeVideo];
+ });
+ }
[[NSNotificationCenter defaultCenter] postNotificationName:SDLVideoStreamSuspendedNotification object:nil];
}
@@ -503,6 +547,11 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
if (startServiceACK.header.serviceType != SDLServiceTypeVideo) { return; }
+ if (![self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateStarting]) {
+ SDLLogW(@"Request to start video service ACKed in wrong state %@, skip", self.videoStreamStateMachine.currentState);
+ return;
+ }
+
self.videoEncrypted = startServiceACK.header.encrypted;
SDLControlFramePayloadVideoStartServiceAck *videoAckPayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithData:startServiceACK.payload];
@@ -510,28 +559,34 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
// This is the definitive screen size that will be used
if ((videoAckPayload.height != SDLControlFrameInt32NotFound || videoAckPayload.height != 0) && (videoAckPayload.width != SDLControlFrameInt32NotFound && videoAckPayload.width != 0)) {
- self.videoScaleManager.displayViewportResolution = CGSizeMake(videoAckPayload.width, videoAckPayload.height);
+ const float scale = self.videoScaleManager.scale;
+ const CGSize ackSize = CGSizeMake(videoAckPayload.width, videoAckPayload.height);
+ self.videoScaleManager.displayViewportResolution = CGSizeMake(ackSize.width * scale, ackSize.height * scale);
} else if (self.preferredResolutions.count > 0) {
// If a preferred resolution was set, use the first option to set the screen size
SDLImageResolution *preferredResolution = self.preferredResolutions.firstObject;
- CGSize newScreenSize = CGSizeMake(preferredResolution.resolutionWidth.floatValue, preferredResolution.resolutionHeight.floatValue);
+ const CGSize newScreenSize = preferredResolution.makeSize;
if (!CGSizeEqualToSize(self.videoScaleManager.displayViewportResolution, newScreenSize)) {
SDLLogW(@"The preferred resolution does not match the screen dimensions returned by the Register App Interface Response. Video may look distorted or video may not show up on the head unit");
- self.videoScaleManager.displayViewportResolution = CGSizeMake(preferredResolution.resolutionWidth.floatValue, preferredResolution.resolutionHeight.floatValue);
+ self.videoScaleManager.displayViewportResolution = newScreenSize;
}
- } // else we are using the screen size we got from the RAIR earlier
+ } // else we are using the screen size we got from the RAI earlier
// Figure out the definitive format that will be used. If the protocol / codec weren't passed in the payload, it's probably a system that doesn't support those properties, which also means it's a system that requires H.264 RAW encoding
- self.videoFormat = [[SDLVideoStreamingFormat alloc] init];
- self.videoFormat.codec = videoAckPayload.videoCodec ?: SDLVideoStreamingCodecH264;
- self.videoFormat.protocol = videoAckPayload.videoProtocol ?: SDLVideoStreamingProtocolRAW;
+ self.videoFormat = [[SDLVideoStreamingFormat alloc] initWithCodec:videoAckPayload.videoCodec ?: SDLVideoStreamingCodecH264 protocol:videoAckPayload.videoProtocol ?: SDLVideoStreamingProtocolRAW];
+ // Video is ready to stream. If the app is inactive and can't stream video, then the Ready state will handle transitioning to the Suspended state
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateReady];
}
- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK {
if (startServiceNAK.header.serviceType != SDLServiceTypeVideo) { return; }
+ if (![self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateStarting]) {
+ SDLLogW(@"Request to start video service NAKed in wrong state %@, skip", self.videoStreamStateMachine.currentState);
+ return;
+ }
+
SDLControlFramePayloadNak *nakPayload = [[SDLControlFramePayloadNak alloc] initWithData:startServiceNAK.payload];
SDLLogE(@"Request to start video service NAKed on transport %@, with payload: %@", protocol.transport, nakPayload);
@@ -561,12 +616,20 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
if (endServiceACK.header.serviceType != SDLServiceTypeVideo) { return; }
SDLLogD(@"Request to end video service ACKed on transport %@", protocol.transport);
+ if (![self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateShuttingDown]) {
+ SDLLogW(@"end service in wrong state %@", self.videoStreamStateMachine.currentState);
+ }
+
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
}
- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK {
if (endServiceNAK.header.serviceType != SDLServiceTypeVideo) { return; }
+ if (![self.videoStreamStateMachine.currentState isEqualToEnum:SDLVideoStreamManagerStateShuttingDown]) {
+ SDLLogW(@"Request to end video service NAKed in wrong state %@", self.videoStreamStateMachine.currentState);
+ }
+
SDLControlFramePayloadNak *nakPayload = [[SDLControlFramePayloadNak alloc] initWithData:endServiceNAK.payload];
SDLLogE(@"Request to end video service NAKed on transport %@, with payload: %@", protocol.transport, nakPayload);
@@ -582,26 +645,32 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
return;
}
- SDLLogD(@"Received Register App Interface");
+ SDLLogV(@"Received Register App Interface");
SDLRegisterAppInterfaceResponse *registerResponse = (SDLRegisterAppInterfaceResponse *)notification.response;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
SDLImageResolution *resolution = registerResponse.displayCapabilities.screenParams.resolution;
#pragma clang diagnostic pop
- if (resolution != nil) {
- self.videoScaleManager.displayViewportResolution = CGSizeMake(resolution.resolutionWidth.floatValue,
- resolution.resolutionHeight.floatValue);
+ if (resolution) {
+ const CGSize initSize = resolution.makeSize;
+ // use initial size and default scale, it may change on video capabilities update
+ self.videoScaleManager.displayViewportResolution = initSize;
+ self.videoScaleManager.scale = 1;
// HAX: Workaround for Legacy Ford and Lincoln displays with > 800 resolution width or height. They don't support scaling and if we don't do this workaround, they will not correctly scale the view.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
NSString *make = registerResponse.vehicleType.make;
+#pragma clang diagnostic pop
CGSize resolution = self.videoScaleManager.displayViewportResolution;
if (([make containsString:@"Ford"] || [make containsString:@"Lincoln"]) && (resolution.width > 800 || resolution.height > 800)) {
self.videoScaleManager.scale = 1.0f / 0.75f; // Scale by 1.333333
}
+ } else {
+ self.videoScaleManager.displayViewportResolution = CGSizeZero;
+ self.videoScaleManager.scale = 1;
}
- self.connectedVehicleMake = registerResponse.vehicleType.make;
-
SDLLogD(@"Determined base screen size on display capabilities: %@", NSStringFromCGSize(self.videoScaleManager.displayViewportResolution));
}
@@ -644,6 +713,249 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
}
+- (void)sdl_subscribeToNotifications {
+ NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
+ if (!self.isSubscribedForNotifications) {
+ self.isSubscribedForNotifications = YES;
+ [notificationCenter addObserver:self selector:@selector(sdl_didReceiveRegisterAppInterfaceResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
+ [notificationCenter addObserver:self selector:@selector(sdl_hmiStatusDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
+ [notificationCenter addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationDidBecomeActiveNotification object:nil];
+ [notificationCenter addObserver:self selector:@selector(sdl_appStateDidUpdate:) name:UIApplicationWillResignActiveNotification object:nil];
+ }
+}
+
+- (void)sdl_unsubscribeNotifications {
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ self.isSubscribedForNotifications = NO;
+}
+
+#pragma mark - Subscribed notifications
+
+- (void)sdl_videoStreamingCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
+ SDLVideoStreamingCapability *videoCapability = systemCapability.videoStreamingCapability;
+
+ if (videoCapability) {
+ SDLLogD(@"Video capabilities notification received (%@): %@", self.videoStreamStateMachine.currentState, videoCapability);
+ [self sdl_useVideoCapability:videoCapability];
+ } else {
+ SDLLogD(@"Empty video capabilities notification received (%@)", self.videoStreamStateMachine.currentState);
+ // If no response, assume that the format is H264 RAW and get the screen resolution from the RAI response's display capabilities.
+ SDLVideoStreamingFormat *format = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRAW];
+ SDLImageResolution *resolution = [[SDLImageResolution alloc] initWithWidth:(uint16_t)self.videoScaleManager.displayViewportResolution.width height:(uint16_t)self.videoScaleManager.displayViewportResolution.height];
+ self.preferredFormats = @[format];
+ self.preferredResolutions = @[resolution];
+ if (self.focusableItemManager != nil) {
+ self.focusableItemManager.enableHapticDataRequests = NO;
+ }
+ SDLLogD(@"Using generic video capabilites, preferred formats: %@, resolutions: %@, haptics disabled", self.preferredFormats, self.preferredResolutions);
+
+ // HAX: to support legacy head units (SYNC 3.0) as a slight delay is needed between getting the `OnHMIStatus` notification and sending the video `StartService`. Otherwise, video will stream but the screen will be black. Add the delay here as legacy head units do not support `videoStreamingCapability`.
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 250 * NSEC_PER_MSEC), dispatch_get_main_queue(), ^{
+ [self sdl_useVideoCapability:nil];
+ });
+ }
+}
+
+#pragma mark - Video capability logic
+
+- (void)sdl_useVideoCapability:(nullable SDLVideoStreamingCapability *)videoCapability {
+ if ([self.currentVideoStreamState isEqualToEnum:SDLVideoStreamManagerStateStarting]) {
+ [self sdl_applyVideoCapabilityWhileStarting:videoCapability];
+ } else if ([self.currentVideoStreamState isEqualToEnum:SDLVideoStreamManagerStateReady] || [self.currentVideoStreamState isEqualToEnum:SDLVideoStreamManagerStateSuspended]) {
+ [self sdl_applyVideoCapabilityWhenStreaming:videoCapability];
+ } else {
+ SDLLogD(@"Received video capabilities in wrong state: %@; ignore it", self.videoStreamStateMachine.currentState);
+ }
+}
+
+- (void)sdl_applyVideoCapabilityWhileStarting:(nullable SDLVideoStreamingCapability *)videoCapabilityUpdated {
+ SDLVideoStreamingCapability *videoCapability = (videoCapabilityUpdated == nil) ? [self sdl_defaultVideoCapability] : videoCapabilityUpdated;
+ NSArray<SDLVideoStreamingCapability *> *capabilityMatches = [self matchVideoCapability:videoCapability];
+ if (capabilityMatches.count == 0) {
+ // no supported video capabilities, full stop
+ SDLLogE(@"The video stream was not started because there are no supported video streaming capabilities. Please double check that the video streaming ranges set on the SDLStreamingMediaConfiguration are not disabled");
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
+ return;
+ }
+
+ if (self.shouldSendOnAppCapabilityUpdated) {
+ self.shouldSendOnAppCapabilityUpdated = NO;
+ [self sdl_sendOnAppCapabilityUpdated:capabilityMatches];
+ }
+
+ SDLVideoStreamingCapability *matchedVideoCapability = capabilityMatches.firstObject;
+ if (capabilityMatches.count > 1) {
+ // add the remaining capabilities that match video streaming criteria
+ matchedVideoCapability.additionalVideoStreamingCapabilities = [capabilityMatches subarrayWithRange:NSMakeRange(1, capabilityMatches.count - 1)];
+ } else {
+ // add any other possible capabilities here if needed
+ matchedVideoCapability.additionalVideoStreamingCapabilities = @[];
+ }
+
+ // take formats from 'parent' if absent in children
+ if (!matchedVideoCapability.supportedFormats) {
+ matchedVideoCapability.supportedFormats = videoCapabilityUpdated.supportedFormats;
+ }
+ if (matchedVideoCapability.maxBitrate == nil) {
+ matchedVideoCapability.maxBitrate = videoCapabilityUpdated.maxBitrate;
+ }
+ if (matchedVideoCapability.preferredFPS == nil) {
+ matchedVideoCapability.preferredFPS = videoCapabilityUpdated.preferredFPS;
+ }
+
+ [self sdl_applyVideoCapability:matchedVideoCapability];
+ self.shouldUpdateDelegateOnSizeChange = YES;
+
+ // start service with new capabilities or without (use old from start service ACK)
+ [self sdl_sendVideoStartService];
+}
+
+- (void)sdl_sendOnAppCapabilityUpdated:(nullable NSArray<SDLVideoStreamingCapability *> *)supportedVideoStreamingCapabilities {
+ // create and send SDLOnAppCapabilityUpdated notification
+ SDLVideoStreamingCapability *notifyCapability = [[SDLVideoStreamingCapability alloc] init];
+ notifyCapability.additionalVideoStreamingCapabilities = supportedVideoStreamingCapabilities ?: @[];
+ SDLAppCapability *appCapability = [[SDLAppCapability alloc] initWithAppCapabilityType:SDLAppCapabilityTypeVideoStreaming videoStreamingCapability:notifyCapability];
+ SDLOnAppCapabilityUpdated *notification = [[SDLOnAppCapabilityUpdated alloc] initWithAppCapability:appCapability];
+ [self.connectionManager sendConnectionRPC:notification];
+}
+
+- (void)sdl_applyVideoCapabilityWhenStreaming:(nullable SDLVideoStreamingCapability *)videoCapability {
+ if (!videoCapability) {
+ // continue streaming though core may expect something different
+ SDLLogD(@"Nil video capability received, ignore it (do not restart)");
+ return;
+ }
+ // try to validate absent fields taking ones from the current capability
+ if (!videoCapability.scale) {
+ videoCapability.scale = self.videoStreamingCapability.scale;
+ if (!videoCapability.scale) {
+ videoCapability.scale = @1.0;
+ }
+ }
+ if (!videoCapability.diagonalScreenSize) {
+ videoCapability.diagonalScreenSize = self.videoStreamingCapability.diagonalScreenSize;
+ }
+ if (!videoCapability.pixelPerInch) {
+ videoCapability.pixelPerInch = self.videoStreamingCapability.pixelPerInch;
+ }
+ if (!videoCapability.preferredResolution) {
+ SDLLogD(@"Nil video capability received, no preffered resolution");
+ videoCapability.preferredResolution = self.videoStreamingCapability.preferredResolution;
+ }
+ if (!videoCapability.maxBitrate) {
+ videoCapability.maxBitrate = self.videoStreamingCapability.maxBitrate;
+ }
+ if (!videoCapability.hapticSpatialDataSupported) {
+ videoCapability.hapticSpatialDataSupported = self.videoStreamingCapability.hapticSpatialDataSupported;
+ }
+ if (!videoCapability.preferredFPS) {
+ videoCapability.preferredFPS = self.videoStreamingCapability.preferredFPS;
+ }
+ if (videoCapability.supportedFormats.count == 0) {
+ if (self.videoFormat) {
+ // video format may not come, use the previous one instead
+ SDLLogD(@"Video capability received, no supported formats, trying to fix");
+ videoCapability.supportedFormats = @[self.videoFormat];
+ } else {
+ // continue streaming though core may expect something different
+ SDLLogD(@"Video capability received, no supported formats, ignore it (do not restart)");
+ return;
+ }
+ }
+
+ self.videoStreamingCapabilityUpdated = videoCapability;
+ __weak typeof(self) weakSelf = self;
+ // restart video session on capability update
+ dispatch_async(dispatch_get_main_queue(), ^{
+ weakSelf.shouldAutoResume = YES;
+ [weakSelf.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateShuttingDown];
+ // videoStreamingCapability will be applied later when video resumes
+ });
+}
+
+- (NSArray<SDLVideoStreamingCapability *>* __nullable)matchVideoCapability:(SDLVideoStreamingCapability *)videoStreamingCapability {
+ if (!videoStreamingCapability) {
+ return @[];
+ }
+
+ NSArray <SDLVideoStreamingCapability*> *allCapabilities = [videoStreamingCapability allVideoStreamingCapabilities];
+ NSMutableArray *matchCapabilities = [NSMutableArray arrayWithCapacity:allCapabilities.count];
+ for (SDLVideoStreamingCapability *nextCapability in allCapabilities) {
+ SDLImageResolution *imageResolution = [nextCapability makeImageResolution];
+ BOOL isMatch = NO;
+ switch (imageResolution.kind) {
+ case SDLImageResolutionKindLandscape:
+ isMatch = [self sdl_isCapability:nextCapability inRange:self.supportedLandscapeStreamingRange];
+ break;
+
+ case SDLImageResolutionKindPortrait:
+ isMatch = [self sdl_isCapability:nextCapability inRange:self.supportedPortraitStreamingRange];
+ break;
+
+ case SDLImageResolutionKindSquare:
+ isMatch = [self sdl_isCapability:nextCapability inRange:self.supportedLandscapeStreamingRange] ||
+ [self sdl_isCapability:nextCapability inRange:self.supportedPortraitStreamingRange];
+ break;
+
+ case SDLImageResolutionKindUndefined:
+ default:
+ // wrong capability, filter it out
+ break;
+ }
+
+ if (isMatch) {
+ [matchCapabilities addObject:nextCapability];
+ }
+ }
+
+ return matchCapabilities;
+}
+
+- (BOOL)sdl_isCapability:(SDLVideoStreamingCapability *)capability inRange:(SDLVideoStreamingRange *)range {
+ if (!capability) {
+ // sanity check, zero capability wont make through
+ return NO;
+ }
+ if (!range) {
+ // no range, no restriction - any capability will do
+ return YES;
+ }
+
+ // 1. resolution test: min <= resolution <= max
+ if ([self sdl_isImageResolutionRangeValid:range]) {
+ SDLImageResolution *imageResolution = [capability makeImageResolution];
+ if (![range isImageResolutionInRange:imageResolution]) {
+ return NO;
+ }
+ }
+
+ // 2. diagonal test: diagonal is above or equal to the minimumDiagonal
+ if (capability.diagonalScreenSize) {
+ const float diagonal = capability.diagonalScreenSize.floatValue;
+ if ((0 < diagonal) && (0 < range.minimumDiagonal)) {
+ if (diagonal < range.minimumDiagonal) {
+ return NO;
+ }
+ }
+ }
+
+ // 3. diagonal test: aspect ratio is within the specified range
+ if (capability.preferredResolution) {
+ const float ratio = capability.preferredResolution.normalizedAspectRatio;
+ if (1 <= ratio) {
+ if (![range isAspectRatioInRange:ratio]) {
+ return NO;
+ }
+ }
+ }
+ // by this point the capability has passed all the restrictions
+ return YES;
+}
+
+- (BOOL)sdl_isImageResolutionRangeValid:(SDLVideoStreamingRange *)range {
+ return (range.minimumResolution != nil || range.maximumResolution != nil);
+}
+
#pragma mark - SDLVideoEncoderDelegate
- (void)videoEncoder:(SDLH264VideoEncoder *)encoder hasEncodedFrame:(NSData *)encodedVideo {
@@ -681,12 +993,13 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
if ([self.videoStreamStateMachine isCurrentState:SDLVideoStreamManagerStateStopped] && self.isHmiStateVideoStreamCapable) {
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStarting];
- } else {
- SDLLogE(@"Unable to send video start service request\n"
- "Video State must be in state STOPPED: %@\n"
- "HMI state must be LIMITED or FULL: %@\n",
- self.videoStreamStateMachine.currentState, self.hmiLevel);
+ return;
}
+
+ SDLLogE(@"Unable to send video start service request\n"
+ "Video State must be in state STOPPED: %@\n"
+ "HMI state must be LIMITED or FULL: %@\n",
+ self.videoStreamStateMachine.currentState, self.hmiLevel);
}
- (void)sdl_stopVideoSession {
@@ -705,7 +1018,6 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
- (void)sdl_displayLinkFired:(CADisplayLink *)displayLink {
NSAssert([NSThread isMainThread], @"Display link should always fire on the main thread");
-
SDLLogV(@"DisplayLink frame fired, duration: %f, last frame timestamp: %f, target timestamp: %f", displayLink.duration, displayLink.timestamp, displayLink.targetTimestamp);
[self.touchManager syncFrame];
@@ -739,6 +1051,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
SDLLogD(@"Requesting video capabilities");
SDLGetSystemCapability *getVideoCapabilityRequest = [[SDLGetSystemCapability alloc] initWithType:SDLSystemCapabilityTypeVideoStreaming];
+ typeof(self) weakSelf = self;
[self.connectionManager sendConnectionManagerRequest:getVideoCapabilityRequest withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (!response.success || [response isMemberOfClass:SDLGenericResponse.class]) {
SDLLogW(@"Video capabilities response failed: %@", error);
@@ -749,7 +1062,7 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
SDLVideoStreamingCapability *videoCapability = ((SDLGetSystemCapabilityResponse *)response).systemCapability.videoStreamingCapability;
SDLLogD(@"Video capabilities response received: %@", videoCapability);
- self.videoScaleManager.scale = (videoCapability != nil && videoCapability.scale != nil) ? videoCapability.scale.floatValue : (float)0.0;
+ weakSelf.videoScaleManager.scale = (videoCapability != nil && videoCapability.scale != nil) ? videoCapability.scale.floatValue : (float)0.0;
responseHandler(videoCapability);
}];
@@ -761,18 +1074,19 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
- (void)sdl_sendVideoStartService {
SDLLogV(@"Attempting to find preferred format");
while (self.preferredFormatIndex < self.preferredFormats.count) {
- if (![self.supportedFormats containsObject:self.preferredFormats[self.preferredFormatIndex]]) {
- self.preferredFormatIndex++;
- } else {
+ SDLVideoStreamingFormat *format = self.preferredFormats[self.preferredFormatIndex];
+ if ([self.supportedFormats containsObject:format]) {
SDLLogV(@"Preferred format index found: %lu", self.preferredFormatIndex);
break;
}
+ self.preferredFormatIndex++;
}
// If this fails we have no known formats to use
if (self.preferredFormatIndex >= self.preferredFormats.count
|| self.preferredResolutionIndex >= self.preferredResolutions.count) {
SDLLogE(@"No preferred format or no preferred resolution found that works: format index %lu, resolution index %lu", (unsigned long)self.preferredFormatIndex, (unsigned long)self.preferredResolutionIndex);
+ self.shouldAutoResume = NO;
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
return;
}
@@ -783,7 +1097,8 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
SDLControlFramePayloadVideoStartService *startVideoPayload = [[SDLControlFramePayloadVideoStartService alloc] initWithVideoHeight:preferredResolution.resolutionHeight.intValue width:preferredResolution.resolutionWidth.intValue protocol:preferredFormat.protocol codec:preferredFormat.codec];
// Decide if we need to start a secure service or not
- if ((self.requestedEncryptionType != SDLStreamingEncryptionFlagNone) && ([self.secureMakes containsObject:self.connectedVehicleMake])) {
+ NSString *connectedVehicleMake = self.connectionManager.systemInfo.vehicleType.make;
+ if ((self.requestedEncryptionType != SDLStreamingEncryptionFlagNone) && ([self.secureMakes containsObject:connectedVehicleMake])) {
SDLLogD(@"Sending secure video start service with payload: %@", startVideoPayload);
[self.protocol startSecureServiceWithType:SDLServiceTypeVideo payload:startVideoPayload.data tlsInitializationHandler:^(BOOL success, NSError *error) {
if (error) {
@@ -797,24 +1112,73 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
}
}
-#pragma mark Setters / Getters
+- (void)sdl_applyVideoCapability:(SDLVideoStreamingCapability *)capability {
+ assert(capability != nil);
+
+ self.videoStreamingCapability = capability;
+ self.focusableItemManager.enableHapticDataRequests = capability.hapticSpatialDataSupported.boolValue;
+ self.videoScaleManager.scale = capability.scale.floatValue;
+ self.videoScaleManager.displayViewportResolution = capability.preferredResolution.makeSize;
-- (void)setRootViewController:(nullable UIViewController *)rootViewController {
- if (self.focusableItemManager != nil) {
- self.focusableItemManager.viewController = rootViewController;
+ if (capability.maxBitrate != nil) {
+ const uint64_t bitrate = capability.maxBitrate.unsignedLongLongValue * 1000;
+ self.videoEncoderSettings[(id)kVTCompressionPropertyKey_AverageBitRate] = @(bitrate);
+ }
+ if (capability.preferredFPS != nil) {
+ self.videoEncoderSettings[(id)kVTCompressionPropertyKey_ExpectedFrameRate] = capability.preferredFPS;
}
- if (self.carWindow != nil) {
- self.carWindow.rootViewController = rootViewController;
+ // Apply customEncoderSettings here. Note that value from HMI (such as maxBitrate) will be overwritten by custom settings
+ // (Exception: ExpectedFrameRate, AverageBitRate)
+ for (id key in self.customEncoderSettings.keyEnumerator) {
+ // Do *not* override framerate or average bitrate if custom setting is higher than current setting.
+ // See SDL 0323 (https://github.com/smartdevicelink/sdl_evolution/blob/master/proposals/0323-align-VideoStreamingParameter-with-capability.md) for details.
+ if (([(NSString *)key isEqualToString:(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate] && capability.preferredFPS != nil) ||
+ ([(NSString *)key isEqualToString:(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate] && capability.maxBitrate != nil)) {
+ NSNumber *customEncoderSettings = (NSNumber *)self.customEncoderSettings[key];
+ NSNumber *videoEncoderSettings = (NSNumber *)self.videoEncoderSettings[key];
+ if (customEncoderSettings.doubleValue < videoEncoderSettings.doubleValue) {
+ self.videoEncoderSettings[key] = customEncoderSettings;
+ }
+ } else {
+ self.videoEncoderSettings[key] = [self.customEncoderSettings valueForKey:key];
+ }
}
-}
-- (nullable UIViewController *)rootViewController {
- if (self.carWindow != nil) {
- return self.carWindow.rootViewController;
+ // If we got a response, get the head unit's preferred formats and resolutions
+ NSArray<SDLImageResolution *> *resolutions = [capability allImageResolutionsScaled];
+ NSArray<SDLVideoStreamingFormat *> *supportedFormats = capability.supportedFormats;
+ if (self.dataSource) {
+ SDLLogV(@"Calling data source for modified preferred resolutions");
+ self.preferredResolutions = [self.dataSource resolutionFromHeadUnitPreferredResolution:resolutions.firstObject];
+ SDLLogD(@"Got specialized video resolutions: %@", self.preferredResolutions);
+
+ SDLLogV(@"Calling data source for modified preferred formats");
+ self.preferredFormats = [self.dataSource preferredVideoFormatOrderFromHeadUnitPreferredOrder:supportedFormats];
} else {
- return nil;
+ self.preferredResolutions = resolutions;
+ self.preferredFormats = supportedFormats;
}
+
+ SDLLogD(@"Got specialized video capabilites, preferred formats: %@, haptics %@", self.preferredFormats, (capability.hapticSpatialDataSupported.boolValue ? @"enabled" : @"disabled"));
+}
+
+- (SDLVideoStreamingCapability *)sdl_defaultVideoCapability {
+ SDLVideoStreamingFormat *format = self.supportedFormats.firstObject;
+ SDLImageResolution *resolution = self.videoScaleManager.makeScaledResolution;
+ SDLVideoStreamingCapability *defaultCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:nil supportedFormats:@[format] hapticSpatialDataSupported:nil diagonalScreenSize:nil pixelPerInch:nil scale:@(self.videoScaleManager.scale) preferredFPS:nil];
+ return defaultCapability;
+}
+
+#pragma mark Setters / Getters
+
+- (void)setRootViewController:(nullable UIViewController *)viewController {
+ self.focusableItemManager.viewController = viewController;
+ self.carWindow.rootViewController = viewController;
+}
+
+- (nullable UIViewController *)rootViewController {
+ return self.carWindow.rootViewController;
}
- (BOOL)isAppStateVideoStreamCapable {
diff --git a/SmartDeviceLink/private/SDLTextAndGraphicManager.m b/SmartDeviceLink/private/SDLTextAndGraphicManager.m
index cd6ad0894..37b9f95fa 100644
--- a/SmartDeviceLink/private/SDLTextAndGraphicManager.m
+++ b/SmartDeviceLink/private/SDLTextAndGraphicManager.m
@@ -13,6 +13,7 @@
#import "SDLDisplayCapability.h"
#import "SDLError.h"
#import "SDLFileManager.h"
+#import "SDLGlobals.h"
#import "SDLImage.h"
#import "SDLLogMacros.h"
#import "SDLMetadataTags.h"
@@ -89,7 +90,7 @@ NS_ASSUME_NONNULL_BEGIN
// Make sure none of the properties were set after the manager was shut down
[self sdl_reset];
- [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate:)];
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate)];
}
- (void)stop {
@@ -127,7 +128,8 @@ NS_ASSUME_NONNULL_BEGIN
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.name = @"SDLTextAndGraphicManager Transaction Queue";
queue.maxConcurrentOperationCount = 1;
- queue.qualityOfService = NSQualityOfServiceUserInitiated;
+ queue.qualityOfService = NSQualityOfServiceUserInteractive;
+ queue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
queue.suspended = YES;
return queue;
@@ -366,30 +368,19 @@ NS_ASSUME_NONNULL_BEGIN
UIImage *blankImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
- _blankArtwork = [SDLArtwork artworkWithImage:blankImage name:@"sdl_BlankArt" asImageFormat:SDLArtworkImageFormatPNG];
+ _blankArtwork = [SDLArtwork persistentArtworkWithImage:blankImage name:@"sdl_BlankArt" asImageFormat:SDLArtworkImageFormatPNG];
return _blankArtwork;
}
#pragma mark - Subscribed notifications
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
- // Extract and update the capabilities
- NSArray<SDLDisplayCapability *> *capabilities = systemCapability.displayCapabilities;
- if (capabilities == nil || capabilities.count == 0) {
- self.windowCapability = nil;
- } else {
- SDLDisplayCapability *mainDisplay = capabilities[0];
- for (SDLWindowCapability *windowCapability in mainDisplay.windowCapabilities) {
- NSUInteger currentWindowID = windowCapability.windowID != nil ? windowCapability.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
- if (currentWindowID != SDLPredefinedWindowsDefaultWindow) { continue; }
-
- // Check if the window capability is equal to the one we already have. If it is, abort.
- if ([windowCapability isEqual:self.windowCapability]) { return; }
- self.windowCapability = windowCapability;
- break;
- }
- }
+- (void)sdl_displayCapabilityDidUpdate {
+ SDLWindowCapability *currentWindowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
+
+ // Check if the window capability is equal to the one we already have. If it is, abort.
+ if ([currentWindowCapability isEqual:self.windowCapability]) { return; }
+ self.windowCapability = currentWindowCapability;
[self sdl_updateTransactionQueueSuspended];
diff --git a/SmartDeviceLink/private/SDLTextAndGraphicUpdateOperation.m b/SmartDeviceLink/private/SDLTextAndGraphicUpdateOperation.m
index 990df13f2..cd47531e2 100644
--- a/SmartDeviceLink/private/SDLTextAndGraphicUpdateOperation.m
+++ b/SmartDeviceLink/private/SDLTextAndGraphicUpdateOperation.m
@@ -111,7 +111,7 @@ NS_ASSUME_NONNULL_BEGIN
}
[strongSelf finishOperation];
}];
- } else if (![self sdl_artworkNeedsUpload:self.updatedState.primaryGraphic] && ![self sdl_artworkNeedsUpload:self.updatedState.secondaryGraphic]) {
+ } else if (![self.fileManager fileNeedsUpload:self.updatedState.primaryGraphic] && ![self.fileManager fileNeedsUpload:self.updatedState.secondaryGraphic]) {
SDLLogV(@"Images already uploaded, sending full update");
// The files to be updated are already uploaded, send the full show immediately
[self sdl_sendShow:show withHandler:^(NSError * _Nullable error) {
@@ -263,8 +263,8 @@ NS_ASSUME_NONNULL_BEGIN
- (nullable SDLShow *)sdl_createImageOnlyShowWithPrimaryArtwork:(nullable SDLArtwork *)primaryArtwork secondaryArtwork:(nullable SDLArtwork *)secondaryArtwork {
SDLShow *newShow = [[SDLShow alloc] init];
- newShow.graphic = ![self sdl_artworkNeedsUpload:primaryArtwork] ? primaryArtwork.imageRPC : nil;
- newShow.secondaryGraphic = ![self sdl_artworkNeedsUpload:secondaryArtwork] ? secondaryArtwork.imageRPC : nil;
+ newShow.graphic = [self sdl_shouldRPCIncludeImage:primaryArtwork] ? primaryArtwork.imageRPC : nil;
+ newShow.secondaryGraphic = [self sdl_shouldRPCIncludeImage:secondaryArtwork] ? secondaryArtwork.imageRPC : nil;
if (newShow.graphic == nil && newShow.secondaryGraphic == nil) {
SDLLogV(@"No graphics to upload");
@@ -515,30 +515,34 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Should Update
-- (BOOL)sdl_artworkNeedsUpload:(SDLArtwork *)artwork {
- return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && !artwork.isStaticIcon);
+- (BOOL)sdl_shouldRPCIncludeImage:(nullable SDLArtwork *)artwork {
+ if (artwork == nil) { return NO; }
+
+ return (artwork.isStaticIcon || [self.fileManager hasUploadedFile:artwork]);
}
- (BOOL)sdl_shouldUpdatePrimaryImage {
// If the template is updating, we don't yet know it's capabilities. Just assume the template supports the primary image.
BOOL templateSupportsPrimaryArtwork = [self.currentCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] || [self sdl_shouldUpdateTemplateConfig];
- BOOL graphicMatchesExisting = [self.currentScreenData.primaryGraphic.name isEqualToString:self.updatedState.primaryGraphic.name];
+ BOOL graphicNameMatchesExisting = [self.currentScreenData.primaryGraphic.name isEqualToString:self.updatedState.primaryGraphic.name];
+ BOOL shouldOverwriteGraphic = self.updatedState.primaryGraphic.overwrite;
BOOL graphicExists = (self.updatedState.primaryGraphic != nil);
- return (templateSupportsPrimaryArtwork && !graphicMatchesExisting && graphicExists);
+ return (templateSupportsPrimaryArtwork && (shouldOverwriteGraphic || !graphicNameMatchesExisting) && graphicExists);
}
- (BOOL)sdl_shouldUpdateSecondaryImage {
// If the template is updating, we don't yet know it's capabilities. Just assume the template supports the secondary image.
BOOL templateSupportsSecondaryArtwork = [self.currentCapabilities hasImageFieldOfName:SDLImageFieldNameSecondaryGraphic] || [self sdl_shouldUpdateTemplateConfig];
- BOOL graphicMatchesExisting = [self.currentScreenData.secondaryGraphic.name isEqualToString:self.updatedState.secondaryGraphic.name];
+ BOOL graphicNameMatchesExisting = [self.currentScreenData.secondaryGraphic.name isEqualToString:self.updatedState.secondaryGraphic.name];
+ BOOL shouldOverwriteGraphic = self.updatedState.secondaryGraphic != nil && self.updatedState.secondaryGraphic.overwrite;
BOOL graphicExists = (self.updatedState.secondaryGraphic != nil);
// Cannot detect if there is a secondary image below v5.0, so we'll just try to detect if the primary image is allowed and allow the secondary image if it is.
if ([[SDLGlobals sharedGlobals].rpcVersion isGreaterThanOrEqualToVersion:[SDLVersion versionWithMajor:5 minor:0 patch:0]]) {
- return (templateSupportsSecondaryArtwork && !graphicMatchesExisting && graphicExists);
+ return (templateSupportsSecondaryArtwork && (shouldOverwriteGraphic || !graphicNameMatchesExisting) && graphicExists);
} else {
- return ([self.currentCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] && !graphicMatchesExisting && graphicExists);
+ return ([self.currentCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] && (shouldOverwriteGraphic || !graphicNameMatchesExisting) && graphicExists);
}
}
diff --git a/SmartDeviceLink/private/SDLTextField+ScreenManagerExtensions.m b/SmartDeviceLink/private/SDLTextField+ScreenManagerExtensions.m
index 28e6b349d..3086e67e9 100644
--- a/SmartDeviceLink/private/SDLTextField+ScreenManagerExtensions.m
+++ b/SmartDeviceLink/private/SDLTextField+ScreenManagerExtensions.m
@@ -11,8 +11,11 @@
@implementation SDLTextField (ScreenManagerExtensions)
+ (NSArray<SDLTextFieldName> *)sdl_allTextFieldNames {
- return @[SDLTextFieldNameETA, SDLTextFieldNameMenuName, SDLTextFieldNameMenuTitle, SDLTextFieldNameStatusBar, SDLTextFieldNameAlertText1, SDLTextFieldNameAlertText2, SDLTextFieldNameAlertText3, SDLTextFieldNameMainField1, SDLTextFieldNameMainField2, SDLTextFieldNameMainField3, SDLTextFieldNameMainField4, SDLTextFieldNameMediaClock, SDLTextFieldNameMediaTrack, SDLTextFieldNamePhoneNumber, SDLTextFieldNameAddressLines, SDLTextFieldNameLocationName, SDLTextFieldNameSliderFooter, SDLTextFieldNameSliderHeader, SDLTextFieldNameTertiaryText, SDLTextFieldNameSecondaryText, SDLTextFieldNameTemplateTitle, SDLTextFieldNameTotalDistance, SDLTextFieldNameNavigationText1, SDLTextFieldNameNavigationText2, SDLTextFieldNameLocationDescription, SDLTextFieldNameScrollableMessageBody, SDLTextFieldNameInitialInteractionText, SDLTextFieldNameAudioPassThruDisplayText1, SDLTextFieldNameAudioPassThruDisplayText2];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ return @[SDLTextFieldNameETA, SDLTextFieldNameMenuName, SDLTextFieldNameMenuTitle, SDLTextFieldNameStatusBar, SDLTextFieldNameAlertText1, SDLTextFieldNameAlertText2, SDLTextFieldNameAlertText3, SDLTextFieldNameMainField1, SDLTextFieldNameMainField2, SDLTextFieldNameMainField3, SDLTextFieldNameMainField4, SDLTextFieldNameMediaClock, SDLTextFieldNameMediaTrack, SDLTextFieldNamePhoneNumber, SDLTextFieldNameAddressLines, SDLTextFieldNameLocationName, SDLTextFieldNameSliderFooter, SDLTextFieldNameSliderHeader, SDLTextFieldNameTertiaryText, SDLTextFieldNameSecondaryText, SDLTextFieldNameTemplateTitle, SDLTextFieldNameTotalDistance, SDLTextFieldNameNavigationText1, SDLTextFieldNameNavigationText2, SDLTextFieldNameLocationDescription, SDLTextFieldNameScrollableMessageBody, SDLTextFieldNameInitialInteractionText, SDLTextFieldNameAudioPassThruDisplayText1, SDLTextFieldNameAudioPassThruDisplayText2, SDLTextFieldNameTimeToDestination, SDLTextFieldNameTurnText];
}
+#pragma clang diagnostic pop
+ (NSArray<SDLTextField *> *)allTextFields {
NSMutableArray<SDLTextField *> *tempTextFields = [NSMutableArray array];
diff --git a/SmartDeviceLink/private/SDLUploadFileOperation.m b/SmartDeviceLink/private/SDLUploadFileOperation.m
index b87629b28..8149c56fc 100644
--- a/SmartDeviceLink/private/SDLUploadFileOperation.m
+++ b/SmartDeviceLink/private/SDLUploadFileOperation.m
@@ -13,15 +13,23 @@
#import "SDLFile.h"
#import "SDLFileWrapper.h"
#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
#import "SDLPutFile.h"
#import "SDLPutFileResponse.h"
+#import "SDLProtocolHeader.h"
#import "SDLRPCResponse.h"
+#import "SDLVersion.h"
NS_ASSUME_NONNULL_BEGIN
#pragma mark - SDLUploadFileOperation
+/// The size of the binary header, in bytes, for protocol version 2 and greater
+static NSUInteger const BinaryHeaderByteSize = 12;
+/// The maximum value that can be set for the PutFile's crc property
+static NSUInteger const MaxCRCValue = UINT32_MAX;
+
@interface SDLUploadFileOperation ()
@property (strong, nonatomic, readwrite) SDLFileWrapper *fileWrapper;
@@ -111,13 +119,14 @@ NS_ASSUME_NONNULL_BEGIN
});
// Break the data into small pieces, each of which will be sent in a separate putfile
+ NSUInteger maxBulkDataSize = [self.class sdl_getMaxBulkDataSizeForFile:file mtuSize:mtuSize];
NSUInteger currentOffset = 0;
- for (int i = 0; i < (((file.fileSize - 1) / mtuSize) + 1); i++) {
+ for (int i = 0; i < (((file.fileSize - 1) / maxBulkDataSize) + 1); i++) {
dispatch_group_enter(putFileGroup);
// Get a chunk of data from the input stream
- UInt32 putFileLength = (UInt32)[self.class sdl_getPutFileLengthForOffset:currentOffset fileSize:(NSUInteger)file.fileSize mtuSize:mtuSize];
- NSUInteger putFileBulkDataSize = [self.class sdl_getDataSizeForOffset:currentOffset fileSize:file.fileSize mtuSize:mtuSize];
+ UInt32 putFileLength = (UInt32)[self.class sdl_getPutFileLengthForOffset:currentOffset fileSize:(NSUInteger)file.fileSize bulkDataSize:maxBulkDataSize];
+ NSUInteger putFileBulkDataSize = [self.class sdl_getDataSizeForOffset:currentOffset fileSize:file.fileSize bulkDataSize:maxBulkDataSize];
NSData *putFileBulkData = [self.class sdl_getDataChunkWithSize:putFileBulkDataSize inputStream:self.inputStream];
SDLPutFile *putFile = [[SDLPutFile alloc]
@@ -183,25 +192,57 @@ NS_ASSUME_NONNULL_BEGIN
[self.inputStream close];
}
+/// Calculates the max size of the data that can be set in the bulk data field for a PutFile to ensure that if the file data must be broken into chunks and sent in separate PutFiles, each of the PutFiles is sent as a single frame packet. The size of the binary header, JSON, and frame header must be taken into account in order to make sure the packet size does not exceed the max MTU size allowed by SDL Core.
+///
+/// Each RPC packet contains: frame header + payload(binary header + JSON data + bulk data)
+/// This means the bulk data size for each packet should not exceed: mtuSize - (binary header size + maximum possible JSON data size + frame header size)
+/// @param file The file containing the data to be sent to the SDL Core
+/// @param mtuSize The maximum packet size allowed
+/// @return The max size of the data that can be set in the bulk data field
++ (NSUInteger)sdl_getMaxBulkDataSizeForFile:(SDLFile *)file mtuSize:(NSUInteger)mtuSize {
+ NSUInteger frameHeaderSize = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major].size;
+ NSUInteger binaryHeaderSize = BinaryHeaderByteSize;
+ NSUInteger maxJSONSize = [self sdl_getMaxJSONSizeForFile:file];
+
+ return mtuSize - (binaryHeaderSize + maxJSONSize + frameHeaderSize);
+}
+
+/// Calculates the max possible (i.e. it may be larger than the actual JSON data generated) size of the JSON data generated for a PutFile request.
+/// @param file The file to be sent to the module
+/// @return The max possible size of the JSON data
++ (NSUInteger)sdl_getMaxJSONSizeForFile:(SDLFile *)file {
+ SDLPutFile *putFile = [[SDLPutFile alloc] initWithFileName:file.name fileType:file.fileType persistentFile:file.persistent systemFile:NO offset:(UInt32)file.fileSize length:(UInt32)file.fileSize bulkData:file.data];
+ putFile.crc = @(MaxCRCValue);
+
+ NSError *JSONSerializationError = nil;
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[putFile serializeAsDictionary:(Byte)[SDLGlobals sharedGlobals].protocolVersion.major] options:kNilOptions error:&JSONSerializationError];
+ if (JSONSerializationError != nil) {
+ SDLLogW(@"Error attempting to get JSON data for PutFile: %@", putFile);
+ return 0;
+ }
+
+ return jsonData.length;
+}
+
/**
Returns the length of the data being sent in the putfile. The first putfile's length is unique in that it sends the full size of the data. For the rest of the putfiles, the length parameter is equal to the size of the chunk of data being sent in the putfile.
@param currentOffset The current position in the file
@param fileSize The size of the file
- @param mtuSize The maximum packet size allowed
+ @param bulkDataSize The maximum size of the bulk data that can be sent in the PutFile
@return The the length of the data being sent in the putfile
*/
-+ (NSUInteger)sdl_getPutFileLengthForOffset:(NSUInteger)currentOffset fileSize:(NSUInteger)fileSize mtuSize:(NSUInteger)mtuSize {
++ (NSUInteger)sdl_getPutFileLengthForOffset:(NSUInteger)currentOffset fileSize:(NSUInteger)fileSize bulkDataSize:(NSUInteger)bulkDataSize {
NSUInteger putFileLength = 0;
if (currentOffset == 0) {
// The first putfile sends the full file size
putFileLength = fileSize;
- } else if ((fileSize - currentOffset) < mtuSize) {
+ } else if ((fileSize - currentOffset) < bulkDataSize) {
// The last putfile sends the size of the remaining data
putFileLength = fileSize - currentOffset;
} else {
// All other putfiles send the maximum allowed packet size
- putFileLength = mtuSize;
+ putFileLength = bulkDataSize;
}
return putFileLength;
}
@@ -211,16 +252,16 @@ NS_ASSUME_NONNULL_BEGIN
@param currentOffset The position in the file where to start reading data
@param fileSize The size of the file
- @param mtuSize The maximum packet size allowed
+ @param bulkDataSize The maximum size of the bulk data that can be sent in the putfile
@return The size of the data to be sent in the packet.
*/
-+ (NSUInteger)sdl_getDataSizeForOffset:(NSUInteger)currentOffset fileSize:(unsigned long long)fileSize mtuSize:(NSUInteger)mtuSize {
++ (NSUInteger)sdl_getDataSizeForOffset:(NSUInteger)currentOffset fileSize:(unsigned long long)fileSize bulkDataSize:(NSUInteger)bulkDataSize {
NSUInteger dataSize = 0;
NSUInteger fileSizeRemaining = (NSUInteger)(fileSize - currentOffset);
- if (fileSizeRemaining < mtuSize) {
+ if (fileSizeRemaining < bulkDataSize) {
dataSize = fileSizeRemaining;
} else {
- dataSize = mtuSize;
+ dataSize = bulkDataSize;
}
return dataSize;
}
diff --git a/SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.h b/SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.h
new file mode 100644
index 000000000..bc966db4c
--- /dev/null
+++ b/SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.h
@@ -0,0 +1,48 @@
+//
+// SDLVideoStreamingCapability + StreamingVideoExtensions.h
+// SmartDeviceLink-iOS
+//
+// Created by yoooriii on 2/13/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLVideoStreamingCapability.h"
+
+@class SDLImageResolution;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLVideoStreamingCapability (StreamingVideoExtensions)
+
+/**
+ this returns a copy array of all capabilities including itself
+ in the result objects the .additionalVideoStreamingCapabilities will be ommited
+ */
+- (NSArray <SDLVideoStreamingCapability *> *)allVideoStreamingCapabilities;
+
+/**
+ Create a SDLImageResolution from preferredResolution respecting the scale factor
+ @return SDLImageResolution - an initialized image resolution struct
+ */
+- (SDLImageResolution *)makeImageResolution;
+
+/**
+ It traverses through all capabilities and collects all image resolutions into an array respecting the scale factor
+ @return [SDLImageResolution] - an array of initialized image resolution structs
+ */
+- (NSArray<SDLImageResolution *> *)allImageResolutionsScaled;
+
+/**
+ It traverses through all capabilities and collects all image resolutions into an array ignoring the scale factor
+ @return [SDLImageResolution] - an array of initialized image resolution structs
+ */
+- (NSArray<SDLImageResolution *> *)allImageResolutions;
+
+/**
+ It produces a shallow copy of itself object, additionalVideoStreamingCapabilities will be nil
+ */
+- (instancetype)shortCopy;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.m b/SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.m
new file mode 100644
index 000000000..3e544709b
--- /dev/null
+++ b/SmartDeviceLink/private/SDLVideoStreamingCapability+StreamingVideoExtensions.m
@@ -0,0 +1,156 @@
+//
+// SDLVideoStreamingCapability + StreamingVideoExtensions.m
+// SmartDeviceLink-iOS
+//
+// Created by yoooriii on 2/13/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLVideoStreamingCapability+StreamingVideoExtensions.h"
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLImageResolution+StreamingVideoExtensions.h"
+#import "SDLStreamingVideoScaleManager.h"
+#import "SDLVideoStreamingFormat.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLVideoStreamingCapability (StreamingVideoExtensions)
+
+// note: it does not copy additionalVideoStreamingCapabilities
+- (instancetype)shortCopy {
+ typeof(self) aCopy = [[self class] new];
+ aCopy.preferredResolution = self.preferredResolution;
+ aCopy.maxBitrate = self.maxBitrate;
+ aCopy.supportedFormats = self.supportedFormats;
+ aCopy.preferredResolution = self.preferredResolution;
+ aCopy.hapticSpatialDataSupported = self.hapticSpatialDataSupported;
+ aCopy.diagonalScreenSize = self.diagonalScreenSize;
+ aCopy.pixelPerInch = self.pixelPerInch;
+ aCopy.scale = self.scale;
+ return aCopy;
+}
+
+- (NSArray <SDLVideoStreamingCapability *> *)allVideoStreamingCapabilities {
+ NSMutableArray *capabilitiesArray = [NSMutableArray arrayWithObject:[self shortCopy]];
+ for (SDLVideoStreamingCapability *capability in self.additionalVideoStreamingCapabilities) {
+ NSArray *childCapabilities = [capability allVideoStreamingCapabilities];
+ if (childCapabilities.count) {
+ [capabilitiesArray addObjectsFromArray:childCapabilities];
+ }
+ }
+ return capabilitiesArray;
+}
+
+- (SDLImageResolution *)makeImageResolution {
+ const float scale = (self.scale == nil) ? 1.0 : self.scale.floatValue;
+ const CGSize size = [SDLStreamingVideoScaleManager scale:scale size:self.preferredResolution.makeSize];
+ return [[SDLImageResolution alloc] initWithWidth:(uint16_t)size.width height:(uint16_t)size.height];
+}
+
+- (NSArray<SDLImageResolution *> *)allImageResolutions {
+ NSMutableArray<SDLImageResolution *> *resolutions = [NSMutableArray arrayWithCapacity:self.additionalVideoStreamingCapabilities.count + 1];
+ if (self.preferredResolution) {
+ [resolutions addObject:self.preferredResolution];
+ }
+ for (SDLVideoStreamingCapability *nextCapability in self.additionalVideoStreamingCapabilities) {
+ if (nextCapability.preferredResolution) {
+ [resolutions addObject:nextCapability.preferredResolution];
+ }
+ }
+ return resolutions;
+}
+
+- (NSArray<SDLImageResolution *> *)allImageResolutionsScaled {
+ NSMutableArray<SDLImageResolution *> *resolutions = [NSMutableArray arrayWithCapacity:self.additionalVideoStreamingCapabilities.count + 1];
+ SDLImageResolution *imgResolution = [self makeImageResolution];
+ if (imgResolution) {
+ [resolutions addObject:imgResolution];
+ }
+ for (SDLVideoStreamingCapability *nextCapability in self.additionalVideoStreamingCapabilities) {
+ SDLImageResolution *imgResolution = [nextCapability makeImageResolution];
+ if (imgResolution) {
+ [resolutions addObject:imgResolution];
+ }
+ }
+ return resolutions;
+}
+
+BOOL sdl_isResolutionEqual(SDLImageResolution *imageResolutionL, SDLImageResolution *imageResolutionR) {
+ return ((imageResolutionL == nil && imageResolutionR == nil) ? YES : [imageResolutionL isEqual:imageResolutionR]);
+}
+
+BOOL sdl_isNumberEqual(NSNumber *numberL, NSNumber *numberR) {
+ return (numberL == nil && numberR == nil) ? YES : (numberL && numberR ? [numberL isEqualToNumber:numberR] : NO);
+}
+
+- (BOOL)isEqual:(id)object {
+ if (!object) {
+ return NO;
+ }
+ if (object == self) {
+ return YES;
+ }
+ if (![object isKindOfClass:self.class]) {
+ return NO;
+ }
+ typeof(self) other = object;
+ if (!sdl_isResolutionEqual(self.preferredResolution, other.preferredResolution)) {
+ return NO;
+ }
+ if (!sdl_isNumberEqual(self.maxBitrate, other.maxBitrate)) {
+ return NO;
+ }
+ if (!sdl_isNumberEqual(self.diagonalScreenSize, other.diagonalScreenSize)) {
+ return NO;
+ }
+ if (!sdl_isNumberEqual(self.pixelPerInch, other.pixelPerInch)) {
+ return NO;
+ }
+ if (!sdl_isNumberEqual(self.scale, other.scale)) {
+ return NO;
+ }
+ return YES;
+}
+
+- (NSString *)description {
+ NSMutableString *formats = [NSMutableString string];
+ [formats setString:@"supportedFormats:"];
+ for (SDLVideoStreamingFormat *f in self.supportedFormats) {
+ [formats appendFormat:@"%@; ", f];
+ }
+ NSString *strClass = [NSString stringWithFormat:@"<%@:%p>", NSStringFromClass(self.class), self];
+ NSString *strResolution = [NSString stringWithFormat:@"preferredResolution:%@", self.preferredResolution];
+ NSString *strBitrate = [NSString stringWithFormat:@"maxBitrate:%@", self.maxBitrate];
+ NSString *strHaptic = [NSString stringWithFormat:@"hapticSpatialDataSupported:%@", self.hapticSpatialDataSupported == nil ? @"(nil)" : (self.hapticSpatialDataSupported.boolValue ? @"YES" : @"NO")];
+ NSString *strDiagonal = [NSString stringWithFormat:@"diagonalScreenSize:%@", self.diagonalScreenSize];
+ NSString *strPPI = [NSString stringWithFormat:@"pixelPerInch:%@", self.pixelPerInch];
+ NSString *strScale = [NSString stringWithFormat:@"scale:%@", self.scale];
+ NSString *strAdditionalVideoStreamingCapabilities = [NSString stringWithFormat:@"additionalVideoStreamingCapabilities[%d]:%@", (int)self.additionalVideoStreamingCapabilities.count, self.additionalVideoStreamingCapabilities];
+
+ NSMutableString *resultDescription = [NSMutableString stringWithCapacity:strClass.length + strResolution.length + strBitrate.length + strHaptic.length + strDiagonal.length + strPPI.length + strScale.length + strAdditionalVideoStreamingCapabilities.length + 20];
+ [resultDescription appendString:strClass];
+ [resultDescription appendString:@"{\n\t"];
+ [resultDescription appendString:strResolution];
+ [resultDescription appendString:@"\n\t"];
+ [resultDescription appendString:strBitrate];
+ [resultDescription appendString:@"\n\t"];
+ [resultDescription appendString:strHaptic];
+ [resultDescription appendString:@"\n\t"];
+ [resultDescription appendString:strDiagonal];
+ [resultDescription appendString:@"\n\t"];
+ [resultDescription appendString:strPPI];
+ [resultDescription appendString:@"\n\t"];
+ [resultDescription appendString:strScale];
+ [resultDescription appendString:@"\n\t"];
+ [resultDescription appendString:strAdditionalVideoStreamingCapabilities];
+ [resultDescription appendString:@"}"];
+
+ // return immutable copy
+ return [resultDescription copy];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLVoiceCommandManager.h b/SmartDeviceLink/private/SDLVoiceCommandManager.h
index 8c3f3f78f..1bd9a6567 100644
--- a/SmartDeviceLink/private/SDLVoiceCommandManager.h
+++ b/SmartDeviceLink/private/SDLVoiceCommandManager.h
@@ -15,13 +15,6 @@
NS_ASSUME_NONNULL_BEGIN
-/**
- The handler run when the update has completed
-
- @param error An error if the update failed and an error occurred
- */
-typedef void(^SDLMenuUpdateCompletionHandler)(NSError *__nullable error);
-
@interface SDLVoiceCommandManager : NSObject
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager;
diff --git a/SmartDeviceLink/private/SDLVoiceCommandManager.m b/SmartDeviceLink/private/SDLVoiceCommandManager.m
index e9bd3d5e6..fc0048736 100644
--- a/SmartDeviceLink/private/SDLVoiceCommandManager.m
+++ b/SmartDeviceLink/private/SDLVoiceCommandManager.m
@@ -21,6 +21,7 @@
#import "SDLRPCNotificationNotification.h"
#import "SDLRPCRequest.h"
#import "SDLVoiceCommand.h"
+#import "SDLVoiceCommandUpdateOperation.h"
NS_ASSUME_NONNULL_BEGIN
@@ -33,15 +34,12 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLVoiceCommandManager()
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
-@property (assign, nonatomic) BOOL waitingOnHMIUpdate;
-@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
-
-@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
-@property (assign, nonatomic) BOOL hasQueuedUpdate;
+@property (copy, nonatomic, nullable) SDLHMILevel currentLevel;
@property (assign, nonatomic) UInt32 lastVoiceCommandId;
-@property (copy, nonatomic) NSArray<SDLVoiceCommand *> *oldVoiceCommands;
+@property (copy, nonatomic) NSArray<SDLVoiceCommand *> *currentVoiceCommands;
@end
@@ -54,8 +52,9 @@ UInt32 const VoiceCommandIdMin = 1900000000;
if (!self) { return nil; }
_lastVoiceCommandId = VoiceCommandIdMin;
+ _transactionQueue = [self sdl_newTransactionQueue];
_voiceCommands = @[];
- _oldVoiceCommands = @[];
+ _currentVoiceCommands = @[];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_commandNotification:) name:SDLDidReceiveCommandNotification object:nil];
@@ -75,120 +74,70 @@ UInt32 const VoiceCommandIdMin = 1900000000;
- (void)stop {
_lastVoiceCommandId = VoiceCommandIdMin;
_voiceCommands = @[];
- _oldVoiceCommands = @[];
+ _currentVoiceCommands = @[];
+ _transactionQueue = [self sdl_newTransactionQueue];
+
+ _currentLevel = nil;
+}
+
+- (NSOperationQueue *)sdl_newTransactionQueue {
+ NSOperationQueue *queue = [[NSOperationQueue alloc] init];
+ queue.name = @"SDLVoiceCommandManager Transaction Queue";
+ queue.maxConcurrentOperationCount = 1;
+ queue.qualityOfService = NSQualityOfServiceUserInitiated;
+ queue.suspended = YES;
- _waitingOnHMIUpdate = NO;
- _currentHMILevel = nil;
- _inProgressUpdate = nil;
- _hasQueuedUpdate = NO;
+ return queue;
+}
+
+/// Suspend the queue if the HMI level is NONE since we want to delay sending RPCs until we're in non-NONE
+- (void)sdl_updateTransactionQueueSuspended {
+ if ([self.currentLevel isEqualToEnum:SDLHMILevelNone]) {
+ SDLLogD(@"Suspending the transaction queue. Current HMI level is NONE: %@", ([self.currentLevel isEqualToEnum:SDLHMILevelNone] ? @"YES" : @"NO"));
+ self.transactionQueue.suspended = YES;
+ } else {
+ SDLLogD(@"Starting the transaction queue");
+ self.transactionQueue.suspended = NO;
+ }
}
#pragma mark - Setters
- (void)setVoiceCommands:(NSArray<SDLVoiceCommand *> *)voiceCommands {
- if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone]) {
- self.waitingOnHMIUpdate = YES;
+ if (voiceCommands == self.voiceCommands) {
+ SDLLogD(@"New voice commands are equal to the existing voice commands, skipping...");
return;
}
- self.waitingOnHMIUpdate = NO;
-
// Set the ids
- self.lastVoiceCommandId = VoiceCommandIdMin;
[self sdl_updateIdsOnVoiceCommands:voiceCommands];
- _oldVoiceCommands = _voiceCommands;
+ // Set the new voice commands internally
_voiceCommands = voiceCommands;
- [self sdl_updateWithCompletionHandler:nil];
-}
-
-#pragma mark - Updating System
-
-- (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler {
- if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone]) {
- self.waitingOnHMIUpdate = YES;
- return;
- }
-
- if (self.inProgressUpdate != nil) {
- // There's an in progress update, we need to put this on hold
- self.hasQueuedUpdate = YES;
- return;
- }
-
- __weak typeof(self) weakself = self;
- [self sdl_sendDeleteCurrentVoiceCommands:^(NSError * _Nullable error) {
- [weakself sdl_sendCurrentVoiceCommands:^(NSError * _Nullable error) {
- weakself.inProgressUpdate = nil;
-
- if (completionHandler != nil) {
- completionHandler(error);
- }
-
- if (weakself.hasQueuedUpdate) {
- [weakself sdl_updateWithCompletionHandler:nil];
- weakself.hasQueuedUpdate = NO;
- }
- }];
+ // Create the operation, cancel previous ones and set this one
+ __weak typeof(self) weakSelf = self;
+ SDLVoiceCommandUpdateOperation *updateOperation = [[SDLVoiceCommandUpdateOperation alloc] initWithConnectionManager:self.connectionManager pendingVoiceCommands:voiceCommands oldVoiceCommands:_currentVoiceCommands updateCompletionHandler:^(NSArray<SDLVoiceCommand *> *newCurrentVoiceCommands, NSError * _Nullable error) {
+ weakSelf.currentVoiceCommands = newCurrentVoiceCommands;
+ [weakSelf sdl_updatePendingOperationsWithNewCurrentVoiceCommands:newCurrentVoiceCommands];
}];
-}
-
-#pragma mark Delete Old Menu Items
-
-- (void)sdl_sendDeleteCurrentVoiceCommands:(SDLMenuUpdateCompletionHandler)completionHandler {
- if (self.oldVoiceCommands.count == 0) {
- completionHandler(nil);
-
- return;
- }
-
- NSArray<SDLRPCRequest *> *deleteVoiceCommands = [self sdl_deleteCommandsForVoiceCommands:self.oldVoiceCommands];
- self.oldVoiceCommands = @[];
- [self.connectionManager sendRequests:deleteVoiceCommands progressHandler:nil completionHandler:^(BOOL success) {
- if (!success) {
- SDLLogE(@"Error deleting old voice commands");
- } else {
- SDLLogD(@"Finished deleting old voice commands");
- }
- completionHandler(nil);
- }];
+ [self.transactionQueue cancelAllOperations];
+ [self.transactionQueue addOperation:updateOperation];
}
-#pragma mark Send New Menu Items
-
-- (void)sdl_sendCurrentVoiceCommands:(SDLMenuUpdateCompletionHandler)completionHandler {
- if (self.voiceCommands.count == 0) {
- SDLLogD(@"No voice commands to send");
- completionHandler(nil);
+/// Update currently pending operations with a new set of "current" voice commands (the current state of the head unit) based on a previous completed operation
+/// @param currentVoiceCommands The new current voice commands
+- (void)sdl_updatePendingOperationsWithNewCurrentVoiceCommands:(NSArray<SDLVoiceCommand *> *)currentVoiceCommands {
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if (operation.isExecuting) { continue; }
- return;
+ SDLVoiceCommandUpdateOperation *updateOp = (SDLVoiceCommandUpdateOperation *)operation;
+ updateOp.oldVoiceCommands = currentVoiceCommands;
}
-
- self.inProgressUpdate = [self sdl_addCommandsForVoiceCommands:self.voiceCommands];
-
- __block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
- __weak typeof(self) weakSelf = self;
- [self.connectionManager sendRequests:self.inProgressUpdate progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
- if (error != nil) {
- errors[request] = error;
- }
- } completionHandler:^(BOOL success) {
- if (!success) {
- SDLLogE(@"Failed to send main menu commands: %@", errors);
- completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]);
- return;
- }
-
- SDLLogD(@"Finished updating voice commands");
- weakSelf.oldVoiceCommands = weakSelf.voiceCommands;
- completionHandler(nil);
- }];
}
#pragma mark - Helpers
-
#pragma mark IDs
- (void)sdl_updateIdsOnVoiceCommands:(NSArray<SDLVoiceCommand *> *)voiceCommands {
@@ -197,37 +146,6 @@ UInt32 const VoiceCommandIdMin = 1900000000;
}
}
-#pragma mark Deletes
-
-- (NSArray<SDLDeleteCommand *> *)sdl_deleteCommandsForVoiceCommands:(NSArray<SDLVoiceCommand *> *)voiceCommands {
- NSMutableArray<SDLDeleteCommand *> *mutableDeletes = [NSMutableArray array];
- for (SDLVoiceCommand *command in voiceCommands) {
- SDLDeleteCommand *delete = [[SDLDeleteCommand alloc] initWithId:command.commandId];
- [mutableDeletes addObject:delete];
- }
-
- return [mutableDeletes copy];
-}
-
-#pragma mark Commands
-
-- (NSArray<SDLAddCommand *> *)sdl_addCommandsForVoiceCommands:(NSArray<SDLVoiceCommand *> *)voiceCommands {
- NSMutableArray<SDLAddCommand *> *mutableCommands = [NSMutableArray array];
- for (SDLVoiceCommand *command in voiceCommands) {
- [mutableCommands addObject:[self sdl_commandForVoiceCommand:command]];
- }
-
- return [mutableCommands copy];
-}
-
-- (SDLAddCommand *)sdl_commandForVoiceCommand:(SDLVoiceCommand *)voiceCommand {
- SDLAddCommand *command = [[SDLAddCommand alloc] init];
- command.vrCommands = voiceCommand.voiceCommands;
- command.cmdID = @(voiceCommand.commandId);
-
- return command;
-}
-
#pragma mark - Observers
- (void)sdl_commandNotification:(SDLRPCNotificationNotification *)notification {
@@ -243,22 +161,12 @@ UInt32 const VoiceCommandIdMin = 1900000000;
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification;
-
if (hmiStatus.windowID != nil && hmiStatus.windowID.integerValue != SDLPredefinedWindowsDefaultWindow) {
return;
}
-
- SDLHMILevel oldHMILevel = self.currentHMILevel;
- self.currentHMILevel = hmiStatus.hmiLevel;
-
- // Auto-send an updated show if we were in NONE and now we are not
- if ([oldHMILevel isEqualToEnum:SDLHMILevelNone] && ![self.currentHMILevel isEqualToEnum:SDLHMILevelNone]) {
- if (self.waitingOnHMIUpdate) {
- [self setVoiceCommands:_voiceCommands];
- } else {
- [self sdl_updateWithCompletionHandler:nil];
- }
- }
+
+ self.currentLevel = hmiStatus.hmiLevel;
+ [self sdl_updateTransactionQueueSuspended];
}
@end
diff --git a/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.h b/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.h
new file mode 100644
index 000000000..ec0cf86ec
--- /dev/null
+++ b/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.h
@@ -0,0 +1,38 @@
+//
+// SDLVoiceCommandUpdateOperation.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 11/6/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAsynchronousOperation.h"
+
+@class SDLVoiceCommand;
+
+@protocol SDLConnectionManagerType;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// A handler run when the operation completes, containing the new voice commands that are available on the head unit
+///
+/// @param newCurrentVoiceCommands The voice commands currently present on the head unit
+/// @param error The error if one occurred
+typedef void(^SDLVoiceCommandUpdateCompletionHandler)(NSArray<SDLVoiceCommand *> *newCurrentVoiceCommands, NSError *__nullable error);
+
+/// An operation that handles changing voice commands on the head unit
+@interface SDLVoiceCommandUpdateOperation : SDLAsynchronousOperation
+
+/// The voice commands currently on the head unit
+@property (strong, nonatomic, nullable) NSArray<SDLVoiceCommand *> *oldVoiceCommands;
+
+/// Initialize a voice command update operation
+/// @param connectionManager The connection manager for sending RPCs
+/// @param pendingVoiceCommands The voice commands that should be on the head unit when this operation completes
+/// @param oldVoiceCommands The voice commands currently on the head unit
+/// @param completionHandler A handler called right before the update operation finishes
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager pendingVoiceCommands:(NSArray<SDLVoiceCommand *> *)pendingVoiceCommands oldVoiceCommands:(NSArray<SDLVoiceCommand *> *)oldVoiceCommands updateCompletionHandler:(SDLVoiceCommandUpdateCompletionHandler)completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m b/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m
new file mode 100644
index 000000000..184615d63
--- /dev/null
+++ b/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m
@@ -0,0 +1,227 @@
+//
+// SDLVoiceCommandUpdateOperation.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 11/6/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLVoiceCommandUpdateOperation.h"
+
+#import "SDLAddCommand.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLDeleteCommand.h"
+#import "SDLError.h"
+#import "SDLLogMacros.h"
+#import "SDLVoiceCommand.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLVoiceCommand()
+
+@property (assign, nonatomic) UInt32 commandId;
+
+@end
+
+@interface SDLVoiceCommandUpdateOperation ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (copy, nonatomic) NSArray<SDLVoiceCommand *> *pendingVoiceCommands;
+@property (strong, nonatomic) NSMutableArray<SDLVoiceCommand *> *currentVoiceCommands;
+@property (copy, nonatomic) SDLVoiceCommandUpdateCompletionHandler completionHandler;
+
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+@end
+
+@implementation SDLVoiceCommandUpdateOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager pendingVoiceCommands:(NSArray<SDLVoiceCommand *> *)pendingVoiceCommands oldVoiceCommands:(NSArray<SDLVoiceCommand *> *)oldVoiceCommands updateCompletionHandler:(SDLVoiceCommandUpdateCompletionHandler)completionHandler {
+ self = [self init];
+ if (!self) { return nil; }
+
+ _connectionManager = connectionManager;
+ _pendingVoiceCommands = pendingVoiceCommands;
+ _oldVoiceCommands = oldVoiceCommands;
+ _currentVoiceCommands = oldVoiceCommands.mutableCopy;
+ _completionHandler = completionHandler;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+ if (self.isCancelled) {
+ [self finishOperation];
+ return;
+ }
+
+ __weak typeof(self) weakSelf = self;
+ [self sdl_sendDeleteCurrentVoiceCommands:^{
+ // If the operation has been canceled, then don't send the new commands and finish the operation
+ if (self.isCancelled) {
+ [weakSelf finishOperation];
+ return;
+ }
+
+ // Send the new commands
+ [weakSelf sdl_sendCurrentVoiceCommands:^{
+ [weakSelf finishOperation];
+ }];
+ }];
+}
+
+#pragma mark - Sending RPCs
+
+/// Send DeleteCommand RPCs for voice commands that should be deleted
+/// @param completionHandler A handler called when all DeleteCommands have completed
+- (void)sdl_sendDeleteCurrentVoiceCommands:(void(^)(void))completionHandler {
+ if (self.oldVoiceCommands.count == 0) {
+ SDLLogD(@"No voice commands to delete");
+ return completionHandler();
+ }
+
+ NSArray<SDLDeleteCommand *> *deleteVoiceCommands = [self sdl_deleteCommandsForVoiceCommands:self.oldVoiceCommands];
+ __block NSMutableDictionary<SDLDeleteCommand *, NSError *> *errors = [NSMutableDictionary dictionary];
+ __weak typeof(self) weakSelf = self;
+ [self.connectionManager sendRequests:deleteVoiceCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ // Add the request to the error dict or remove it from the current voice commands array
+ if (error != nil) {
+ errors[request] = error;
+ } else {
+ [weakSelf sdl_removeCurrentVoiceCommandWithCommandId:((SDLDeleteCommand *)request).cmdID.unsignedIntValue];
+ }
+
+ SDLLogV(@"Deleting voice commands progress: %f", percentComplete);
+ } completionHandler:^(BOOL success) {
+ if (!success) {
+ SDLLogE(@"Failed to send voice commands: %@", errors.allKeys);
+ SDLLogE(@"Failure reasons: %@", errors.allValues);
+ weakSelf.internalError = [NSError sdl_menuManager_failedToUpdateWithDictionary:errors];
+ return completionHandler();
+ }
+
+ SDLLogD(@"Finished deleting old voice commands");
+ return completionHandler();
+ }];
+}
+
+/// Send AddCommand RPCs for voice commands that should be added
+/// @param completionHandler A handler called when all AddCommands have completed
+- (void)sdl_sendCurrentVoiceCommands:(void(^)(void))completionHandler {
+ if (self.pendingVoiceCommands.count == 0) {
+ SDLLogD(@"No voice commands to send");
+ return completionHandler();
+ }
+
+ NSArray<SDLAddCommand *> *addCommandsToSend = [self sdl_addCommandsForVoiceCommands:self.pendingVoiceCommands];
+ __block NSMutableDictionary<SDLAddCommand *, NSError *> *errors = [NSMutableDictionary dictionary];
+ __weak typeof(self) weakSelf = self;
+ [self.connectionManager sendRequests:addCommandsToSend progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ // Add the request to the error dict or add it to the current voice commands array
+ if (error != nil) {
+ errors[request] = error;
+ } else {
+ [weakSelf.currentVoiceCommands addObject:[weakSelf sdl_pendingVoiceCommandWithCommandId:((SDLAddCommand *)request).cmdID.unsignedIntValue]];
+ }
+
+ SDLLogV(@"Sending voice commands progress: %f", percentComplete);
+ } completionHandler:^(BOOL success) {
+ if (!success) {
+ SDLLogE(@"Failed to send voice commands: %@", errors.allKeys);
+ SDLLogE(@"Failure reasons: %@", errors.allValues);
+ weakSelf.internalError = [NSError sdl_menuManager_failedToUpdateWithDictionary:errors];
+ return completionHandler();
+ }
+
+ SDLLogD(@"Finished updating voice commands");
+ return completionHandler();
+ }];
+}
+
+#pragma mark - Helpers
+#pragma mark Deletes
+
+/// Create DeleteCommand RPCs for passed voice commands
+/// @param voiceCommands The voice commands that should be deleted
+/// @return The DeleteCommand RPCs for the passed voice commands
+- (NSArray<SDLDeleteCommand *> *)sdl_deleteCommandsForVoiceCommands:(NSArray<SDLVoiceCommand *> *)voiceCommands {
+ NSMutableArray<SDLDeleteCommand *> *mutableDeletes = [NSMutableArray array];
+ for (SDLVoiceCommand *command in voiceCommands) {
+ SDLDeleteCommand *delete = [[SDLDeleteCommand alloc] initWithId:command.commandId];
+ [mutableDeletes addObject:delete];
+ }
+
+ return [mutableDeletes copy];
+}
+
+#pragma mark Commands
+
+/// Create AddCommand RPCs for passed voice commands
+/// @param voiceCommands The voice commands that should be added
+/// @return The AddCommand RPCs for the passed voice commands
+- (NSArray<SDLAddCommand *> *)sdl_addCommandsForVoiceCommands:(NSArray<SDLVoiceCommand *> *)voiceCommands {
+ NSMutableArray<SDLAddCommand *> *mutableCommands = [NSMutableArray array];
+ for (SDLVoiceCommand *voiceCommand in voiceCommands) {
+ SDLAddCommand *command = [[SDLAddCommand alloc] init];
+ command.vrCommands = voiceCommand.voiceCommands;
+ command.cmdID = @(voiceCommand.commandId);
+
+ [mutableCommands addObject:command];
+ }
+
+ return [mutableCommands copy];
+}
+
+#pragma mark - Managing list of commands on head unit
+
+/// Remove a voice command from the array of voice commands on the head unit based on a command id
+/// @param commandId The command id to use to remove a voice command
+- (void)sdl_removeCurrentVoiceCommandWithCommandId:(UInt32)commandId {
+ for (SDLVoiceCommand *voiceCommand in self.currentVoiceCommands) {
+ if (voiceCommand.commandId == commandId) {
+ [self.currentVoiceCommands removeObject:voiceCommand];
+ break;
+ }
+ }
+}
+
+/// Find a voice command in the pending voice command array based on a command id
+/// @param commandId The command id to use to find a voice command
+- (nullable SDLVoiceCommand *)sdl_pendingVoiceCommandWithCommandId:(UInt32)commandId {
+ for (SDLVoiceCommand *voiceCommand in self.pendingVoiceCommands) {
+ if (voiceCommand.commandId == commandId) {
+ return voiceCommand;
+ }
+ }
+
+ return nil;
+}
+
+#pragma mark - Operation Overrides
+
+- (void)finishOperation {
+ SDLLogV(@"Finishing voice command update operation");
+ if (self.isCancelled) {
+ self.internalError = [NSError sdl_voiceCommandManager_pendingUpdateSuperseded];
+ }
+
+ self.completionHandler(self.currentVoiceCommands.copy, self.error);
+ [super finishOperation];
+}
+
+- (nullable NSString *)name {
+ return @"com.sdl.voicecommand.update";
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+- (nullable NSError *)error {
+ return self.internalError;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h
index 9321c98cd..71e541666 100644
--- a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h
+++ b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h
@@ -1,5 +1,5 @@
//
-// SDLWindowCapability+ShowManagerExtensions.h
+// SDLWindowCapability+ScreenManagerExtensions.h
// SmartDeviceLink
//
// Created by Joel Fischer on 2/28/18.
@@ -12,15 +12,28 @@
#import "SDLTextFieldName.h"
#import "SDLWindowCapability.h"
+@class SDLKeyboardProperties;
+
NS_ASSUME_NONNULL_BEGIN
+static const int MaxMainFieldLineCount = 4;
+static const int MaxAlertTextFieldLineCount = 3;
+
@interface SDLWindowCapability (ScreenManagerExtensions)
@property (assign, nonatomic, readonly) NSUInteger maxNumberOfMainFieldLines;
+@property (assign, nonatomic, readonly) NSUInteger maxNumberOfAlertFieldLines;
- (BOOL)hasTextFieldOfName:(SDLTextFieldName)name;
- (BOOL)hasImageFieldOfName:(SDLImageFieldName)name;
+/// Takes a keyboard configuration (SDLKeyboardProperties) and creates a valid version of it, if possible, based on this object's internal keyboardCapabilities (SDLKeyboardCapabilities).
+/// If there is no internal keyboardCapabilities, it will just return the passed configuration as-is.
+/// If no valid configuration can be determined based on the internal keyboard capabilities, it will return nil.
+/// @param keyboardConfiguration The configuration to use to determine a valid configuration
+/// @return The passed keyboardConfiguration if there are no changes needed or possible, a modified keyboardConfiguration if a valid version of the configuration could be determined, or nil if a valid configuration could not be created
+- (nullable SDLKeyboardProperties *)createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:(nullable SDLKeyboardProperties *)keyboardConfiguration;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m
index 441356a83..e83063545 100644
--- a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m
+++ b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m
@@ -1,5 +1,5 @@
//
-// SDLWindowCapability+ShowManagerExtensions.m
+// SDLWindowCapability+ScreenManagerExtensions.m
// SmartDeviceLink
//
// Created by Joel Fischer on 2/28/18.
@@ -10,6 +10,10 @@
#import "SDLWindowCapability+ScreenManagerExtensions.h"
#import "SDLImageField.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLKeyboardProperties.h"
+#import "SDLLogMacros.h"
#import "SDLTextField.h"
@implementation SDLWindowCapability (ScreenManagerExtensions)
@@ -35,7 +39,24 @@
NSInteger fieldNumber = [[textField.name substringFromIndex:(textField.name.length - 1)] integerValue];
highestFound = (highestFound < fieldNumber) ? fieldNumber : highestFound;
- if (highestFound == 4) { break; }
+ if (highestFound == MaxMainFieldLineCount) { break; }
+ }
+ }
+
+ return (NSUInteger)highestFound;
+}
+
+- (NSUInteger)maxNumberOfAlertFieldLines {
+ NSInteger highestFound = 0;
+ for (SDLTextField *textField in self.textFields) {
+ if (![textField.name isKindOfClass:[NSString class]]) { continue; }
+ if ([textField.name isEqualToString:SDLTextFieldNameAlertText1]
+ || [textField.name isEqualToString:SDLTextFieldNameAlertText2]
+ || [textField.name isEqualToString:SDLTextFieldNameAlertText3]) {
+ NSInteger fieldNumber = [[textField.name substringFromIndex:(textField.name.length - 1)] integerValue];
+ highestFound = (highestFound < fieldNumber) ? fieldNumber : highestFound;
+
+ if (highestFound == MaxAlertTextFieldLineCount) { break; }
}
}
@@ -52,4 +73,44 @@
return NO;
}
+- (nullable SDLKeyboardProperties *)createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:(nullable SDLKeyboardProperties *)keyboardConfiguration {
+ // If there are no keyboard capabilities, if there is no passed keyboard configuration, or if there is no layout to the passed keyboard configuration, just pass back the passed in configuration
+ if ((self.keyboardCapabilities == nil) || (keyboardConfiguration == nil) || (keyboardConfiguration.keyboardLayout == nil)) {
+ return keyboardConfiguration;
+ }
+
+ // Find the capability for the keyboard configuration's layout
+ SDLKeyboardLayoutCapability *selectedLayoutCapability = nil;
+ for (SDLKeyboardLayoutCapability *layoutCapability in self.keyboardCapabilities.supportedKeyboards) {
+ if ([layoutCapability.keyboardLayout isEqualToEnum:keyboardConfiguration.keyboardLayout]) {
+ selectedLayoutCapability = layoutCapability;
+ break;
+ }
+ }
+ if (selectedLayoutCapability == nil) {
+ SDLLogE(@"Configured keyboard layout is not supported: %@", keyboardConfiguration.keyboardLayout);
+ return nil;
+ }
+
+ // Modify the keyboard configuration if there are fewer customKeys allowed than were set, or if an empty array was set.
+ SDLKeyboardProperties *modifiedKeyboardConfiguration = [keyboardConfiguration copy];
+ if (keyboardConfiguration.customKeys.count == 0) {
+ modifiedKeyboardConfiguration.customKeys = nil;
+ } else {
+ NSUInteger numConfigurableKeys = selectedLayoutCapability.numConfigurableKeys.unsignedIntegerValue;
+ if (modifiedKeyboardConfiguration.customKeys.count > numConfigurableKeys) {
+ SDLLogW(@"%lu custom keys set, but the selected layout: %@ only supports %lu. Dropping the rest.", (unsigned long)modifiedKeyboardConfiguration.customKeys.count, modifiedKeyboardConfiguration.keyboardLayout, (unsigned long)numConfigurableKeys);
+ // If there are more custom keys than are allowed for the selected keyboard layout, we need to trim the number of keys to only use the first n number of custom keys, where n is the number of allowed custom keys for that layout.
+ modifiedKeyboardConfiguration.customKeys = [modifiedKeyboardConfiguration.customKeys subarrayWithRange:NSMakeRange(0, numConfigurableKeys)];
+ }
+ }
+
+ // If the keyboard does not support masking input characters, we will remove it from the keyboard configuration
+ if (!self.keyboardCapabilities.maskInputCharactersSupported.boolValue) {
+ modifiedKeyboardConfiguration.maskInputCharacters = nil;
+ }
+
+ return modifiedKeyboardConfiguration;
+}
+
@end
diff --git a/SmartDeviceLink/public/SDLAddCommand.h b/SmartDeviceLink/public/SDLAddCommand.h
index ea5968970..745f6cf72 100644
--- a/SmartDeviceLink/public/SDLAddCommand.h
+++ b/SmartDeviceLink/public/SDLAddCommand.h
@@ -21,7 +21,7 @@
* 2. Choices having only SDLMenuParams definitions, but no VR synonym definitions
* 3. Choices having both SDLMenuParams and VR synonym definitions
*
- * HMILevel needs to be FULL, LIMITED or BACKGROUD
+ * HMILevel needs to be FULL, LIMITED or BACKGROUND
* @since SDL 1.0
* @see SDLDeleteCommand, SDLAddSubMenu, SDLDeleteSubMenu
*/
@@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return A SDLAddCommand object
*/
-- (instancetype)initWithHandler:(nullable SDLRPCCommandNotificationHandler)handler;
+- (instancetype)initWithHandler:(nullable SDLRPCCommandNotificationHandler)handler __deprecated_msg("Use initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage: instead");
/**
* Convenience init for creating a voice command menu item.
@@ -49,7 +49,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param handler Called when the VR system recognizes a phrase in `vrCommands`
* @return A SDLAddCommand object
*/
-- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands handler:(nullable SDLRPCCommandNotificationHandler)handler;
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands handler:(nullable SDLRPCCommandNotificationHandler)handler __deprecated_msg("Use initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage: instead");
/**
* Convenience init for creating a menu item with text.
@@ -60,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param handler Called when the menu item is selected and/or when the VR system recognizes a phrase in `vrCommands`
* @return A SDLAddCommand object
*/
-- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName handler:(nullable SDLRPCCommandNotificationHandler)handler;
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName handler:(nullable SDLRPCCommandNotificationHandler)handler __deprecated_msg("Use initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage: instead");
/**
* Convenience init for creating a menu item with text and a custom icon.
@@ -78,7 +78,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param handler Called when the menu item is selected and/or when the VR system recognizes a phrase in `vrCommands`
* @return A SDLAddCommand object
*/
-- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position iconValue:(nullable NSString *)iconValue iconType:(nullable SDLImageType)iconType iconIsTemplate:(BOOL)iconIsTemplate handler:(nullable SDLRPCCommandNotificationHandler)handler;
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position iconValue:(nullable NSString *)iconValue iconType:(nullable SDLImageType)iconType iconIsTemplate:(BOOL)iconIsTemplate handler:(nullable SDLRPCCommandNotificationHandler)handler __deprecated_msg("Use initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage: instead");
/**
* Convenience init for creating a menu item with text and a custom icon.
@@ -94,7 +94,23 @@ NS_ASSUME_NONNULL_BEGIN
* @param handler Called when the menu item is selected and/or when the VR system recognizes a phrase in `vrCommands`
* @return A SDLAddCommand object
*/
-- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position icon:(nullable SDLImage *)icon handler:(nullable SDLRPCCommandNotificationHandler)handler;
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position icon:(nullable SDLImage *)icon handler:(nullable SDLRPCCommandNotificationHandler)handler __deprecated_msg("Use initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage: instead");
+
+/**
+ * @param cmdID - @(cmdID)
+ * @return A SDLAddCommand object
+ */
+- (instancetype)initWithCmdID:(UInt32)cmdID;
+
+/**
+ * @param cmdID - @(cmdID)
+ * @param menuParams - menuParams
+ * @param vrCommands - vrCommands
+ * @param cmdIcon - cmdIcon
+ * @param secondaryImage - secondaryImage
+ * @return A SDLAddCommand object
+ */
+- (instancetype)initWithCmdID:(UInt32)cmdID menuParams:(nullable SDLMenuParams *)menuParams vrCommands:(nullable NSArray<NSString *> *)vrCommands cmdIcon:(nullable SDLImage *)cmdIcon secondaryImage:(nullable SDLImage *)secondaryImage;
/**
* A handler that will let you know when the button you created is subscribed.
@@ -139,6 +155,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLImage *cmdIcon;
+/**
+ * Optional secondary image struct for menu cell
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLImage *secondaryImage;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAddCommand.m b/SmartDeviceLink/public/SDLAddCommand.m
index 83da5658f..c86004e97 100644
--- a/SmartDeviceLink/public/SDLAddCommand.m
+++ b/SmartDeviceLink/public/SDLAddCommand.m
@@ -87,6 +87,27 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)initWithCmdID:(UInt32)cmdID {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.cmdID = @(cmdID);
+ return self;
+}
+
+- (instancetype)initWithCmdID:(UInt32)cmdID menuParams:(nullable SDLMenuParams *)menuParams vrCommands:(nullable NSArray<NSString *> *)vrCommands cmdIcon:(nullable SDLImage *)cmdIcon secondaryImage:(nullable SDLImage *)secondaryImage {
+ self = [self initWithCmdID:cmdID];
+ if (!self) {
+ return nil;
+ }
+ self.menuParams = menuParams;
+ self.vrCommands = vrCommands;
+ self.cmdIcon = cmdIcon;
+ self.secondaryImage = secondaryImage;
+ return self;
+}
+
#pragma mark - Getters / Setters
- (void)setCmdID:(NSNumber<SDLInt> *)cmdID {
@@ -122,6 +143,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameCommandIcon ofClass:SDLImage.class error:nil];
}
+- (void)setSecondaryImage:(nullable SDLImage *)secondaryImage {
+ [self.parameters sdl_setObject:secondaryImage forName:SDLRPCParameterNameSecondaryImage];
+}
+
+- (nullable SDLImage *)secondaryImage {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSecondaryImage ofClass:SDLImage.class error:nil];
+}
+
-(id)copyWithZone:(nullable NSZone *)zone {
SDLAddCommand *newCommand = [super copyWithZone:zone];
newCommand->_handler = self.handler;
diff --git a/SmartDeviceLink/public/SDLAddSubMenu.h b/SmartDeviceLink/public/SDLAddSubMenu.h
index 2de2f466d..e5547a2e8 100644
--- a/SmartDeviceLink/public/SDLAddSubMenu.h
+++ b/SmartDeviceLink/public/SDLAddSubMenu.h
@@ -44,7 +44,7 @@
* added to a SDLSubMenu), and may only contain commands as children
* <p>
* <p>
- * <b>HMILevel needs to be FULL, LIMITED or BACKGROUD</b>
+ * <b>HMILevel needs to be FULL, LIMITED or BACKGROUND</b>
* </p>
*
* Since <b>SmartDeviceLink 1.0</b><br>
@@ -71,7 +71,21 @@ NS_ASSUME_NONNULL_BEGIN
* @param parentID - parentID
* @return A SDLAddSubMenu object
*/
-- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName position:(nullable NSNumber<SDLUInt> *)position menuIcon:(nullable SDLImage *)menuIcon menuLayout:(nullable SDLMenuLayout)menuLayout parentID:(nullable NSNumber<SDLUInt> *)parentID;
+- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName position:(nullable NSNumber<SDLUInt> *)position menuIcon:(nullable SDLImage *)menuIcon menuLayout:(nullable SDLMenuLayout)menuLayout parentID:(nullable NSNumber<SDLUInt> *)parentID __deprecated_msg("Use initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage: instead");
+
+/**
+ * @param menuID - @(menuID)
+ * @param menuName - menuName
+ * @param position - position
+ * @param menuIcon - menuIcon
+ * @param menuLayout - menuLayout
+ * @param parentID - parentID
+ * @param secondaryText - secondaryText
+ * @param tertiaryText - tertiaryText
+ * @param secondaryImage - secondaryImage
+ * @return A SDLAddSubMenu object
+ */
+- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName position:(nullable NSNumber<SDLUInt> *)position menuIcon:(nullable SDLImage *)menuIcon menuLayout:(nullable SDLMenuLayout)menuLayout parentID:(nullable NSNumber<SDLUInt> *)parentID secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText secondaryImage:(nullable SDLImage *)secondaryImage;
/**
* a Menu ID that identifies a sub menu
@@ -125,6 +139,29 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSNumber<SDLUInt> *parentID;
+/**
+ * Optional secondary text to display
+ * {"string_min_length": 1, "string_max_length": 500}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSString *secondaryText;
+
+/**
+ * Optional tertiary text to display
+ * {"string_min_length": 1, "string_max_length": 500}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSString *tertiaryText;
+
+/**
+ * Optional secondary image struct for sub-menu cell
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLImage *secondaryImage;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAddSubMenu.m b/SmartDeviceLink/public/SDLAddSubMenu.m
index 06a615df1..5524e9220 100644
--- a/SmartDeviceLink/public/SDLAddSubMenu.m
+++ b/SmartDeviceLink/public/SDLAddSubMenu.m
@@ -61,6 +61,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName position:(nullable NSNumber<SDLUInt> *)position menuIcon:(nullable SDLImage *)menuIcon menuLayout:(nullable SDLMenuLayout)menuLayout parentID:(nullable NSNumber<SDLUInt> *)parentID {
+ return [self initWithMenuID:menuID menuName:menuName position:position menuIcon:menuIcon menuLayout:menuLayout parentID:parentID secondaryText:nil tertiaryText:nil secondaryImage:nil];
+}
+
+- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName position:(nullable NSNumber<SDLUInt> *)position menuIcon:(nullable SDLImage *)menuIcon menuLayout:(nullable SDLMenuLayout)menuLayout parentID:(nullable NSNumber<SDLUInt> *)parentID secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText secondaryImage:(nullable SDLImage *)secondaryImage {
self = [self initWithMenuID:menuID menuName:menuName];
if (!self) {
return nil;
@@ -69,6 +73,9 @@ NS_ASSUME_NONNULL_BEGIN
self.menuIcon = menuIcon;
self.menuLayout = menuLayout;
self.parentID = parentID;
+ self.secondaryText = secondaryText;
+ self.tertiaryText = tertiaryText;
+ self.secondaryImage = secondaryImage;
return self;
}
@@ -122,6 +129,30 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameParentID ofClass:NSNumber.class error:nil];
}
+- (void)setSecondaryText:(nullable NSString *)secondaryText {
+ [self.parameters sdl_setObject:secondaryText forName:SDLRPCParameterNameSecondaryText];
+}
+
+- (nullable NSString *)secondaryText {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSecondaryText ofClass:NSString.class error:nil];
+}
+
+- (void)setTertiaryText:(nullable NSString *)tertiaryText {
+ [self.parameters sdl_setObject:tertiaryText forName:SDLRPCParameterNameTertiaryText];
+}
+
+- (nullable NSString *)tertiaryText {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameTertiaryText ofClass:NSString.class error:nil];
+}
+
+- (void)setSecondaryImage:(nullable SDLImage *)secondaryImage {
+ [self.parameters sdl_setObject:secondaryImage forName:SDLRPCParameterNameSecondaryImage];
+}
+
+- (nullable SDLImage *)secondaryImage {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSecondaryImage ofClass:SDLImage.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAlertAudioData.h b/SmartDeviceLink/public/SDLAlertAudioData.h
new file mode 100644
index 000000000..93b5462aa
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAlertAudioData.h
@@ -0,0 +1,22 @@
+//
+// SDLAlertAudioData.h
+// SmartDeviceLink
+//
+// Created by Nicole on 11/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAudioData.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLAlertAudioData : SDLAudioData
+
+/// Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.
+@property (assign, nonatomic) BOOL playTone;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAlertAudioData.m b/SmartDeviceLink/public/SDLAlertAudioData.m
new file mode 100644
index 000000000..3e6f2a8bd
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAlertAudioData.m
@@ -0,0 +1,25 @@
+//
+// SDLAlertAudioData.m
+// SmartDeviceLink
+//
+// Created by Nicole on 11/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAlertAudioData.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLAlertAudioData
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLAlertAudioData *new = [super copyWithZone:zone];
+ new->_playTone = _playTone;
+ return new;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAlertManeuver.h b/SmartDeviceLink/public/SDLAlertManeuver.h
index 3da7e63d4..a4caf2723 100644
--- a/SmartDeviceLink/public/SDLAlertManeuver.h
+++ b/SmartDeviceLink/public/SDLAlertManeuver.h
@@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
/// Convenience init to create an alert maneuver with required parameters
///
/// @param ttsText The text to speak
-/// @param softButtons An arry of soft buttons
+/// @param softButtons An array of soft buttons
///
/// @return An SDLAlertManeuver object
- (instancetype)initWithTTS:(nullable NSString *)ttsText softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons;
@@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN
/// Convenience init to create an alert maneuver with all parameters
///
/// @param ttsChunks An array of text chunks
-/// @param softButtons An arry of soft buttons
+/// @param softButtons An array of soft buttons
/// @return An SDLAlertManeuver object
- (instancetype)initWithTTSChunks:(nullable NSArray<SDLTTSChunk *> *)ttsChunks softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons;
@@ -43,7 +43,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) NSArray<SDLTTSChunk *> *ttsChunks;
/**
- * An arry of soft buttons. If omitted on supported displays, only the system defined "Close" SoftButton shall be displayed.
+ * An array of soft buttons. If omitted on supported displays, only the system defined "Close" SoftButton shall be displayed.
*
* Optional, Array of SDLSoftButton, Array length 0 - 3
*
diff --git a/SmartDeviceLink/public/SDLAlertView.h b/SmartDeviceLink/public/SDLAlertView.h
new file mode 100644
index 000000000..c2524b17a
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAlertView.h
@@ -0,0 +1,76 @@
+//
+// SDLAlertView.h
+// SmartDeviceLink
+//
+// Created by Nicole on 11/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "NSNumber+NumberType.h"
+
+@class SDLAlertAudioData;
+@class SDLArtwork;
+@class SDLSoftButtonObject;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// Notifies the subscriber that the alert should be cancelled.
+typedef void (^SDLAlertCanceledHandler)(void);
+
+@interface SDLAlertView : NSObject <NSCopying>
+
+/// Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See `timeout` for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.
+/// Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.
+@property (class, assign, nonatomic) NSTimeInterval defaultTimeout;
+
+/// The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.
+@property (nullable, strong, nonatomic) NSString *text;
+
+/// The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.
+@property (nullable, strong, nonatomic) NSString *secondaryText;
+
+/// The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.
+@property (nullable, strong, nonatomic) NSString *tertiaryText;
+
+/// Timeout in seconds. Defaults to 0, which will use `defaultTimeout`. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.
+/// Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.
+@property (assign, nonatomic) NSTimeInterval timeout;
+
+/// Text spoken, file(s) played, and/or tone played when the alert appears
+@property (nullable, copy, nonatomic) SDLAlertAudioData *audio;
+
+/// If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.
+@property (assign, nonatomic) BOOL showWaitIndicator;
+
+/// Soft buttons the user may select to perform actions. Only one `SDLSoftButtonState` per object is supported; if any soft button object contains multiple states, an exception will be thrown.
+@property (nullable, copy, nonatomic) NSArray<SDLSoftButtonObject *> *softButtons;
+
+/// An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.
+@property (nullable, copy, nonatomic) SDLArtwork *icon;
+
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+
+/// Initialize a basic alert with a message and buttons
+/// @param text The primary line of text for display on the alert
+/// @param softButtons Soft buttons the user may select to perform actions
+- (instancetype)initWithText:(NSString *)text buttons:(NSArray<SDLSoftButtonObject *> *)softButtons;
+
+/// Initialize a alert with a text, image, buttons and sound
+/// @param text The primary line of text for display on the alert
+/// @param secondaryText The secondary line of text for display on the alert
+/// @param tertiaryText The tertiary line of text for display on the alert
+/// @param timeout Timeout in seconds
+/// @param showWaitIndicator If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation
+/// @param audio Text spoken and/or tone played when the alert appears
+/// @param softButtons Soft buttons the user may select to perform actions
+/// @param icon An artwork that will be displayed when the icon appears
+- (instancetype)initWithText:(nullable NSString *)text secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText timeout:(nullable NSNumber<SDLFloat> *)timeout showWaitIndicator:(nullable NSNumber<SDLBool> *)showWaitIndicator audioIndication:(nullable SDLAlertAudioData *)audio buttons:(nullable NSArray<SDLSoftButtonObject *> *)softButtons icon:(nullable SDLArtwork *)icon;
+
+/// Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.
+- (void)cancel;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAlertView.m b/SmartDeviceLink/public/SDLAlertView.m
new file mode 100644
index 000000000..f8f824f1b
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAlertView.m
@@ -0,0 +1,146 @@
+//
+// SDLAlertView.m
+// SmartDeviceLink
+//
+// Created by Nicole on 11/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAlertView.h"
+
+#import "SDLAlertAudioData.h"
+#import "SDLArtwork.h"
+#import "SDLError.h"
+#import "SDLSoftButtonObject.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLAlertView()
+
+@property (copy, nonatomic, nullable) SDLAlertCanceledHandler canceledHandler;
+
+@end
+
+@implementation SDLAlertView
+
+static const float TimeoutDefault = 0.0;
+static const float TimeoutMinCap = 3.0;
+static const float TimeoutMaxCap = 10.0;
+static NSTimeInterval _defaultTimeout = 5.0;
+
+- (instancetype)init {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _timeout = TimeoutDefault;
+
+ return self;
+}
+
+- (instancetype)initWithText:(NSString *)text buttons:(NSArray<SDLSoftButtonObject *> *)softButtons {
+ self = [self init];
+ if (!self) { return nil; }
+
+ _text = text;
+ self.softButtons = softButtons;
+
+ return self;
+}
+
+- (instancetype)initWithText:(nullable NSString *)text secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText timeout:(nullable NSNumber<SDLFloat> *)timeout showWaitIndicator:(nullable NSNumber<SDLBool> *)showWaitIndicator audioIndication:(nullable SDLAlertAudioData *)audio buttons:(nullable NSArray<SDLSoftButtonObject *> *)softButtons icon:(nullable SDLArtwork *)icon {
+ self = [self initWithText:text buttons:softButtons];
+ if (!self) { return nil; }
+
+ _secondaryText = secondaryText;
+ _tertiaryText = tertiaryText;
+ self.timeout = timeout.doubleValue;
+ _showWaitIndicator = showWaitIndicator.boolValue;
+ self.audio = audio;
+ self.icon = icon;
+
+ return self;
+}
+
+#pragma mark - Cancel
+
+- (void)cancel {
+ if (self.canceledHandler == nil) { return; }
+ self.canceledHandler();
+}
+
+#pragma mark - Getters / Setters
+
+- (void)setSoftButtons:(nullable NSArray<SDLSoftButtonObject *> *)softButtons {
+ for (SDLSoftButtonObject *softButton in softButtons) {
+ if (softButton.states.count == 1) { continue; }
+ @throw [NSException sdl_invalidAlertSoftButtonStatesException];
+ }
+
+ _softButtons = softButtons;
+}
+
++ (void)setDefaultTimeout:(NSTimeInterval)defaultTimeout {
+ _defaultTimeout = defaultTimeout;
+}
+
++ (NSTimeInterval)defaultTimeout {
+ if (_defaultTimeout < TimeoutMinCap) {
+ return TimeoutMinCap;
+ } else if (_defaultTimeout > TimeoutMaxCap) {
+ return TimeoutMaxCap;
+ }
+
+ return _defaultTimeout;
+}
+
+- (NSTimeInterval)timeout {
+ if (_timeout == TimeoutDefault) {
+ return SDLAlertView.defaultTimeout;
+ } else if (_timeout < TimeoutMinCap) {
+ return TimeoutMinCap;
+ } else if (_timeout > TimeoutMaxCap) {
+ return TimeoutMaxCap;
+ }
+
+ return _timeout;
+}
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLAlertView *newAlertView = [[SDLAlertView allocWithZone:zone] initWithText:[_text copyWithZone:zone] secondaryText:[_secondaryText copyWithZone:zone] tertiaryText:[_tertiaryText copyWithZone:zone] timeout:@(_timeout) showWaitIndicator:@(_showWaitIndicator) audioIndication:[_audio copyWithZone:zone] buttons:[_softButtons copyWithZone:zone] icon:[_icon copyWithZone:zone]];
+ newAlertView->_canceledHandler = [_canceledHandler copyWithZone:zone];
+ return newAlertView;
+}
+
+#pragma mark - Debug Description
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"SDLAlertView: \"%@\", text: \"%@\"", [self sdl_alertType], _text];
+}
+
+- (NSString *)debugDescription {
+ return [NSString stringWithFormat:@"SDLAlertView: \"%@\", text: \"%@\", secondaryText: \"%@\", tertiaryText: \"%@\", timeout: %.1f, showWaitIndicator: %d, audio: \"%@\", softButtons: \"%@\", icon: \"%@\"", [self sdl_alertType], _text, _secondaryText, _tertiaryText, _timeout, _showWaitIndicator, _audio, _softButtons, _icon];
+}
+
+- (NSString *)sdl_alertType {
+ BOOL alertHasText = (_text || _secondaryText || _tertiaryText);
+ BOOL alertHasAudio = _audio.audioData.count > 0;
+
+ NSString *alertType;
+ if (alertHasText && alertHasAudio) {
+ alertType = @"Text-and-audio";
+ } else if (alertHasText) {
+ alertType = @"Text-only";
+ } else if (alertHasAudio) {
+ alertType = @"Audio-only";
+ } else {
+ alertType = @"Invalid";
+ }
+
+ return alertType;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAppCapability.h b/SmartDeviceLink/public/SDLAppCapability.h
new file mode 100644
index 000000000..3220c9fa9
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAppCapability.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consort`ium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLAppCapabilityType.h"
+#import "SDLRPCStruct.h"
+
+@class SDLVideoStreamingCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLAppCapability : SDLRPCStruct
+
+/**
+ * @param appCapabilityType - appCapabilityType
+ * @return A SDLAppCapability object
+ */
+- (instancetype)initWithAppCapabilityType:(SDLAppCapabilityType)appCapabilityType;
+
+/**
+ * @param appCapabilityType - appCapabilityType
+ * @param videoStreamingCapability - videoStreamingCapability
+ * @return A SDLAppCapability object
+ */
+- (instancetype)initWithAppCapabilityType:(SDLAppCapabilityType)appCapabilityType videoStreamingCapability:(nullable SDLVideoStreamingCapability *)videoStreamingCapability;
+
+/**
+ * Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other param included.
+ */
+@property (strong, nonatomic) SDLAppCapabilityType appCapabilityType;
+
+/**
+ * Describes supported capabilities for video streaming
+ */
+@property (nullable, strong, nonatomic) SDLVideoStreamingCapability *videoStreamingCapability;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAppCapability.m b/SmartDeviceLink/public/SDLAppCapability.m
new file mode 100644
index 000000000..9976d963a
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAppCapability.m
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLAppCapability.h"
+#import "SDLAppCapabilityType.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLVideoStreamingCapability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+@implementation SDLAppCapability
+
+- (instancetype)initWithAppCapabilityType:(SDLAppCapabilityType)appCapabilityType {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.appCapabilityType = appCapabilityType;
+ return self;
+}
+
+- (instancetype)initWithAppCapabilityType:(SDLAppCapabilityType)appCapabilityType videoStreamingCapability:(nullable SDLVideoStreamingCapability *)videoStreamingCapability {
+ self = [self initWithAppCapabilityType:appCapabilityType];
+ if (!self) {
+ return nil;
+ }
+ self.videoStreamingCapability = videoStreamingCapability;
+ return self;
+}
+
+- (void)setAppCapabilityType:(SDLAppCapabilityType)appCapabilityType {
+ [self.store sdl_setObject:appCapabilityType forName:SDLRPCParameterNameAppCapabilityType];
+}
+
+- (SDLAppCapabilityType)appCapabilityType {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameAppCapabilityType error:&error];
+}
+
+- (void)setVideoStreamingCapability:(nullable SDLVideoStreamingCapability *)videoStreamingCapability {
+ [self.store sdl_setObject:videoStreamingCapability forName:SDLRPCParameterNameVideoStreamingCapability];
+}
+
+- (nullable SDLVideoStreamingCapability *)videoStreamingCapability {
+ return [self.store sdl_objectForName:SDLRPCParameterNameVideoStreamingCapability ofClass:SDLVideoStreamingCapability.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/public/SDLAppCapabilityType.h b/SmartDeviceLink/public/SDLAppCapabilityType.h
new file mode 100644
index 000000000..73aa1bd83
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAppCapabilityType.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLEnum.h"
+
+/**
+ * Enumerations of all available app capability types
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+typedef SDLEnum SDLAppCapabilityType NS_TYPED_ENUM;
+
+extern SDLAppCapabilityType const SDLAppCapabilityTypeVideoStreaming;
diff --git a/SmartDeviceLink/public/SDLAppCapabilityType.m b/SmartDeviceLink/public/SDLAppCapabilityType.m
new file mode 100644
index 000000000..7acb3f37c
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAppCapabilityType.m
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLAppCapabilityType.h"
+
+SDLAppCapabilityType const SDLAppCapabilityTypeVideoStreaming = @"VIDEO_STREAMING";
diff --git a/SmartDeviceLink/public/SDLArtwork.m b/SmartDeviceLink/public/SDLArtwork.m
index 85dd4705a..9ac173307 100644
--- a/SmartDeviceLink/public/SDLArtwork.m
+++ b/SmartDeviceLink/public/SDLArtwork.m
@@ -156,9 +156,17 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - NSObject overrides
- (id)copyWithZone:(nullable NSZone *)zone {
- SDLArtworkImageFormat imageFormat = self.fileType == SDLFileTypePNG ? SDLArtworkImageFormatPNG : SDLArtworkImageFormatJPG;
+ SDLArtwork *artwork = nil;
+ if (self.isStaticIcon) {
+ artwork = [[SDLArtwork allocWithZone:zone] initWithStaticIcon:[[NSString alloc] initWithData:self.data encoding:NSASCIIStringEncoding]];
+ } else {
+ SDLArtworkImageFormat imageFormat = self.fileType == SDLFileTypePNG ? SDLArtworkImageFormatPNG : SDLArtworkImageFormatJPG;
+ artwork = [[SDLArtwork allocWithZone:zone] initWithImage:[self.image copy] name:[self.name copy] persistent:self.isPersistent asImageFormat:imageFormat];
+ }
+
+ artwork.overwrite = self.overwrite;
- return [[SDLArtwork allocWithZone:zone] initWithImage:[self.image copy] name:[self.name copy] persistent:self.isPersistent asImageFormat:imageFormat];
+ return artwork;
}
- (NSUInteger)hash {
@@ -184,7 +192,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (NSString *)description {
- return [NSString stringWithFormat:@"SDLArtwork name: %@, image: %@, isTemplate: %@, isStaticIcon: %@", self.name, self.image, (self.isTemplate ? @"YES" : @"NO"), (self.isStaticIcon ? @"YES" : @"NO")];
+ return [NSString stringWithFormat:@"SDLArtwork name: %@, image: %@, isTemplate: %@, isStaticIcon: %@, isOverwrite: %@", self.name, self.image, (self.isTemplate ? @"YES" : @"NO"), (self.isStaticIcon ? @"YES" : @"NO"), (self.overwrite ? @"YES" : @"NO")];
}
@end
diff --git a/SmartDeviceLink/public/SDLAudioData.h b/SmartDeviceLink/public/SDLAudioData.h
new file mode 100644
index 000000000..a4c0a3667
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAudioData.h
@@ -0,0 +1,55 @@
+//
+// SDLAudioData.h
+// SmartDeviceLink
+//
+// Created by Nicole on 11/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLSpeechCapabilities.h"
+
+@class SDLFile;
+@class SDLTTSChunk;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLAudioData : NSObject <NSCopying>
+
+/// The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.
+@property (nullable, copy, nonatomic, readonly) NSArray<SDLTTSChunk *> *audioData;
+
+/// Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.
+/// @discussion Only available on systems supporting RPC Spec v5.0+
+///
+/// @param audioFile The audio file to be played by the system
+- (instancetype)initWithAudioFile:(SDLFile *)audioFile;
+
+/// Initialize with a string to be spoken by the system speech synthesizer.
+/// @param spokenString The string to be spoken by the system speech synthesizer
+- (instancetype)initWithSpeechSynthesizerString:(NSString *)spokenString;
+
+/// Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.
+/// @param phoneticString The string to be spoken by the system speech synthesizer
+/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created
+- (instancetype)initWithPhoneticSpeechSynthesizerString:(NSString *)phoneticString phoneticType:(SDLSpeechCapabilities)phoneticType;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/// Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.
+/// @param audioFiles An array of audio file to be played by the system
+- (void)addAudioFiles:(NSArray<SDLFile *> *)audioFiles;
+
+/// Create additional strings to be spoken by the system speech synthesizer.
+/// @param spokenStrings The strings to be spoken by the system speech synthesizer
+- (void)addSpeechSynthesizerStrings:(NSArray<NSString *> *)spokenStrings;
+
+/// Create additional strings to be spoken by the system speech synthesizer using a phonetic string.
+/// @param phoneticStrings The strings to be spoken by the system speech synthesizer
+/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created
+- (void)addPhoneticSpeechSynthesizerStrings:(NSArray<NSString *> *)phoneticStrings phoneticType:(SDLSpeechCapabilities)phoneticType;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAudioData.m b/SmartDeviceLink/public/SDLAudioData.m
new file mode 100644
index 000000000..e0ddb3501
--- /dev/null
+++ b/SmartDeviceLink/public/SDLAudioData.m
@@ -0,0 +1,135 @@
+//
+// SDLAudioData.m
+// SmartDeviceLink
+//
+// Created by Nicole on 11/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAudioData.h"
+
+#import "SDLError.h"
+#import "SDLFile.h"
+#import "SDLSpeak.h"
+#import "SDLTTSChunk.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLAudioData()
+
+/// The audio file data that will be uploaded.
+@property (nullable, copy, nonatomic, readonly) NSMutableDictionary<NSString *, SDLFile *> *audioFileData;
+@property (nullable, copy, nonatomic, readonly) NSMutableArray<SDLTTSChunk *> *mutableAudioData;
+
+@end
+
+@implementation SDLAudioData
+
+- (instancetype)init {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _mutableAudioData = [NSMutableArray array];
+ _audioFileData = [NSMutableDictionary dictionary];
+
+ return self;
+}
+
+- (instancetype)initWithAudioFile:(SDLFile *)audioFile {
+ self = [self init];
+ if (!self) { return nil; }
+
+ [_mutableAudioData addObjectsFromArray:[SDLTTSChunk fileChunksWithName:audioFile.name]];
+ _audioFileData[audioFile.name] = audioFile;
+
+ return self;
+}
+
+- (instancetype)initWithSpeechSynthesizerString:(NSString *)spokenString {
+ self = [self init];
+ if (!self) { return nil; }
+
+ [_mutableAudioData addObjectsFromArray:[SDLTTSChunk textChunksFromString:spokenString]];
+
+ return self;
+}
+
+- (instancetype)initWithPhoneticSpeechSynthesizerString:(NSString *)phoneticString phoneticType:(SDLSpeechCapabilities)phoneticType {
+ self = [self init];
+ if (!self) { return nil; }
+
+ if (![self.class sdl_isValidPhoneticType:phoneticType]) {
+ @throw [NSException sdl_invalidTTSSpeechCapabilitiesException];
+ }
+
+ [_mutableAudioData addObjectsFromArray:@[[[SDLTTSChunk alloc] initWithText:phoneticString type:phoneticType]]];
+
+ return self;
+}
+
+#pragma mark - Adding additional audio data
+- (void)addAudioFiles:(NSArray<SDLFile *> *)audioFiles {
+ if (audioFiles.count == 0) { return; }
+
+ for (SDLFile *audioFile in audioFiles) {
+ self.audioFileData[audioFile.name] = audioFile;
+ [self.mutableAudioData addObjectsFromArray:[SDLTTSChunk fileChunksWithName:audioFile.name]];
+ }
+}
+
+- (void)addSpeechSynthesizerStrings:(NSArray<NSString *> *)spokenStrings {
+ if (spokenStrings.count == 0) { return; }
+
+ for (NSString *spokenString in spokenStrings) {
+ if (spokenString.length == 0) { continue; }
+ [self.mutableAudioData addObjectsFromArray:[SDLTTSChunk textChunksFromString:spokenString]];
+ }
+}
+
+- (void)addPhoneticSpeechSynthesizerStrings:(NSArray<NSString *> *)phoneticStrings phoneticType:(SDLSpeechCapabilities)phoneticType {
+ if (![self.class sdl_isValidPhoneticType:phoneticType]) {
+ @throw [NSException sdl_invalidTTSSpeechCapabilitiesException];
+ } else if (phoneticStrings.count == 0) {
+ return;
+ }
+
+ for (NSString *phoneticString in phoneticStrings) {
+ if (phoneticString.length == 0) { continue; }
+ [self.mutableAudioData addObject:[[SDLTTSChunk alloc] initWithText:phoneticString type:phoneticType]];
+ }
+}
+
+#pragma mark - Private Utilities
+
+/// Checks if the phonetic type can be used to create a text-to-speech string.
+/// @param phoneticType The phonetic type of the text-to-speech string
+/// @return True if the phoneticType is of type `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED`; false if not.
++ (BOOL)sdl_isValidPhoneticType:(SDLSpeechCapabilities)phoneticType {
+ if (!([phoneticType isEqualToEnum:SDLSpeechCapabilitiesSAPIPhonemes]
+ || [phoneticType isEqualToEnum:SDLSpeechCapabilitiesLHPlusPhonemes]
+ || [phoneticType isEqualToEnum:SDLSpeechCapabilitiesText]
+ || [phoneticType isEqualToEnum:SDLSpeechCapabilitiesPrerecorded])) {
+ return NO;
+ }
+
+ return YES;
+}
+
+#pragma mark - Getters
+
+- (nullable NSArray<SDLTTSChunk *> *)audioData {
+ return [_mutableAudioData copy];
+}
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLAudioData *newAudioData = [[self class] allocWithZone:zone];
+ newAudioData->_mutableAudioData = [_mutableAudioData copyWithZone:zone];
+ newAudioData->_audioFileData = [_audioFileData copyWithZone:zone];
+ return newAudioData;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLAudioFile.h b/SmartDeviceLink/public/SDLAudioFile.h
index a9302949b..7f0ee20bf 100755
--- a/SmartDeviceLink/public/SDLAudioFile.h
+++ b/SmartDeviceLink/public/SDLAudioFile.h
@@ -11,7 +11,7 @@
NS_ASSUME_NONNULL_BEGIN
/**
- Includes inforamtion about a given audio file
+ Includes information about a given audio file
*/
@interface SDLAudioFile : NSObject
diff --git a/SmartDeviceLink/public/SDLBodyInformation.h b/SmartDeviceLink/public/SDLBodyInformation.h
index bed364503..081033a1d 100644
--- a/SmartDeviceLink/public/SDLBodyInformation.h
+++ b/SmartDeviceLink/public/SDLBodyInformation.h
@@ -5,17 +5,36 @@
#import "SDLIgnitionStableStatus.h"
#import "SDLIgnitionStatus.h"
+#import "SDLRPCStruct.h"
-
-/**
- * The body information including power modes.
- */
+@class SDLDoorStatus;
+@class SDLGateStatus;
+@class SDLRoofStatus;
NS_ASSUME_NONNULL_BEGIN
@interface SDLBodyInformation : SDLRPCStruct
/**
+ * @param parkBrakeActive - @(parkBrakeActive)
+ * @param ignitionStableStatus - ignitionStableStatus
+ * @param ignitionStatus - ignitionStatus
+ * @return A SDLBodyInformation object
+ */
+- (instancetype)initWithParkBrakeActive:(BOOL)parkBrakeActive ignitionStableStatus:(SDLIgnitionStableStatus)ignitionStableStatus ignitionStatus:(SDLIgnitionStatus)ignitionStatus;
+
+/**
+ * @param parkBrakeActive - @(parkBrakeActive)
+ * @param ignitionStableStatus - ignitionStableStatus
+ * @param ignitionStatus - ignitionStatus
+ * @param doorStatuses - doorStatuses
+ * @param gateStatuses - gateStatuses
+ * @param roofStatuses - roofStatuses
+ * @return A SDLBodyInformation object
+ */
+- (instancetype)initWithParkBrakeActive:(BOOL)parkBrakeActive ignitionStableStatus:(SDLIgnitionStableStatus)ignitionStableStatus ignitionStatus:(SDLIgnitionStatus)ignitionStatus doorStatuses:(nullable NSArray<SDLDoorStatus *> *)doorStatuses gateStatuses:(nullable NSArray<SDLGateStatus *> *)gateStatuses roofStatuses:(nullable NSArray<SDLRoofStatus *> *)roofStatuses;
+
+/**
* References signal "PrkBrkActv_B_Actl".
Required
@@ -37,32 +56,60 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLIgnitionStatus ignitionStatus;
/**
- * References signal "DrStatDrv_B_Actl".
-
- Optional
+ * References signal "DrStatDrv_B_Actl". Deprecated starting with RPC Spec 7.1.0.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *driverDoorAjar;
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *driverDoorAjar __deprecated_msg("use doorStatuses instead");
/**
- * References signal "DrStatPsngr_B_Actl".
+ * References signal "DrStatPsngr_B_Actl". Deprecated starting with RPC Spec 7.1.0.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *passengerDoorAjar __deprecated_msg("use doorStatuses instead");
- Optional
+/**
+ * References signal "DrStatRl_B_Actl". Deprecated starting with RPC Spec 7.1.0.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *passengerDoorAjar;
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *rearLeftDoorAjar __deprecated_msg("use doorStatuses instead");
/**
- * References signal "DrStatRl_B_Actl".
+ * References signal "DrStatRr_B_Actl". Deprecated starting with RPC Spec 7.1.0.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *rearRightDoorAjar __deprecated_msg("use doorStatuses instead");
- Optional
+/**
+ * Provides status for doors if Ajar/Closed/Locked
+ * {"array_min_size": 0, "array_max_size": 100}
+ *
+ * @added in SmartDeviceLink 7.1.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *rearLeftDoorAjar;
+@property (nullable, strong, nonatomic) NSArray<SDLDoorStatus *> *doorStatuses;
/**
- * References signal "DrStatRr_B_Actl".
+ * Provides status for trunk/hood/etc. if Ajar/Closed/Locked
+ * {"array_min_size": 0, "array_max_size": 100}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLGateStatus *> *gateStatuses;
- Optional
+/**
+ * Provides status for roof/convertible roof/sunroof/moonroof etc., if Closed/Ajar/Removed etc.
+ * {"array_min_size": 0, "array_max_size": 100}
+ *
+ * @added in SmartDeviceLink 7.1.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *rearRightDoorAjar;
+@property (nullable, strong, nonatomic) NSArray<SDLRoofStatus *> *roofStatuses;
@end
diff --git a/SmartDeviceLink/public/SDLBodyInformation.m b/SmartDeviceLink/public/SDLBodyInformation.m
index fe8aa8b29..d3d6f917e 100644
--- a/SmartDeviceLink/public/SDLBodyInformation.m
+++ b/SmartDeviceLink/public/SDLBodyInformation.m
@@ -2,17 +2,41 @@
//
-#import "SDLBodyInformation.h"
-
#import "NSMutableDictionary+Store.h"
+#import "SDLBodyInformation.h"
+#import "SDLDoorStatus.h"
+#import "SDLGateStatus.h"
#import "SDLIgnitionStableStatus.h"
#import "SDLIgnitionStatus.h"
#import "SDLRPCParameterNames.h"
+#import "SDLRoofStatus.h"
NS_ASSUME_NONNULL_BEGIN
@implementation SDLBodyInformation
+- (instancetype)initWithParkBrakeActive:(BOOL)parkBrakeActive ignitionStableStatus:(SDLIgnitionStableStatus)ignitionStableStatus ignitionStatus:(SDLIgnitionStatus)ignitionStatus {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.parkBrakeActive = @(parkBrakeActive);
+ self.ignitionStableStatus = ignitionStableStatus;
+ self.ignitionStatus = ignitionStatus;
+ return self;
+}
+
+- (instancetype)initWithParkBrakeActive:(BOOL)parkBrakeActive ignitionStableStatus:(SDLIgnitionStableStatus)ignitionStableStatus ignitionStatus:(SDLIgnitionStatus)ignitionStatus doorStatuses:(nullable NSArray<SDLDoorStatus *> *)doorStatuses gateStatuses:(nullable NSArray<SDLGateStatus *> *)gateStatuses roofStatuses:(nullable NSArray<SDLRoofStatus *> *)roofStatuses {
+ self = [self initWithParkBrakeActive:parkBrakeActive ignitionStableStatus:ignitionStableStatus ignitionStatus:ignitionStatus];
+ if (!self) {
+ return nil;
+ }
+ self.doorStatuses = doorStatuses;
+ self.gateStatuses = gateStatuses;
+ self.roofStatuses = roofStatuses;
+ return self;
+}
+
- (void)setParkBrakeActive:(NSNumber<SDLBool> *)parkBrakeActive {
[self.store sdl_setObject:parkBrakeActive forName:SDLRPCParameterNameParkBrakeActive];
}
@@ -72,6 +96,30 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameRearRightDoorAjar ofClass:NSNumber.class error:nil];
}
+- (void)setDoorStatuses:(nullable NSArray<SDLDoorStatus *> *)doorStatuses {
+ [self.store sdl_setObject:doorStatuses forName:SDLRPCParameterNameDoorStatuses];
+}
+
+- (nullable NSArray<SDLDoorStatus *> *)doorStatuses {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameDoorStatuses ofClass:SDLDoorStatus.class error:nil];
+}
+
+- (void)setGateStatuses:(nullable NSArray<SDLGateStatus *> *)gateStatuses {
+ [self.store sdl_setObject:gateStatuses forName:SDLRPCParameterNameGateStatuses];
+}
+
+- (nullable NSArray<SDLGateStatus *> *)gateStatuses {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameGateStatuses ofClass:SDLGateStatus.class error:nil];
+}
+
+- (void)setRoofStatuses:(nullable NSArray<SDLRoofStatus *> *)roofStatuses {
+ [self.store sdl_setObject:roofStatuses forName:SDLRPCParameterNameRoofStatuses];
+}
+
+- (nullable NSArray<SDLRoofStatus *> *)roofStatuses {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameRoofStatuses ofClass:SDLRoofStatus.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLCancelInteraction.h b/SmartDeviceLink/public/SDLCancelInteraction.h
index 289e85443..66c262adb 100644
--- a/SmartDeviceLink/public/SDLCancelInteraction.h
+++ b/SmartDeviceLink/public/SDLCancelInteraction.h
@@ -42,7 +42,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLCancelInteraction : SDLRPCRequest
/**
- Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interation).
+ Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interaction).
@param functionID The ID of the type of modal view to dismiss
@return A SDLCancelInteraction object
diff --git a/SmartDeviceLink/public/SDLChoiceCell.h b/SmartDeviceLink/public/SDLChoiceCell.h
index 197f0190d..34a80461d 100644
--- a/SmartDeviceLink/public/SDLChoiceCell.h
+++ b/SmartDeviceLink/public/SDLChoiceCell.h
@@ -46,6 +46,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readonly, nullable) SDLArtwork *secondaryArtwork;
/**
+ Primary text of the cell to be displayed on the module. Used to distinguish cells with the same `text` but other fields are different. This is autogenerated by the screen manager. Attempting to use cells that are exactly the same (all text and artwork fields are the same) will not cause this to be used. This will not be used when connected to modules supporting RPC 7.1+.
+ */
+@property (strong, nonatomic, readonly) NSString *uniqueText;
+/**
Initialize the cell with nothing. This is unavailable
@return A crash, probably
diff --git a/SmartDeviceLink/public/SDLChoiceCell.m b/SmartDeviceLink/public/SDLChoiceCell.m
index 05ceb4daa..c62d39272 100644
--- a/SmartDeviceLink/public/SDLChoiceCell.m
+++ b/SmartDeviceLink/public/SDLChoiceCell.m
@@ -9,12 +9,14 @@
#import "SDLChoiceCell.h"
#import "SDLArtwork.h"
+#import "NSArray+Extensions.h"
NS_ASSUME_NONNULL_BEGIN
@interface SDLChoiceCell()
@property (assign, nonatomic) UInt16 choiceId;
+@property (nonatomic, readwrite) NSString *uniqueText;
@end
@@ -40,6 +42,7 @@ NS_ASSUME_NONNULL_BEGIN
_voiceCommands = voiceCommands;
_artwork = artwork;
_secondaryArtwork = secondaryArtwork;
+ _uniqueText = text;
_choiceId = UINT16_MAX;
@@ -65,7 +68,7 @@ NSUInteger NSUIntRotate(NSUInteger val, NSUInteger howMuch) {
^ NSUIntRotate(self.tertiaryText.hash, NSUIntBit / 4)
^ NSUIntRotate(self.artwork.name.hash, NSUIntBit / 5)
^ NSUIntRotate(self.secondaryArtwork.name.hash, NSUIntBit / 6)
- ^ NSUIntRotate(self.voiceCommands.hash, NSUIntBit / 7);
+ ^ NSUIntRotate(self.voiceCommands.dynamicHash, NSUIntBit / 7);
}
- (BOOL)isEqual:(id)object {
@@ -84,7 +87,7 @@ NSUInteger NSUIntRotate(NSUInteger val, NSUInteger howMuch) {
#pragma mark - Etc.
- (NSString *)description {
- return [NSString stringWithFormat:@"SDLChoiceCell: %u-\"%@ - %@ - %@\", artworkNames: %@ - %@, voice commands: %lu", _choiceId, _text, _secondaryText, _tertiaryText, _artwork.name, _secondaryArtwork.name, (unsigned long)_voiceCommands.count];
+ return [NSString stringWithFormat:@"SDLChoiceCell: %u-\"%@ - %@ - %@\", artworkNames: %@ - %@, voice commands: %lu, uniqueText: %@", _choiceId, _text, _secondaryText, _tertiaryText, _artwork.name, _secondaryArtwork.name, (unsigned long)_voiceCommands.count, ([_text isEqualToString:_uniqueText] ? @"NO" : _uniqueText)];
}
@end
diff --git a/SmartDeviceLink/public/SDLChoiceSet.h b/SmartDeviceLink/public/SDLChoiceSet.h
index 674033553..83053e30e 100644
--- a/SmartDeviceLink/public/SDLChoiceSet.h
+++ b/SmartDeviceLink/public/SDLChoiceSet.h
@@ -35,7 +35,7 @@ typedef NS_ENUM(NSUInteger, SDLChoiceSetLayout) {
@interface SDLChoiceSet: NSObject
/**
- Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See `timeout` for more details. If this is not set by you, it will default to 10 seconds.
+ Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See `timeout` for more details. If this is not set by you, it will default to 10 seconds. The minimum is 5 seconds, the maximum is 100 seconds. If this is set below the minimum, it will be capped at 5 seconds. If this is set above the maximum, it will be capped at 100 seconds.
*/
@property (class, assign, nonatomic) NSTimeInterval defaultTimeout;
@@ -60,7 +60,9 @@ typedef NS_ENUM(NSUInteger, SDLChoiceSetLayout) {
@property (assign, nonatomic) SDLChoiceSetLayout layout;
/**
- Maps to PerformInteraction.timeout. This applies only to a manual selection (not a voice selection, which has its timeout handled by the system). Defaults to `defaultTimeout`.
+ Maps to PerformInteraction.timeout. Timeout in seconds. Defaults to 0, which will use `defaultTimeout`. If this is set below the minimum, it will be capped at 5 seconds. Minimum 5 seconds, maximum 100 seconds. If this is set above the maximum, it will be capped at 100 seconds. Defaults to 0.
+
+ @note This applies only to a manual selection (not a voice selection, which has its timeout handled by the system).
*/
@property (assign, nonatomic) NSTimeInterval timeout;
@@ -93,9 +95,20 @@ typedef NS_ENUM(NSUInteger, SDLChoiceSetLayout) {
*/
@property (copy, nonatomic) NSArray<SDLChoiceCell *> *choices;
+/// Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be `nil`.
+///
+/// WARNING: If you display multiple cells with the same `text` with the only uniquing property between cells being different `vrCommands` or a feature that is not displayed on the head unit (e.g. if the head unit doesn't display `secondaryArtwork` and that's the only uniquing property between two cells) then the cells may appear to be the same to the user in `Manual` mode. This only applies to RPC connections >= 7.1.0.
+///
+/// WARNING: On < 7.1.0 connections, the `text` cell will be automatically modified among cells that have the same `text` when they are preloaded, so they will always appear differently on-screen when they are displayed. `cell.uniqueText` will be created by appending ` (2)`, ` (3)`, etc.
+- (instancetype)init;
+
/**
Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be `nil`.
+ WARNING: If you display multiple cells with the same `text` with the only uniquing property between cells being different `vrCommands` or a feature that is not displayed on the head unit (e.g. if the head unit doesn't display `secondaryArtwork` and that's the only uniquing property between two cells) then the cells may appear to be the same to the user in `Manual` mode. This only applies to RPC connections >= 7.1.0.
+
+ WARNING: On < 7.1.0 connections, the `text` cell will be automatically modified among cells that have the same `text` when they are preloaded, so they will always appear differently on-screen when they are displayed. `cell.uniqueText` will be created by appending ` (2)`, ` (3)`, etc.
+
@param title The choice set's title
@param delegate The choice set delegate called after the user has interacted with your choice set
@param choices The choices to be displayed to the user for interaction
@@ -106,10 +119,14 @@ typedef NS_ENUM(NSUInteger, SDLChoiceSetLayout) {
/**
Initializer with all possible properties.
+ WARNING: If you display multiple cells with the same `text` with the only uniquing property between cells being different `vrCommands` or a feature that is not displayed on the head unit (e.g. if the head unit doesn't display `secondaryArtwork` and that's the only uniquing property between two cells) then the cells may appear to be the same to the user in `Manual` mode. This only applies to RPC connections >= 7.1.0.
+
+ WARNING: On < 7.1.0 connections, the `text` cell will be automatically modified among cells that have the same `text` when they are preloaded, so they will always appear differently on-screen when they are displayed. `cell.uniqueText` will be created by appending ` (2)`, ` (3)`, etc.
+
@param title The choice set's title
@param delegate The choice set delegate called after the user has interacted with your choice set
@param layout The layout of choice options (Manual/touch only)
- @param timeout The timeout of a touch interaction (Manual/touch only)
+ @param timeout The timeout of a touch interaction in seconds (Manual/touch only)
@param initialPrompt A voice prompt spoken to the user when this set is displayed
@param timeoutPrompt A voice prompt spoken to the user when the set times out (Voice only)
@param helpPrompt A voice prompt spoken to the user when the user asks for "help"
@@ -122,10 +139,14 @@ typedef NS_ENUM(NSUInteger, SDLChoiceSetLayout) {
/**
Initializer with all possible properties.
+ WARNING: If you display multiple cells with the same `text` with the only uniquing property between cells being different `vrCommands` or a feature that is not displayed on the head unit (e.g. if the head unit doesn't display `secondaryArtwork` and that's the only uniquing property between two cells) then the cells may appear to be the same to the user in `Manual` mode. This only applies to RPC connections >= 7.1.0.
+
+ WARNING: On < 7.1.0 connections, the `text` cell will be automatically modified among cells that have the same `text` when they are preloaded, so they will always appear differently on-screen when they are displayed. `cell.uniqueText` will be created by appending ` (2)`, ` (3)`, etc.
+
@param title The choice set's title
@param delegate The choice set delegate called after the user has interacted with your choice set
@param layout The layout of choice options (Manual/touch only)
- @param timeout The timeout of a touch interaction (Manual/touch only)
+ @param timeout The timeout of a touch interaction in seconds (Manual/touch only)
@param initialPrompt A voice prompt spoken to the user when this set is displayed
@param timeoutPrompt A voice prompt spoken to the user when the set times out (Voice only)
@param helpPrompt A voice prompt spoken to the user when the user asks for "help"
@@ -135,7 +156,6 @@ typedef NS_ENUM(NSUInteger, SDLChoiceSetLayout) {
*/
- (instancetype)initWithTitle:(NSString *)title delegate:(id<SDLChoiceSetDelegate>)delegate layout:(SDLChoiceSetLayout)layout timeout:(NSTimeInterval)timeout initialPrompt:(nullable NSArray<SDLTTSChunk *> *)initialPrompt timeoutPrompt:(nullable NSArray<SDLTTSChunk *> *)timeoutPrompt helpPrompt:(nullable NSArray<SDLTTSChunk *> *)helpPrompt vrHelpList:(nullable NSArray<SDLVRHelpItem *> *)helpList choices:(NSArray<SDLChoiceCell *> *)choices;
-
/**
Cancels the choice set. If the choice set has not yet been sent to Core, it will not be sent. If the choice set is already presented on Core, the choice set will be immediately dismissed. Canceling an already presented choice set will only work if connected to Core versions 6.0+. On older versions of Core, the choice set will not be dismissed.
*/
diff --git a/SmartDeviceLink/public/SDLChoiceSet.m b/SmartDeviceLink/public/SDLChoiceSet.m
index 45a830bcd..8baf085a6 100644
--- a/SmartDeviceLink/public/SDLChoiceSet.m
+++ b/SmartDeviceLink/public/SDLChoiceSet.m
@@ -12,6 +12,8 @@
#import "SDLLogMacros.h"
#import "SDLTTSChunk.h"
#import "SDLVrHelpItem.h"
+#import "SDLVersion.h"
+#import "SDLGlobals.h"
NS_ASSUME_NONNULL_BEGIN
@@ -23,6 +25,9 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLChoiceSet
+static const float TimeoutDefault = 0.0;
+static const float TimeoutMinCap = 5.0;
+static const float TimeoutMaxCap = 100.0;
static NSTimeInterval _defaultTimeout = 10.0;
static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
@@ -30,7 +35,7 @@ static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
self = [super init];
if (!self) { return nil; }
- _timeout = self.class.defaultTimeout;
+ _timeout = TimeoutDefault;
_layout = self.class.defaultLayout;
return self;
@@ -57,42 +62,12 @@ static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
return nil;
}
- if (timeout < 5 || timeout > 100) {
- SDLLogW(@"Attempted to create a choice set with a %f second timeout; Only 5 - 100 seconds is valid", timeout);
- return nil;
- }
-
if (title.length == 0 || title.length > 500) {
SDLLogW(@"Attempted to create a choice set title with a %lu length. Only 500 characters are supported", (unsigned long)title.length);
return nil;
}
- NSMutableSet<NSString *> *choiceTextSet = [NSMutableSet setWithCapacity:choices.count];
- NSMutableSet<NSString *> *uniqueVoiceCommands = [NSMutableSet set];
- NSUInteger allVoiceCommandsCount = 0;
- NSUInteger choiceCellWithVoiceCommandCount = 0;
- for (SDLChoiceCell *cell in choices) {
- [choiceTextSet addObject:cell.text];
- if (cell.voiceCommands == nil) { continue; }
- [uniqueVoiceCommands addObjectsFromArray:cell.voiceCommands];
- choiceCellWithVoiceCommandCount += 1;
- allVoiceCommandsCount += cell.voiceCommands.count;
- }
- if (choiceTextSet.count < choices.count) {
- SDLLogE(@"Attempted to create a choice set with duplicate cell text. Cell text must be unique. The choice set will not be set.");
- return nil;
- }
-
- // All or none of the choices must have VR commands
- if ((choiceCellWithVoiceCommandCount > 0 && choiceCellWithVoiceCommandCount < choices.count)) {
- SDLLogE(@"If using voice recognition commands, all of the choice set cells must have unique VR commands. There are %lu cells with unique voice commands and %lu total cells. The choice set will not be set.", (unsigned long)choiceCellWithVoiceCommandCount, (unsigned long)choices.count);
- return nil;
- }
- // All the VR commands must be unique
- if (uniqueVoiceCommands.count < allVoiceCommandsCount) {
- SDLLogE(@"If using voice recognition commands, all VR commands must be unique. There are %lu unique VR commands and %lu VR commands. The choice set will not be set.", (unsigned long)uniqueVoiceCommands.count, (unsigned long)allVoiceCommandsCount);
- return nil;
- }
+ if (![self sdl_choiceCellsAreUnique:choices]) { return nil; }
for (NSUInteger i = 0; i < helpList.count; i++) {
helpList[i].position = @(i + 1);
@@ -101,7 +76,7 @@ static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
_title = title;
_delegate = delegate;
_layout = layout;
- _timeout = timeout;
+ self.timeout = timeout;
_initialPrompt = initialPrompt;
_timeoutPrompt = timeoutPrompt;
_helpPrompt = helpPrompt;
@@ -120,12 +95,30 @@ static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
#pragma mark - Getters / Setters
++ (void)setDefaultTimeout:(NSTimeInterval)defaultTimeout {
+ _defaultTimeout = defaultTimeout;
+}
+
+ (NSTimeInterval)defaultTimeout {
+ if (_defaultTimeout < TimeoutMinCap) {
+ return TimeoutMinCap;
+ } else if (_defaultTimeout > TimeoutMaxCap) {
+ return TimeoutMaxCap;
+ }
+
return _defaultTimeout;
}
-+ (void)setDefaultTimeout:(NSTimeInterval)defaultTimeout {
- _defaultTimeout = defaultTimeout;
+- (NSTimeInterval)timeout {
+ if (_timeout == TimeoutDefault) {
+ return SDLChoiceSet.defaultTimeout;
+ } else if (_timeout < TimeoutMinCap) {
+ return TimeoutMinCap;
+ } else if (_timeout > TimeoutMaxCap) {
+ return TimeoutMaxCap;
+ }
+
+ return _timeout;
}
+ (SDLChoiceSetLayout)defaultLayout {
@@ -144,6 +137,40 @@ static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
}
}
+#pragma mark - Helpers
+
+/**
+ Check for duplicate choices and voiceCommands
+
+ @param choices The choices you will be adding
+ @return Boolean that indicates whether choices and voice commands are unique or not
+ */
+-(BOOL)sdl_choiceCellsAreUnique:(NSArray<SDLChoiceCell *> *)choices {
+ NSMutableSet<SDLChoiceCell *> *identicalCellsCheckSet = [NSMutableSet setWithCapacity:choices.count];
+ NSMutableSet<NSString *> *identicalVoiceCommandsCheckSet = [NSMutableSet set];
+ NSUInteger allVoiceCommandsCount = 0;
+ for (SDLChoiceCell *cell in choices) {
+ [identicalCellsCheckSet addObject:cell];
+
+ if (cell.voiceCommands == nil) { continue; }
+ [identicalVoiceCommandsCheckSet addObjectsFromArray:cell.voiceCommands];
+ allVoiceCommandsCount += cell.voiceCommands.count;
+ }
+
+ if (identicalCellsCheckSet.count < choices.count) {
+ SDLLogE(@"Attempted to create a choice set with duplicate cells. At least one property must be different between any two cells. The choice set will not be set.");
+ return NO;
+ }
+
+ // All the VR commands must be unique
+ if (identicalVoiceCommandsCheckSet.count < allVoiceCommandsCount) {
+ SDLLogE(@"Attempted to create a choice set where the cells contained duplicate voice commands. All VR commands must be unique. There are %lu unique VR commands and %lu VR commands. The choice set will not be set.", (unsigned long)identicalVoiceCommandsCheckSet.count, (unsigned long)allVoiceCommandsCount);
+ return NO;
+ }
+
+ return YES;
+}
+
#pragma mark - Etc.
- (NSString *)description {
diff --git a/SmartDeviceLink/public/SDLChoiceSetDelegate.h b/SmartDeviceLink/public/SDLChoiceSetDelegate.h
index de7573e95..68ab4d31e 100644
--- a/SmartDeviceLink/public/SDLChoiceSetDelegate.h
+++ b/SmartDeviceLink/public/SDLChoiceSetDelegate.h
@@ -15,7 +15,7 @@
NS_ASSUME_NONNULL_BEGIN
-/// Delegate for the the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.
+/// Delegate for the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.
@protocol SDLChoiceSetDelegate <NSObject>
/// Delegate method called after a choice set item is selected
diff --git a/SmartDeviceLink/public/SDLClimateControlCapabilities.h b/SmartDeviceLink/public/SDLClimateControlCapabilities.h
index a0eb2a690..bd5e35e10 100644
--- a/SmartDeviceLink/public/SDLClimateControlCapabilities.h
+++ b/SmartDeviceLink/public/SDLClimateControlCapabilities.h
@@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
*/
@interface SDLClimateControlCapabilities : SDLRPCStruct
-/// Convenience init to describe the climate control capabilities with all properities.
+/// Convenience init to describe the climate control capabilities with all properties.
///
/// @param moduleName The short friendly name of the climate control module.
/// @param moduleInfo Information about a RC module, including its id
diff --git a/SmartDeviceLink/public/SDLClimateData.h b/SmartDeviceLink/public/SDLClimateData.h
new file mode 100644
index 000000000..bb060e65e
--- /dev/null
+++ b/SmartDeviceLink/public/SDLClimateData.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCStruct.h"
+
+@class SDLTemperature;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLClimateData : SDLRPCStruct
+
+/**
+ * @param externalTemperature - externalTemperature
+ * @param cabinTemperature - cabinTemperature
+ * @param atmosphericPressure - atmosphericPressure
+ * @return A SDLClimateData object
+ */
+- (instancetype)initWithExternalTemperature:(nullable SDLTemperature *)externalTemperature cabinTemperature:(nullable SDLTemperature *)cabinTemperature atmosphericPressure:(nullable NSNumber<SDLFloat> *)atmosphericPressure;
+
+/**
+ * The external temperature in degrees celsius
+ */
+@property (nullable, strong, nonatomic) SDLTemperature *externalTemperature;
+
+/**
+ * Internal ambient cabin temperature in degrees celsius
+ */
+@property (nullable, strong, nonatomic) SDLTemperature *cabinTemperature;
+
+/**
+ * Current atmospheric pressure in mBar
+ * {"num_min_value": 0.0, "num_max_value": 2000.0}
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *atmosphericPressure;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/public/SDLClimateData.m b/SmartDeviceLink/public/SDLClimateData.m
new file mode 100644
index 000000000..990370333
--- /dev/null
+++ b/SmartDeviceLink/public/SDLClimateData.m
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLClimateData.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLTemperature.h"
+
+NS_ASSUME_NONNULL_BEGIN
+@implementation SDLClimateData
+
+- (instancetype)initWithExternalTemperature:(nullable SDLTemperature *)externalTemperature cabinTemperature:(nullable SDLTemperature *)cabinTemperature atmosphericPressure:(nullable NSNumber<SDLFloat> *)atmosphericPressure {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.externalTemperature = externalTemperature;
+ self.cabinTemperature = cabinTemperature;
+ self.atmosphericPressure = atmosphericPressure;
+ return self;
+}
+
+- (void)setExternalTemperature:(nullable SDLTemperature *)externalTemperature {
+ [self.store sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
+}
+
+- (nullable SDLTemperature *)externalTemperature {
+ return [self.store sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:SDLTemperature.class error:nil];
+}
+
+- (void)setCabinTemperature:(nullable SDLTemperature *)cabinTemperature {
+ [self.store sdl_setObject:cabinTemperature forName:SDLRPCParameterNameCabinTemperature];
+}
+
+- (nullable SDLTemperature *)cabinTemperature {
+ return [self.store sdl_objectForName:SDLRPCParameterNameCabinTemperature ofClass:SDLTemperature.class error:nil];
+}
+
+- (void)setAtmosphericPressure:(nullable NSNumber<SDLFloat> *)atmosphericPressure {
+ [self.store sdl_setObject:atmosphericPressure forName:SDLRPCParameterNameAtmosphericPressure];
+}
+
+- (nullable NSNumber<SDLFloat> *)atmosphericPressure {
+ return [self.store sdl_objectForName:SDLRPCParameterNameAtmosphericPressure ofClass:NSNumber.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLConfiguration.h b/SmartDeviceLink/public/SDLConfiguration.h
index 063c8c87a..a052549cd 100644
--- a/SmartDeviceLink/public/SDLConfiguration.h
+++ b/SmartDeviceLink/public/SDLConfiguration.h
@@ -17,7 +17,7 @@
NS_ASSUME_NONNULL_BEGIN
-/// Contains information about the app's configurtion, such as lifecycle, lockscreen, encryption, etc.
+/// Contains information about the app's configuration, such as lifecycle, lockscreen, encryption, etc.
@interface SDLConfiguration : NSObject <NSCopying>
/**
diff --git a/SmartDeviceLink/public/SDLDisplayCapabilities.h b/SmartDeviceLink/public/SDLDisplayCapabilities.h
index b5644379f..42fa9723c 100644
--- a/SmartDeviceLink/public/SDLDisplayCapabilities.h
+++ b/SmartDeviceLink/public/SDLDisplayCapabilities.h
@@ -17,7 +17,7 @@
*/
NS_ASSUME_NONNULL_BEGIN
-
+__deprecated_msg("Use SDLSystemCapabilityManager.defaultMainWindowCapability instead")
@interface SDLDisplayCapabilities : SDLRPCStruct
/**
diff --git a/SmartDeviceLink/public/SDLDisplayCapabilities.m b/SmartDeviceLink/public/SDLDisplayCapabilities.m
index b85208a83..78534d9a2 100644
--- a/SmartDeviceLink/public/SDLDisplayCapabilities.m
+++ b/SmartDeviceLink/public/SDLDisplayCapabilities.m
@@ -11,6 +11,8 @@
NS_ASSUME_NONNULL_BEGIN
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-implementations"
@implementation SDLDisplayCapabilities
- (void)setDisplayType:(SDLDisplayType)displayType {
@@ -90,5 +92,6 @@ NS_ASSUME_NONNULL_BEGIN
}
@end
+#pragma clang diagnostic pop
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLDisplayCapability.h b/SmartDeviceLink/public/SDLDisplayCapability.h
index b021a6a10..3dfd58228 100644
--- a/SmartDeviceLink/public/SDLDisplayCapability.h
+++ b/SmartDeviceLink/public/SDLDisplayCapability.h
@@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithDisplayName:(NSString *)displayName;
/**
- Init with all the properities
+ Init with all the properties
@param displayName Name of the display.
@param windowCapabilities Contains a list of capabilities of all windows related to the app. @see windowCapabilities
@@ -52,7 +52,7 @@ NS_ASSUME_NONNULL_BEGIN
After registration, only windows with capabilities changed will be included. Following cases will cause only affected windows to be included:
1. App creates a new window. After the window is created, a system capability notification will be sent related only to the created window.
- 2. App sets a new template to the window. The new template changes window capabilties. The notification will reflect those changes to the single window.
+ 2. App sets a new template to the window. The new template changes window capabilities. The notification will reflect those changes to the single window.
Min size 1, Max size 1000
*/
diff --git a/SmartDeviceLink/public/SDLDoorStatus.h b/SmartDeviceLink/public/SDLDoorStatus.h
new file mode 100644
index 000000000..9562a9ebf
--- /dev/null
+++ b/SmartDeviceLink/public/SDLDoorStatus.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLDoorStatusType.h"
+#import "SDLRPCStruct.h"
+
+@class SDLGrid;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Describes the status of a parameter of door.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLDoorStatus : SDLRPCStruct
+
+/**
+ * @param location - location
+ * @param status - status
+ * @return A SDLDoorStatus object
+ */
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status;
+
+@property (strong, nonatomic) SDLGrid *location;
+
+@property (strong, nonatomic) SDLDoorStatusType status;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/public/SDLDoorStatus.m b/SmartDeviceLink/public/SDLDoorStatus.m
new file mode 100644
index 000000000..0c1e6e8ea
--- /dev/null
+++ b/SmartDeviceLink/public/SDLDoorStatus.m
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLDoorStatus.h"
+#import "SDLDoorStatusType.h"
+#import "SDLGrid.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLDoorStatus
+
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.location = location;
+ self.status = status;
+ return self;
+}
+
+- (void)setLocation:(SDLGrid *)location {
+ [self.store sdl_setObject:location forName:SDLRPCParameterNameLocation];
+}
+
+- (SDLGrid *)location {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameLocation ofClass:SDLGrid.class error:&error];
+}
+
+- (void)setStatus:(SDLDoorStatusType)status {
+ [self.store sdl_setObject:status forName:SDLRPCParameterNameStatus];
+}
+
+- (SDLDoorStatusType)status {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameStatus error:&error];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLDoorStatusType.h b/SmartDeviceLink/public/SDLDoorStatusType.h
new file mode 100644
index 000000000..b4e399bfc
--- /dev/null
+++ b/SmartDeviceLink/public/SDLDoorStatusType.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLEnum.h"
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+typedef SDLEnum SDLDoorStatusType NS_TYPED_ENUM;
+
+extern SDLDoorStatusType const SDLDoorStatusTypeClosed;
+
+extern SDLDoorStatusType const SDLDoorStatusTypeLocked;
+
+extern SDLDoorStatusType const SDLDoorStatusTypeAjar;
+
+extern SDLDoorStatusType const SDLDoorStatusTypeRemoved;
diff --git a/SmartDeviceLink/public/SDLDoorStatusType.m b/SmartDeviceLink/public/SDLDoorStatusType.m
new file mode 100644
index 000000000..77e523426
--- /dev/null
+++ b/SmartDeviceLink/public/SDLDoorStatusType.m
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLDoorStatusType.h"
+
+SDLDoorStatusType const SDLDoorStatusTypeClosed = @"CLOSED";
+SDLDoorStatusType const SDLDoorStatusTypeLocked = @"LOCKED";
+SDLDoorStatusType const SDLDoorStatusTypeAjar = @"AJAR";
+SDLDoorStatusType const SDLDoorStatusTypeRemoved = @"REMOVED";
+
diff --git a/SmartDeviceLink/public/SDLErrorConstants.h b/SmartDeviceLink/public/SDLErrorConstants.h
index ea594ceff..da4757ec1 100644
--- a/SmartDeviceLink/public/SDLErrorConstants.h
+++ b/SmartDeviceLink/public/SDLErrorConstants.h
@@ -22,6 +22,9 @@ extern SDLErrorDomain *const SDLErrorDomainCacheFileManager;
/// An error in the SDLChoiceSetManager subset of SDLScreenManager
extern SDLErrorDomain *const SDLErrorDomainChoiceSetManager;
+/// An error in the SDLAlertManager subset of SDLScreenManager
+extern SDLErrorDomain *const SDLErrorDomainAlertManager;
+
/// An error in the SDLEncryptionLifecycleManager private class
extern SDLErrorDomain *const SDLErrorDomainEncryptionLifecycleManager;
@@ -182,14 +185,15 @@ typedef NS_ENUM(NSInteger, SDLSubscribeButtonManagerError) {
};
/**
- Errors associated with the ScreenManager class
+ Errors associated with the Menu Manager class
*/
typedef NS_ENUM(NSInteger, SDLMenuManagerError) {
/// Sending menu-related RPCs returned an error from the remote system
- SDLMenuManagerErrorRPCsFailed = -1
+ SDLMenuManagerErrorRPCsFailed = -1,
+ SDLMenuManagerErrorPendingUpdateSuperseded = -2
};
-/// Errors associated with Choice Set class
+/// Errors associated with Choice Set Manager class
typedef NS_ENUM(NSInteger, SDLChoiceSetManagerError) {
/// The choice set has been deleted before it was presented
SDLChoiceSetManagerErrorPendingPresentationDeleted = -1,
@@ -207,12 +211,21 @@ typedef NS_ENUM(NSInteger, SDLChoiceSetManagerError) {
SDLChoiceSetManagerErrorInvalidState = -5
};
+/// Errors associated with Alert Manager class
+typedef NS_ENUM(NSInteger, SDLAlertManagerError) {
+ /// There was an error presenting the alert
+ SDLAlertManagerPresentationError = -1,
+
+ /// The alert data is invalid
+ SDLAlertManagerInvalidDataError = -2,
+};
+
/// Errors associated with the system capability manager
typedef NS_ENUM(NSInteger, SDLSystemCapabilityManagerError) {
/// The connected head unit does not support any system capabilities
SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities = -1,
- /// You must be in an HMI Level other than NONE to request or subscribe to capabilites other than DISPLAYS
+ /// You must be in an HMI Level other than NONE to request or subscribe to capabilities other than DISPLAYS
SDLSystemCapabilityManagerErrorHMINone = -2,
/// You may not update the system capability type DISPLAYS because it is always subscribed
diff --git a/SmartDeviceLink/public/SDLErrorConstants.m b/SmartDeviceLink/public/SDLErrorConstants.m
index 75ae0a7a3..ccfc62472 100644
--- a/SmartDeviceLink/public/SDLErrorConstants.m
+++ b/SmartDeviceLink/public/SDLErrorConstants.m
@@ -13,6 +13,7 @@
SDLErrorDomain *const SDLErrorDomainAudioStreamManager = @"com.sdl.extension.pcmAudioStreamManager";
SDLErrorDomain *const SDLErrorDomainCacheFileManager = @"com.sdl.cachefilemanager.error";
SDLErrorDomain *const SDLErrorDomainChoiceSetManager = @"com.sdl.choicesetmanager.error";
+SDLErrorDomain *const SDLErrorDomainAlertManager = @"com.sdl.alertmanager.error";
SDLErrorDomain *const SDLErrorDomainEncryptionLifecycleManager = @"com.sdl.encryptionlifecyclemanager.error";
SDLErrorDomain *const SDLErrorDomainFileManager = @"com.sdl.filemanager.error";
SDLErrorDomain *const SDLErrorDomainLifecycleManager = @"com.sdl.lifecyclemanager.error";
diff --git a/SmartDeviceLink/public/SDLFile.m b/SmartDeviceLink/public/SDLFile.m
index 1efe7454b..b3efaf200 100644
--- a/SmartDeviceLink/public/SDLFile.m
+++ b/SmartDeviceLink/public/SDLFile.m
@@ -167,7 +167,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - NSObject overrides
- (NSString *)description {
- return [NSString stringWithFormat:@"SDLFile: %@", self.name];
+ return [NSString stringWithFormat:@"SDLFile: %@, isPersistent: %@, should overwrite: %@, is static icon: %@, file type: %@", self.name, (self.isPersistent ? @"YES" : @"NO"), (self.overwrite ? @"YES" : @"NO"), (self.isStaticIcon ? @"YES" : @"NO"), self.fileType];
}
- (NSUInteger)hash {
diff --git a/SmartDeviceLink/public/SDLFileManager.h b/SmartDeviceLink/public/SDLFileManager.h
index 24b589a2a..4d0ce1ed5 100644
--- a/SmartDeviceLink/public/SDLFileManager.h
+++ b/SmartDeviceLink/public/SDLFileManager.h
@@ -129,7 +129,7 @@ typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__
- (void)uploadFiles:(NSArray<SDLFile *> *)files progressHandler:(nullable SDLFileManagerMultiUploadProgressHandler)progressHandler completionHandler:(nullable SDLFileManagerMultiUploadCompletionHandler)completionHandler NS_SWIFT_NAME(upload(files:progressHandler:completionHandler:));
/**
- * Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.
+ * Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.
*
* @param files An array of SDLFiles to be sent
* @param completionHandler An optional SDLFileManagerMultiUploadCompletionHandler
@@ -137,6 +137,18 @@ typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__
- (void)uploadFiles:(NSArray<SDLFile *> *)files completionHandler:(nullable SDLFileManagerMultiUploadCompletionHandler)completionHandler NS_SWIFT_NAME(upload(files:completionHandler:));
/**
+ * Check if an SDLFile needs to be uploaded to Core or not. This method differs from hasUploadedFile() because it takes the `isStaticIcon` and `overwrite` properties into consideration.
+ *
+ * For example, if the file is static icon, the method always returns false.
+ *
+ * If the file is dynamic, it returns true in one of these situations: 1) the file has the overwrite property set to true, 2) the file hasn't been uploaded to Core before.
+ *
+ * @param file the SDLFile that needs to be checked
+ * @return BOOL that tells whether file needs to be uploaded to Core or not
+ */
+- (BOOL)fileNeedsUpload:(nullable SDLFile *)file;
+
+/**
* Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.
*
* @param artwork A SDLArwork containing an image to be sent
@@ -145,7 +157,7 @@ typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__
- (void)uploadArtwork:(SDLArtwork *)artwork completionHandler:(nullable SDLFileManagerUploadArtworkCompletionHandler)completion NS_SWIFT_NAME(upload(artwork:completionHandler:));
/**
- * Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.
+ * Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.
*
* @param artworks An array of SDLArtworks to be sent
* @param completion An optional SDLFileManagerMultiUploadArtworkCompletionHandler
@@ -153,9 +165,9 @@ typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__
- (void)uploadArtworks:(NSArray<SDLArtwork *> *)artworks completionHandler:(nullable SDLFileManagerMultiUploadArtworkCompletionHandler)completion NS_SWIFT_NAME(upload(artworks:completionHandler:));
/**
- * Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.
+ * Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.
*
- * The optional progress handler can be used to keep track of the upload progress. After each artwork upload, the progress handler returns the artwork name, the upload percentage and an error, if one occured during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.
+ * The optional progress handler can be used to keep track of the upload progress. After each artwork upload, the progress handler returns the artwork name, the upload percentage and an error, if one occurred during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.
*
* @param artworks An array of SDLArtworks to be sent
* @param progressHandler An optional SDLFileManagerMultiUploadArtworkProgressHandler
diff --git a/SmartDeviceLink/public/SDLFileManager.m b/SmartDeviceLink/public/SDLFileManager.m
index 2acafe62b..2bd0bde31 100644
--- a/SmartDeviceLink/public/SDLFileManager.m
+++ b/SmartDeviceLink/public/SDLFileManager.m
@@ -22,6 +22,7 @@
#import "SDLPutFile.h"
#import "SDLStateMachine.h"
#import "SDLUploadFileOperation.h"
+#import "SDLVersion.h"
NS_ASSUME_NONNULL_BEGIN
@@ -284,13 +285,13 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
// HAX: [#827](https://github.com/smartdevicelink/sdl_ios/issues/827) Older versions of Core had a bug where list files would cache incorrectly.
if (file.persistent && [self.remoteFileNames containsObject:file.name]) {
// If it's a persistant file, the bug won't present itself; just check if it's on the remote system
- return true;
+ return YES;
} else if (!file.persistent && [self.remoteFileNames containsObject:file.name] && [self.uploadedEphemeralFileNames containsObject:file.name]) {
// If it's an ephemeral file, the bug will present itself; check that it's a remote file AND that we've uploaded it this session
- return true;
+ return YES;
}
- return false;
+ return NO;
}
- (void)uploadFiles:(NSArray<SDLFile *> *)files completionHandler:(nullable SDLFileManagerMultiUploadCompletionHandler)completionHandler {
@@ -377,9 +378,9 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
return;
}
- // HAX: [#827](https://github.com/smartdevicelink/sdl_ios/issues/827) Older versions of Core had a bug where list files would cache incorrectly. This led to attempted uploads failing due to the system thinking they were already there when they were not.
- if (!file.persistent && ![self hasUploadedFile:file]) {
- file.overwrite = true;
+ // HAX: [#827](https://github.com/smartdevicelink/sdl_ios/issues/827) Older versions of Core had a bug where list files would cache incorrectly. This led to attempted uploads failing due to the system thinking they were already there when they were not. This is only needed if connecting to Core v4.3.1 or less which corresponds to RPC v4.3.1 or less
+ if (!file.persistent && ![self hasUploadedFile:file] && [[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:[SDLVersion versionWithMajor:4 minor:4 patch:0]]) {
+ file.overwrite = YES;
}
// Check our overwrite settings and error out if it would overwrite
@@ -426,6 +427,12 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
#pragma mark Artworks
+- (BOOL)fileNeedsUpload:(nullable SDLFile *)file {
+ if (file == nil || file.isStaticIcon) { return NO; }
+
+ return (file.overwrite || ![self hasUploadedFile:file]);
+}
+
- (void)uploadArtwork:(SDLArtwork *)artwork completionHandler:(nullable SDLFileManagerUploadArtworkCompletionHandler)completion {
__weak typeof(self) weakself = self;
[self uploadFile:artwork completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
diff --git a/SmartDeviceLink/public/SDLFileManagerConstants.h b/SmartDeviceLink/public/SDLFileManagerConstants.h
index d6733f89d..23dedef7b 100644
--- a/SmartDeviceLink/public/SDLFileManagerConstants.h
+++ b/SmartDeviceLink/public/SDLFileManagerConstants.h
@@ -16,11 +16,11 @@ NS_ASSUME_NONNULL_BEGIN
typedef NSString SDLFileName;
/**
- * A completion handler called after a response from Core to a upload request.
+ * A completion handler called after a response from Core to an upload request.
*
* @param success Whether or not the upload was successful
* @param bytesAvailable The amount of space left for files on Core
- * @param error The error that occurred during the request if one occurred, nil if no error occured
+ * @param error The error that occurred during the request if one occurred, nil if no error occurred
*/
typedef void (^SDLFileManagerUploadCompletionHandler)(BOOL success, NSUInteger bytesAvailable, NSError *__nullable error);
@@ -36,7 +36,7 @@ typedef void(^SDLFileManagerMultiUploadCompletionHandler)(NSError *__nullable er
*
* @param fileName The name of the file that received a response from SDL Core
* @param uploadPercentage The percentage of uploaded data. The upload percentage is calculated as the total file size of all attempted file uploads (regardless of the successfulness of the upload) divided by the sum of the data in all the files
- * @param error The error that occurred during the request if one occurred, nil if no error occured
+ * @param error The error that occurred during the request if one occurred, nil if no error occurred
* @return Return NO to cancel any requests that have not yet been sent. Return YES to continue sending requests
*/
typedef BOOL (^SDLFileManagerMultiUploadProgressHandler)(SDLFileName *fileName, float uploadPercentage, NSError *__nullable error);
@@ -46,7 +46,7 @@ typedef BOOL (^SDLFileManagerMultiUploadProgressHandler)(SDLFileName *fileName,
*
* @param success Whether or not the delete was successful
* @param bytesAvailable The amount of space left for files on Core
- * @param error The error that occurred during the request if one occurred, nil if no error occured
+ * @param error The error that occurred during the request if one occurred, nil if no error occurred
*/
typedef void (^SDLFileManagerDeleteCompletionHandler)(BOOL success, NSUInteger bytesAvailable, NSError *__nullable error);
@@ -63,12 +63,12 @@ typedef void(^SDLFileManagerMultiDeleteCompletionHandler)(NSError *__nullable er
* @param success Whether or not the list files request was successful
* @param bytesAvailable The amount of space available for files on Core
* @param fileNames The names of the files stored on SDL Core
- * @param error The error that occurred during the request if one occurred, nil if no error occured
+ * @param error The error that occurred during the request if one occurred, nil if no error occurred
*/
typedef void (^SDLFileManagerListFilesCompletionHandler)(BOOL success, NSUInteger bytesAvailable, NSArray<NSString *> *fileNames, NSError *__nullable error);
/**
- * A completion handler called after a response from Core to a artwork upload request.
+ * A completion handler called after a response from Core to an artwork upload request.
*
* @param success Whether or not the upload was successful
* @param artworkName The unique identifier for the uploaded file.
@@ -90,7 +90,7 @@ typedef void (^SDLFileManagerMultiUploadArtworkCompletionHandler)(NSArray<NSStri
*
* @param artworkName The unique identifier for the uploaded file
* @param uploadPercentage The percentage of uploaded data. The upload percentage is calculated as the total file size of all attempted artwork uploads (regardless of the successfulness of the upload) divided by the sum of the data in all the files
- * @param error The error that occurred during the upload request if one occurred, nil if no error occured
+ * @param error The error that occurred during the upload request if one occurred, nil if no error occurred
*
* @return Return NO to cancel any artworks that have not yet been sent. Return YES to continue sending artworks
*/
diff --git a/SmartDeviceLink/public/SDLFunctionID.m b/SmartDeviceLink/public/SDLFunctionID.m
index aa649a40a..30a34c6b7 100644
--- a/SmartDeviceLink/public/SDLFunctionID.m
+++ b/SmartDeviceLink/public/SDLFunctionID.m
@@ -120,6 +120,7 @@ NS_ASSUME_NONNULL_BEGIN
@32788: SDLRPCFunctionNameOnSubtleAlertPressed,
@32789: SDLRPCFunctionNameOnUpdateFile,
@32790: SDLRPCFunctionNameOnUpdateSubMenu,
+ @32791: SDLRPCFunctionNameOnAppCapabilityUpdated,
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@65536: SDLRPCFunctionNameEncodedSyncPData,
diff --git a/SmartDeviceLink/public/SDLGateStatus.h b/SmartDeviceLink/public/SDLGateStatus.h
new file mode 100644
index 000000000..0aa78a810
--- /dev/null
+++ b/SmartDeviceLink/public/SDLGateStatus.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLDoorStatusType.h"
+#import "SDLRPCStruct.h"
+
+@class SDLGrid;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Describes the status of a parameter of trunk/hood/etc.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLGateStatus : SDLRPCStruct
+
+/**
+ * @param location - location
+ * @param status - status
+ * @return A SDLGateStatus object
+ */
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status;
+
+@property (strong, nonatomic) SDLGrid *location;
+
+@property (strong, nonatomic) SDLDoorStatusType status;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLGateStatus.m b/SmartDeviceLink/public/SDLGateStatus.m
new file mode 100644
index 000000000..f82885f90
--- /dev/null
+++ b/SmartDeviceLink/public/SDLGateStatus.m
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLDoorStatusType.h"
+#import "SDLGateStatus.h"
+#import "SDLGrid.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+@implementation SDLGateStatus
+
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.location = location;
+ self.status = status;
+ return self;
+}
+
+- (void)setLocation:(SDLGrid *)location {
+ [self.store sdl_setObject:location forName:SDLRPCParameterNameLocation];
+}
+
+- (SDLGrid *)location {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameLocation ofClass:SDLGrid.class error:&error];
+}
+
+- (void)setStatus:(SDLDoorStatusType)status {
+ [self.store sdl_setObject:status forName:SDLRPCParameterNameStatus];
+}
+
+- (SDLDoorStatusType)status {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameStatus error:&error];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLGetInteriorVehicleDataConsent.h b/SmartDeviceLink/public/SDLGetInteriorVehicleDataConsent.h
index b3ab2342a..ae2786525 100644
--- a/SmartDeviceLink/public/SDLGetInteriorVehicleDataConsent.h
+++ b/SmartDeviceLink/public/SDLGetInteriorVehicleDataConsent.h
@@ -12,7 +12,7 @@
NS_ASSUME_NONNULL_BEGIN
-/// This RPC allows you to get consent to control a certian module
+/// This RPC allows you to get consent to control a certain module
///
/// @since RPC 6.0
@interface SDLGetInteriorVehicleDataConsent : SDLRPCRequest
diff --git a/SmartDeviceLink/public/SDLGetVehicleData.h b/SmartDeviceLink/public/SDLGetVehicleData.h
index e8c30889c..470cf8ee8 100644
--- a/SmartDeviceLink/public/SDLGetVehicleData.h
+++ b/SmartDeviceLink/public/SDLGetVehicleData.h
@@ -52,7 +52,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param wiperStatus Get wiperStatus data
* @return A SDLGetVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
/**
* Convenience init for getting data for all possible vehicle data items.
@@ -90,7 +90,45 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLGetVehicleData object
*/
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal vin:(nullable NSNumber<SDLBool> *)vin gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus;
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal vin:(nullable NSNumber<SDLBool> *)vin gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+/**
+ * Convenience init for getting data for all possible vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param vin - vin
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModeStatus - clusterModeStatus
+ * @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
+ * @param windowStatus - windowStatus
+ * @param seatOccupancy - seatOccupancy
+ */
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange climateData:(nullable NSNumber<SDLBool> *)climateData turnSignal:(nullable NSNumber<SDLBool> *)turnSignal vin:(nullable NSNumber<SDLBool> *)vin gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey windowStatus:(nullable NSNumber<SDLBool> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy;
/**
* See GearStatus
@@ -135,9 +173,19 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) NSNumber<SDLBool> *instantFuelConsumption;
/**
- * A boolean value. If true, requests External Temperature data.
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *externalTemperature;
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *climateData;
+
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *externalTemperature __deprecated_msg("Use climateData instead on 7.1+ RPC version connections");
/**
* A boolean value. If true, requests the Vehicle Identification Number.
@@ -289,6 +337,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable NSNumber<SDLBool> *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLGetVehicleData.m b/SmartDeviceLink/public/SDLGetVehicleData.m
index abae28008..30d1728c0 100644
--- a/SmartDeviceLink/public/SDLGetVehicleData.m
+++ b/SmartDeviceLink/public/SDLGetVehicleData.m
@@ -24,19 +24,31 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus {
- self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:@(fuelRange) externalTemperature:@(externalTemperature) turnSignal:@(turnSignal) vin:@(vin) gearStatus:nil tirePressure:@(tirePressure) odometer:@(odometer) beltStatus:@(beltStatus) bodyInformation:@(bodyInformation) deviceStatus:@(deviceStatus) driverBraking:@(driverBraking) wiperStatus:@(wiperStatus) headLampStatus:@(headLampStatus) engineTorque:@(engineTorque) accPedalPosition:@(accelerationPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:@(electronicParkBrakeStatus) cloudAppVehicleID:@(cloudAppVehicleID) stabilityControlsStatus:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil windowStatus:nil];
+ self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:@(fuelRange) climateData:nil turnSignal:@(turnSignal) vin:@(vin) gearStatus:nil tirePressure:@(tirePressure) odometer:@(odometer) beltStatus:@(beltStatus) bodyInformation:@(bodyInformation) deviceStatus:@(deviceStatus) driverBraking:@(driverBraking) wiperStatus:@(wiperStatus) headLampStatus:@(headLampStatus) engineTorque:@(engineTorque) accPedalPosition:@(accelerationPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:@(electronicParkBrakeStatus) cloudAppVehicleID:@(cloudAppVehicleID) stabilityControlsStatus:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) windowStatus:nil handsOffSteering:nil seatOccupancy:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.fuelLevel = @(fuelLevel);
self.fuelLevel_State = @(fuelLevelState);
self.prndl = @(prndl);
+ self.externalTemperature = @(externalTemperature);
#pragma clang diagnostic pop
}
return self;
}
- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal vin:(nullable NSNumber<SDLBool> *)vin gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus {
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange climateData:(nullable NSNumber<SDLBool> *)climateData turnSignal:(nullable NSNumber<SDLBool> *)turnSignal vin:(nullable NSNumber<SDLBool> *)vin gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey windowStatus:(nullable NSNumber<SDLBool> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -46,7 +58,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.vin = vin;
self.gearStatus = gearStatus;
@@ -70,8 +82,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -131,6 +144,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil];
}
+- (void)setClimateData:(nullable NSNumber<SDLBool> *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable NSNumber<SDLBool> *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:NSNumber.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -356,6 +377,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:NSNumber.class error:nil];
}
+- (void)setSeatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable NSNumber<SDLBool> *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLGetVehicleDataResponse.h b/SmartDeviceLink/public/SDLGetVehicleDataResponse.h
index 6f24221b4..79d72199f 100644
--- a/SmartDeviceLink/public/SDLGetVehicleDataResponse.h
+++ b/SmartDeviceLink/public/SDLGetVehicleDataResponse.h
@@ -13,6 +13,7 @@
@class SDLAirbagStatus;
@class SDLBeltStatus;
@class SDLBodyInformation;
+@class SDLClimateData;
@class SDLClusterModeStatus;
@class SDLDeviceStatus;
@class SDLECallInfo;
@@ -22,11 +23,11 @@
@class SDLGPSData;
@class SDLHeadLampStatus;
@class SDLMyKey;
+@class SDLSeatOccupancy;
@class SDLStabilityControlsStatus;
@class SDLTireStatus;
@class SDLWindowStatus;
-
/**
* Response to SDLGetVehicleData
*
@@ -73,7 +74,46 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLGetVehicleDataResponse object
*/
-- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus;
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+/**
+ * Convenience init for initializing data for all possible vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param vin - vin
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModeStatus - clusterModeStatus
+ * @param myKey - myKey
+ * @param windowStatus - windowStatus
+ * @param handsOffSteering - handsOffSteering
+ * @param seatOccupancy - seatOccupancy
+ * @return A SDLGetVehicleDataResponse object
+ */
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange climateData:(nullable SDLClimateData *)climateData turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable SDLSeatOccupancy *)seatOccupancy;
/**
* See GearStatus
@@ -120,9 +160,20 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *instantFuelConsumption;
/**
- The external temperature in degrees celsius.
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *externalTemperature;
+@property (nullable, strong, nonatomic) SDLClimateData *climateData;
+
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ * {"num_min_value": -40.0, "num_max_value": 100.0}
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *externalTemperature __deprecated_msg("Use climateData instead on 7.1+ RPC version connections");
/**
The Vehicle Identification Number
@@ -275,6 +326,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable NSObject *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLSeatOccupancy *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLGetVehicleDataResponse.m b/SmartDeviceLink/public/SDLGetVehicleDataResponse.m
index 47f5a66eb..b5fc22261 100644
--- a/SmartDeviceLink/public/SDLGetVehicleDataResponse.m
+++ b/SmartDeviceLink/public/SDLGetVehicleDataResponse.m
@@ -8,6 +8,7 @@
#import "SDLAirbagStatus.h"
#import "SDLBeltStatus.h"
#import "SDLBodyInformation.h"
+#import "SDLClimateData.h"
#import "SDLClusterModeStatus.h"
#import "SDLDeviceStatus.h"
#import "SDLECallInfo.h"
@@ -19,6 +20,7 @@
#import "SDLMyKey.h"
#import "SDLRPCParameterNames.h"
#import "SDLRPCFunctionNames.h"
+#import "SDLSeatOccupancy.h"
#import "SDLStabilityControlsStatus.h"
#import "SDLTireStatus.h"
#import "SDLWindowStatus.h"
@@ -39,6 +41,18 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus {
+
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange climateData:(nullable SDLClimateData *)climateData turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable SDLSeatOccupancy *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -48,7 +62,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.vin = vin;
self.gearStatus = gearStatus;
@@ -72,8 +86,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -142,6 +157,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil];
}
+- (void)setClimateData:(nullable SDLClimateData *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable SDLClimateData *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:SDLClimateData.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -360,6 +383,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSObject.class error:nil];
}
+- (void)setSeatOccupancy:(nullable SDLSeatOccupancy *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable SDLSeatOccupancy *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:SDLSeatOccupancy.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLHapticRect.m b/SmartDeviceLink/public/SDLHapticRect.m
index 6641f528c..c0368f474 100644
--- a/SmartDeviceLink/public/SDLHapticRect.m
+++ b/SmartDeviceLink/public/SDLHapticRect.m
@@ -44,6 +44,10 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameRect ofClass:SDLRectangle.class error:nil];
}
+- (NSString *)description {
+ return [NSString stringWithFormat:@"%@ id:%@, %@", NSStringFromClass(self.class), self.id, self.rect];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLImageField.h b/SmartDeviceLink/public/SDLImageField.h
index 610b1a55c..2caa18cf9 100644
--- a/SmartDeviceLink/public/SDLImageField.h
+++ b/SmartDeviceLink/public/SDLImageField.h
@@ -36,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLImageResolution *imageResolution;
-/// Convenience initalizer for the ImageField RPC struct
+/// Convenience initializer for the ImageField RPC struct
/// @param name The name identifying this image field
/// @param imageTypeSupported The image data types this field supports
/// @param imageResolution The native resolution of this image field
diff --git a/SmartDeviceLink/public/SDLImageFieldName.h b/SmartDeviceLink/public/SDLImageFieldName.h
index 0bac7e2a8..16eefd736 100644
--- a/SmartDeviceLink/public/SDLImageFieldName.h
+++ b/SmartDeviceLink/public/SDLImageFieldName.h
@@ -125,3 +125,17 @@ extern SDLImageFieldName const SDLImageFieldNameSubMenuIcon;
* @since SDL 7.0
*/
extern SDLImageFieldName const SDLImageFieldNameSubtleAlertIcon;
+
+/**
+ * The secondary image field for AddCommand
+ *
+ * @added in SmartDeviceLink 7.0.0
+ */
+extern SDLImageFieldName const SDLImageFieldNameMenuCommandSecondaryImage;
+
+/**
+ * The secondary image field for AddSubMenu
+ *
+ * @added in SmartDeviceLink 7.0.0
+ */
+extern SDLImageFieldName const SDLImageFieldNameMenuSubMenuSecondaryImage;
diff --git a/SmartDeviceLink/public/SDLImageFieldName.m b/SmartDeviceLink/public/SDLImageFieldName.m
index dd195ce82..ecefa251b 100644
--- a/SmartDeviceLink/public/SDLImageFieldName.m
+++ b/SmartDeviceLink/public/SDLImageFieldName.m
@@ -49,3 +49,5 @@ SDLImageFieldName const SDLImageFieldNameShowConstantTBTNextTurnIcon = @"showCon
SDLImageFieldName const SDLImageFieldNameLocationImage = @"locationImage";
SDLImageFieldName const SDLImageFieldNameSubMenuIcon = @"subMenuIcon";
SDLImageFieldName const SDLImageFieldNameSubtleAlertIcon = @"subtleAlertIcon";
+SDLImageFieldName const SDLImageFieldNameMenuCommandSecondaryImage = @"menuCommandSecondaryImage";
+SDLImageFieldName const SDLImageFieldNameMenuSubMenuSecondaryImage = @"menuSubMenuSecondaryImage";
diff --git a/SmartDeviceLink/public/SDLImageResolution.h b/SmartDeviceLink/public/SDLImageResolution.h
index bd9a82ae4..85000b3b3 100644
--- a/SmartDeviceLink/public/SDLImageResolution.h
+++ b/SmartDeviceLink/public/SDLImageResolution.h
@@ -1,7 +1,6 @@
// SDLImageResolution.h
//
-
#import "SDLRPCMessage.h"
NS_ASSUME_NONNULL_BEGIN
@@ -9,7 +8,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
The resolution of an image
*/
-@interface SDLImageResolution : SDLRPCStruct
+@interface SDLImageResolution : SDLRPCStruct <NSCopying>
/**
Resolution width
@@ -25,11 +24,12 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic) NSNumber<SDLInt> *resolutionHeight;
-/// Convenience init with all parameters
-///
-/// @param width Resolution width
-/// @param height Resolution height
-/// @return An SDLImageResolution object
+/**
+ * Convenience init with all parameters
+ * @param width Resolution width
+ * @param height Resolution height
+ * @return An SDLImageResolution object
+ */
- (instancetype)initWithWidth:(uint16_t)width height:(uint16_t)height;
@end
diff --git a/SmartDeviceLink/public/SDLImageResolution.m b/SmartDeviceLink/public/SDLImageResolution.m
index b94e81996..ba48f2eb3 100644
--- a/SmartDeviceLink/public/SDLImageResolution.m
+++ b/SmartDeviceLink/public/SDLImageResolution.m
@@ -2,9 +2,8 @@
//
-#import "SDLImageResolution.h"
-
#import "NSMutableDictionary+Store.h"
+#import "SDLImageResolution.h"
#import "SDLRPCParameterNames.h"
NS_ASSUME_NONNULL_BEGIN
@@ -21,6 +20,14 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)copyWithZone:(nullable NSZone *)zone {
+ typeof(self) aCopy = [[self.class allocWithZone:zone] init];
+ // copy boxed values to keep nil cases if any and avoid outside updates
+ aCopy.resolutionWidth = [self.resolutionWidth copyWithZone:zone];
+ aCopy.resolutionHeight = [self.resolutionHeight copyWithZone:zone];
+ return aCopy;
+}
+
- (void)setResolutionWidth:(NSNumber<SDLInt> *)resolutionWidth {
[self.store sdl_setObject:resolutionWidth forName:SDLRPCParameterNameResolutionWidth];
}
@@ -39,6 +46,22 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameResolutionHeight ofClass:NSNumber.class error:&error];
}
+extern BOOL sdl_isNumberEqual(NSNumber *numberL, NSNumber *numberR);
+
+- (BOOL)isEqual:(id)object {
+ if (!object) {
+ return NO;
+ }
+ if (self == object) {
+ return YES;
+ }
+ if (![object isKindOfClass:self.class]) {
+ return NO;
+ }
+ typeof(self) other = object;
+ return sdl_isNumberEqual(self.resolutionWidth, other.resolutionWidth) && sdl_isNumberEqual(self.resolutionHeight, other.resolutionHeight);
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardCapabilities.h b/SmartDeviceLink/public/SDLKeyboardCapabilities.h
new file mode 100644
index 000000000..9ed4e831e
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardCapabilities.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCStruct.h"
+
+@class SDLKeyboardLayoutCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLKeyboardCapabilities : SDLRPCStruct
+
+/**
+ * @param maskInputCharactersSupported - maskInputCharactersSupported
+ * @param supportedKeyboards - supportedKeyboards
+ * @return A SDLKeyboardCapabilities object
+ */
+- (instancetype)initWithMaskInputCharactersSupported:(nullable NSNumber<SDLBool> *)maskInputCharactersSupported supportedKeyboards:(nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards;
+
+/**
+ * Availability of capability to mask input characters using keyboard. True: Available, False: Not Available
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *maskInputCharactersSupported;
+
+/**
+ * Capabilities of supported keyboard layouts by HMI.
+ * {"array_min_size": 1, "array_max_size": 1000}
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLKeyboardLayoutCapability *> *supportedKeyboards;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardCapabilities.m b/SmartDeviceLink/public/SDLKeyboardCapabilities.m
new file mode 100644
index 000000000..27799f17a
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardCapabilities.m
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLKeyboardCapabilities
+
+- (instancetype)initWithMaskInputCharactersSupported:(nullable NSNumber<SDLBool> *)maskInputCharactersSupported supportedKeyboards:(nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.maskInputCharactersSupported = maskInputCharactersSupported;
+ self.supportedKeyboards = supportedKeyboards;
+ return self;
+}
+
+- (void)setMaskInputCharactersSupported:(nullable NSNumber<SDLBool> *)maskInputCharactersSupported {
+ [self.store sdl_setObject:maskInputCharactersSupported forName:SDLRPCParameterNameMaskInputCharactersSupported];
+}
+
+- (nullable NSNumber<SDLBool> *)maskInputCharactersSupported {
+ return [self.store sdl_objectForName:SDLRPCParameterNameMaskInputCharactersSupported ofClass:NSNumber.class error:nil];
+}
+
+- (void)setSupportedKeyboards:(nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards {
+ [self.store sdl_setObject:supportedKeyboards forName:SDLRPCParameterNameSupportedKeyboards];
+}
+
+- (nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameSupportedKeyboards ofClass:SDLKeyboardLayoutCapability.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardDelegate.h b/SmartDeviceLink/public/SDLKeyboardDelegate.h
index 652066d64..33da49969 100644
--- a/SmartDeviceLink/public/SDLKeyboardDelegate.h
+++ b/SmartDeviceLink/public/SDLKeyboardDelegate.h
@@ -93,6 +93,14 @@ typedef void(^SDLKeyboardCharacterSetCompletionHandler)(NSArray<NSString *> *_Nu
*/
- (void)keyboardDidSendEvent:(SDLKeyboardEvent)event text:(NSString *)currentInputText;
+/**
+ Implement this to be notified of input key mask update (whether or not the user has changed the input to be hidden, like passwords)
+
+ @param isEnabled - YES if the mask is enabled, NO if the mask is disabled
+ @added in SmartDeviceLink 7.1.0
+ */
+- (void)keyboardDidUpdateInputMask:(BOOL)isEnabled;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardEvent.h b/SmartDeviceLink/public/SDLKeyboardEvent.h
index 1ac7b67e4..9e017c8d6 100644
--- a/SmartDeviceLink/public/SDLKeyboardEvent.h
+++ b/SmartDeviceLink/public/SDLKeyboardEvent.h
@@ -37,3 +37,13 @@ extern SDLKeyboardEvent const SDLKeyboardEventAborted;
@since SDL 4.0
*/
extern SDLKeyboardEvent const SDLKeyboardEventVoice;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskEnabled;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskDisabled;
diff --git a/SmartDeviceLink/public/SDLKeyboardEvent.m b/SmartDeviceLink/public/SDLKeyboardEvent.m
index 67f4e60f2..f55ac3597 100644
--- a/SmartDeviceLink/public/SDLKeyboardEvent.m
+++ b/SmartDeviceLink/public/SDLKeyboardEvent.m
@@ -9,3 +9,5 @@ SDLKeyboardEvent const SDLKeyboardEventSubmitted = @"ENTRY_SUBMITTED";
SDLKeyboardEvent const SDLKeyboardEventCancelled = @"ENTRY_CANCELLED";
SDLKeyboardEvent const SDLKeyboardEventAborted = @"ENTRY_ABORTED";
SDLKeyboardEvent const SDLKeyboardEventVoice = @"ENTRY_VOICE";
+SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskEnabled = @"INPUT_KEY_MASK_ENABLED";
+SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskDisabled = @"INPUT_KEY_MASK_DISABLED";
diff --git a/SmartDeviceLink/public/SDLKeyboardInputMask.h b/SmartDeviceLink/public/SDLKeyboardInputMask.h
new file mode 100644
index 000000000..fc16b1756
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardInputMask.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLEnum.h"
+
+/**
+ * Enumeration listing possible input character masking.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+typedef SDLEnum SDLKeyboardInputMask NS_TYPED_ENUM;
+
+extern SDLKeyboardInputMask const SDLKeyboardInputMaskEnableInputKeyMask;
+
+extern SDLKeyboardInputMask const SDLKeyboardInputMaskDisableInputKeyMask;
+
+extern SDLKeyboardInputMask const SDLKeyboardInputMaskUserChoiceInputKeyMask;
diff --git a/SmartDeviceLink/public/SDLKeyboardInputMask.m b/SmartDeviceLink/public/SDLKeyboardInputMask.m
new file mode 100644
index 000000000..e8be72db1
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardInputMask.m
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLKeyboardInputMask.h"
+
+SDLKeyboardInputMask const SDLKeyboardInputMaskEnableInputKeyMask = @"ENABLE_INPUT_KEY_MASK";
+SDLKeyboardInputMask const SDLKeyboardInputMaskDisableInputKeyMask = @"DISABLE_INPUT_KEY_MASK";
+SDLKeyboardInputMask const SDLKeyboardInputMaskUserChoiceInputKeyMask = @"USER_CHOICE_INPUT_KEY_MASK";
diff --git a/SmartDeviceLink/public/SDLKeyboardLayout.h b/SmartDeviceLink/public/SDLKeyboardLayout.h
index 4b4e97550..181836146 100644
--- a/SmartDeviceLink/public/SDLKeyboardLayout.h
+++ b/SmartDeviceLink/public/SDLKeyboardLayout.h
@@ -25,3 +25,8 @@ extern SDLKeyboardLayout const SDLKeyboardLayoutQWERTZ;
AZERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)
*/
extern SDLKeyboardLayout const SDLKeyboardLayoutAZERTY;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLKeyboardLayout const SDLKeyboardLayoutNumeric;
diff --git a/SmartDeviceLink/public/SDLKeyboardLayout.m b/SmartDeviceLink/public/SDLKeyboardLayout.m
index 7fa8e1958..0bc5ecc3b 100644
--- a/SmartDeviceLink/public/SDLKeyboardLayout.m
+++ b/SmartDeviceLink/public/SDLKeyboardLayout.m
@@ -7,3 +7,4 @@
SDLKeyboardLayout const SDLKeyboardLayoutQWERTY = @"QWERTY";
SDLKeyboardLayout const SDLKeyboardLayoutQWERTZ = @"QWERTZ";
SDLKeyboardLayout const SDLKeyboardLayoutAZERTY = @"AZERTY";
+SDLKeyboardLayout const SDLKeyboardLayoutNumeric = @"NUMERIC";
diff --git a/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
new file mode 100644
index 000000000..b78218663
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLKeyboardLayout.h"
+#import "SDLRPCStruct.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Describes the capabilities of a single keyboard layout.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLKeyboardLayoutCapability : SDLRPCStruct
+
+/**
+ * @param keyboardLayout - keyboardLayout
+ * @param numConfigurableKeys - @(numConfigurableKeys)
+ * @return A SDLKeyboardLayoutCapability object
+ */
+- (instancetype)initWithKeyboardLayout:(SDLKeyboardLayout)keyboardLayout numConfigurableKeys:(UInt8)numConfigurableKeys;
+
+@property (strong, nonatomic) SDLKeyboardLayout keyboardLayout;
+
+/**
+ * Number of keys available for special characters, App can customize as per their needs.
+ * {"num_min_value": 0, "num_max_value": 10}
+ */
+@property (strong, nonatomic) NSNumber<SDLUInt> *numConfigurableKeys;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardLayoutCapability.m b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.m
new file mode 100644
index 000000000..57cb9a81c
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.m
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLKeyboardLayout.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLKeyboardLayoutCapability
+
+- (instancetype)initWithKeyboardLayout:(SDLKeyboardLayout)keyboardLayout numConfigurableKeys:(UInt8)numConfigurableKeys {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.keyboardLayout = keyboardLayout;
+ self.numConfigurableKeys = @(numConfigurableKeys);
+ return self;
+}
+
+- (void)setKeyboardLayout:(SDLKeyboardLayout)keyboardLayout {
+ [self.store sdl_setObject:keyboardLayout forName:SDLRPCParameterNameKeyboardLayout];
+}
+
+- (SDLKeyboardLayout)keyboardLayout {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameKeyboardLayout error:&error];
+}
+
+- (void)setNumConfigurableKeys:(NSNumber<SDLUInt> *)numConfigurableKeys {
+ [self.store sdl_setObject:numConfigurableKeys forName:SDLRPCParameterNameNumConfigurableKeys];
+}
+
+- (NSNumber<SDLUInt> *)numConfigurableKeys {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameNumConfigurableKeys ofClass:NSNumber.class error:&error];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardProperties.h b/SmartDeviceLink/public/SDLKeyboardProperties.h
index 5939d398f..55a3ed1b0 100644
--- a/SmartDeviceLink/public/SDLKeyboardProperties.h
+++ b/SmartDeviceLink/public/SDLKeyboardProperties.h
@@ -1,11 +1,11 @@
// SDLKeyboardProperties.h
//
-#import "SDLRPCMessage.h"
-
+#import "SDLKeyboardInputMask.h"
#import "SDLKeyboardLayout.h"
#import "SDLKeypressMode.h"
#import "SDLLanguage.h"
+#import "SDLRPCStruct.h"
NS_ASSUME_NONNULL_BEGIN
@@ -25,7 +25,31 @@ NS_ASSUME_NONNULL_BEGIN
@param autoCompleteList A list of strings to show the user to complete what they are typing.
@return The RPC object
*/
-- (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable SDLKeyboardLayout)layout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteText:(nullable NSString *)autoCompleteText autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList;
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable SDLKeyboardLayout)layout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteText:(nullable NSString *)autoCompleteText autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList __deprecated_msg("Use initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys: instead");
+
+/**
+ * Convenience init with all properties.
+ *
+ * @param language - language
+ * @param keyboardLayout - keyboardLayout
+ * @param keypressMode - keypressMode
+ * @param limitedCharacterList - limitedCharacterList
+ * @param autoCompleteList - autoCompleteList
+ * @return A SDLKeyboardProperties object
+ */
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList __deprecated_msg("Use initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys: instead");
+
+/**
+ * @param language - language
+ * @param keyboardLayout - keyboardLayout
+ * @param keypressMode - keypressMode
+ * @param limitedCharacterList - limitedCharacterList
+ * @param autoCompleteList - autoCompleteList
+ * @param maskInputCharacters - maskInputCharacters
+ * @param customKeys - customKeys
+ * @return A SDLKeyboardProperties object
+ */
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList maskInputCharacters:(nullable SDLKeyboardInputMask)maskInputCharacters customKeys:(nullable NSArray<NSString *> *)customKeys;
/**
The keyboard language
@@ -58,11 +82,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) NSArray<NSString *> *limitedCharacterList;
/**
- Allows an app to prepopulate the text field with a suggested or completed entry as the user types
-
- Optional
+ * Deprecated, use autoCompleteList instead.
+ * {"string_min_length": 1, "string_max_length": 1000}
+ *
+ * @deprecated in SmartDeviceLink 6.0.0
+ * @added in SmartDeviceLink 3.0.0
*/
-@property (nullable, strong, nonatomic) NSString *autoCompleteText;
+@property (nullable, strong, nonatomic) NSString *autoCompleteText __deprecated_msg("Use autoCompleteList instead");
/**
Allows an app to show a list of possible autocomplete suggestions as the user types
@@ -71,6 +97,21 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSArray<NSString *> *autoCompleteList;
+/**
+ * Allows an app to mask entered characters on HMI
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLKeyboardInputMask maskInputCharacters;
+
+/**
+ * Array of special characters to show in customizable keys. If omitted, keyboard will show default special characters
+ * {"array_min_size": 1, "array_max_size": 10, "string_min_length": 1, "string_max_length": 1}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSArray<NSString *> *customKeys;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardProperties.m b/SmartDeviceLink/public/SDLKeyboardProperties.m
index 5f6fa82dd..d57a21c2c 100644
--- a/SmartDeviceLink/public/SDLKeyboardProperties.m
+++ b/SmartDeviceLink/public/SDLKeyboardProperties.m
@@ -11,18 +11,29 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLKeyboardProperties
- (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable SDLKeyboardLayout)layout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteText:(nullable NSString *)autoCompleteText autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList {
+ self = [self initWithLanguage:language keyboardLayout:layout keypressMode:keypressMode limitedCharacterList:limitedCharacterList autoCompleteList:autoCompleteList maskInputCharacters:nil customKeys:nil];
+ if (!self) { return nil; }
+ self.autoCompleteText = autoCompleteText;
+
+ return self;
+}
+
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList {
+ return [self initWithLanguage:language keyboardLayout:keyboardLayout keypressMode:keypressMode limitedCharacterList:limitedCharacterList autoCompleteList:autoCompleteList maskInputCharacters:nil customKeys:nil];
+}
+
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList maskInputCharacters:(nullable SDLKeyboardInputMask)maskInputCharacters customKeys:(nullable NSArray<NSString *> *)customKeys {
self = [self init];
if (!self) {
return nil;
}
-
self.language = language;
- self.keyboardLayout = layout;
+ self.keyboardLayout = keyboardLayout;
self.keypressMode = keypressMode;
- self.limitedCharacterList = [limitedCharacterList mutableCopy];
- self.autoCompleteText = autoCompleteText;
+ self.limitedCharacterList = limitedCharacterList;
self.autoCompleteList = autoCompleteList;
-
+ self.maskInputCharacters = maskInputCharacters;
+ self.customKeys = customKeys;
return self;
}
@@ -74,6 +85,22 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectsForName:SDLRPCParameterNameAutoCompleteList ofClass:NSString.class error:nil];
}
+- (void)setMaskInputCharacters:(nullable SDLKeyboardInputMask)maskInputCharacters {
+ [self.store sdl_setObject:maskInputCharacters forName:SDLRPCParameterNameMaskInputCharacters];
+}
+
+- (nullable SDLKeyboardInputMask)maskInputCharacters {
+ return [self.store sdl_enumForName:SDLRPCParameterNameMaskInputCharacters error:nil];
+}
+
+- (void)setCustomKeys:(nullable NSArray<NSString *> *)customKeys {
+ [self.store sdl_setObject:customKeys forName:SDLRPCParameterNameCustomKeys];
+}
+
+- (nullable NSArray<NSString *> *)customKeys {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameCustomKeys ofClass:NSString.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLLockScreenViewController.h b/SmartDeviceLink/public/SDLLockScreenViewController.h
index acce47b1f..880503f1a 100644
--- a/SmartDeviceLink/public/SDLLockScreenViewController.h
+++ b/SmartDeviceLink/public/SDLLockScreenViewController.h
@@ -32,7 +32,7 @@ typedef void (^SwipeGestureCallbackBlock)(void);
@property (copy, nonatomic, nullable) UIColor *backgroundColor;
/**
- * The locked label string. This will be set by the lock screen manager to inform the user about the dismissable state.
+ * The locked label string. This will be set by the lock screen manager to inform the user about the dismissible state.
*/
@property (copy, nonatomic, nullable) NSString *lockedLabelText;
diff --git a/SmartDeviceLink/public/SDLMaintenanceModeStatus.h b/SmartDeviceLink/public/SDLMaintenanceModeStatus.h
index ffc7b39ea..9f6e47bfe 100644
--- a/SmartDeviceLink/public/SDLMaintenanceModeStatus.h
+++ b/SmartDeviceLink/public/SDLMaintenanceModeStatus.h
@@ -5,7 +5,7 @@
#import "SDLEnum.h"
/**
- * Describes the maintenence mode. Used in nothing.
+ * Describes the maintenance mode. Used in nothing.
*/
typedef SDLEnum SDLMaintenanceModeStatus NS_TYPED_ENUM;
diff --git a/SmartDeviceLink/public/SDLManager.h b/SmartDeviceLink/public/SDLManager.h
index ec0a45877..e1a69e10f 100644
--- a/SmartDeviceLink/public/SDLManager.h
+++ b/SmartDeviceLink/public/SDLManager.h
@@ -203,7 +203,7 @@ typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *message);
* 1. Zero parameters e.g. `- (void)registerAppInterfaceResponse`
* 2. One parameter e.g. `- (void)registerAppInterfaceResponse:(NSNotification *)notification;`
*
- * Note that using this method to get a response instead of the `sendRequest:withResponseHandler:` method of getting a response, you will not be notifed of any `SDLGenericResponse` errors where the head unit doesn't understand the request.
+ * Note that using this method to get a response instead of the `sendRequest:withResponseHandler:` method of getting a response, you will not be notified of any `SDLGenericResponse` errors where the head unit doesn't understand the request.
*
* @param rpcName The name of the RPC request, response, or notification to subscribe to.
* @param observer The object that will have its selector called every time an RPC of the name and type specified is received.
diff --git a/SmartDeviceLink/public/SDLManagerDelegate.h b/SmartDeviceLink/public/SDLManagerDelegate.h
index 2b01af879..485eff74a 100644
--- a/SmartDeviceLink/public/SDLManagerDelegate.h
+++ b/SmartDeviceLink/public/SDLManagerDelegate.h
@@ -13,6 +13,7 @@
#import "SDLSystemContext.h"
#import "SDLLifecycleConfigurationUpdate.h"
#import "SDLLanguage.h"
+#import "SDLSystemInfo.h"
#import "SDLVideoStreamingState.h"
NS_ASSUME_NONNULL_BEGIN
@@ -67,6 +68,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable SDLLifecycleConfigurationUpdate *)managerShouldUpdateLifecycleToLanguage:(SDLLanguage)language hmiLanguage:(SDLLanguage)hmiLanguage;
+/**
+ * A way to determine if this SDL session should continue to be active while connected to the determined system information of the vehicle.
+ * @param systemInfo The system information of the vehicle that this session is currently active on.
+ * @return True if this session should continue, false if the session should end
+ */
+- (BOOL)didReceiveSystemInfo:(SDLSystemInfo *)systemInfo NS_SWIFT_NAME(didReceiveSystemInfo(_:));
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLMenuCell.h b/SmartDeviceLink/public/SDLMenuCell.h
index 403294612..7cedc5ad6 100644
--- a/SmartDeviceLink/public/SDLMenuCell.h
+++ b/SmartDeviceLink/public/SDLMenuCell.h
@@ -56,6 +56,26 @@ typedef void(^SDLMenuCellSelectionHandler)(SDLTriggerSource triggerSource);
@property (strong, nonatomic, readonly, nullable) SDLMenuLayout submenuLayout;
/**
+ Primary text of the cell to be displayed on the module. Used to distinguish cells with the same `title` but other fields are different. This is autogenerated by the screen manager. This will not be used when connected to modules supporting RPC 7.1+ because duplicate titles are supported.
+ */
+@property (strong, nonatomic, readonly) NSString *uniqueTitle;
+
+/**
+ The cell's secondary text to be displayed
+ */
+@property (copy, nonatomic, readonly, nullable) NSString *secondaryText;
+
+/**
+ The cell's tertiary text to be displayed
+ */
+@property (copy, nonatomic, readonly, nullable) NSString *tertiaryText;
+
+/**
+ The cell's secondary icon to be displayed
+ */
+@property (strong, nonatomic, readonly, nullable) SDLArtwork *secondaryArtwork;
+
+/**
Create a menu cell that has no subcells.
@param title The cell's primary text
@@ -64,19 +84,46 @@ typedef void(^SDLMenuCellSelectionHandler)(SDLTriggerSource triggerSource);
@param handler The code that will be run when the menu cell is selected
@return The menu cell
*/
-- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon voiceCommands:(nullable NSArray<NSString *> *)voiceCommands handler:(SDLMenuCellSelectionHandler)handler;
+- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon voiceCommands:(nullable NSArray<NSString *> *)voiceCommands handler:(SDLMenuCellSelectionHandler)handler __deprecated_msg("Use initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler: instead");
/**
Create a menu cell that has subcells and when selected will go into a deeper part of the menu
@param title The cell's primary text
@param icon The cell's image
- @param layout The layout that the subCells will be layed out in if that submenu is entered
+ @param layout The layout that the subCells will be laid out in if that submenu is entered
@param subCells The subcells that will appear when the cell is selected
@return The menu cell
*/
-- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells;
+- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells __deprecated_msg("Use initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells: instead");
+
+/**
+ Create a menu cell that has no subcells.
+
+ @param title The cell's primary text
+ @param secondaryText - secondaryText
+ @param tertiaryText - tertiaryText
+ @param icon The cell's image
+ @param secondaryArtwork - secondaryArtwork
+ @param voiceCommands Voice commands that will activate the menu cell
+ @param handler The code that will be run when the menu cell is selected
+ @return The menu cell
+ */
+- (instancetype)initWithTitle:(NSString *)title secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText icon:(nullable SDLArtwork *)icon secondaryArtwork:(nullable SDLArtwork *)secondaryArtwork voiceCommands:(nullable NSArray<NSString *> *)voiceCommands handler:(SDLMenuCellSelectionHandler)handler;
+/**
+ Create a menu cell that has subcells and when selected will go into a deeper part of the menu
+
+ @param title The cell's primary text
+ @param secondaryText - secondaryText
+ @param tertiaryText - tertiaryText
+ @param icon The cell's image
+ @param secondaryArtwork - secondaryArtwork
+ @param layout The layout that the subCells will be laid out in if that submenu is entered
+ @param subCells The subcells that will appear when the cell is selected
+ @return The menu cell
+ */
+- (instancetype)initWithTitle:(NSString *)title secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText icon:(nullable SDLArtwork *)icon secondaryArtwork:(nullable SDLArtwork *)secondaryArtwork submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells;
@end
diff --git a/SmartDeviceLink/public/SDLMenuCell.m b/SmartDeviceLink/public/SDLMenuCell.m
index 9a06411bc..b9f0a7be4 100644
--- a/SmartDeviceLink/public/SDLMenuCell.m
+++ b/SmartDeviceLink/public/SDLMenuCell.m
@@ -9,6 +9,7 @@
#import "SDLMenuCell.h"
#import "SDLArtwork.h"
+#import "NSArray+Extensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -16,12 +17,21 @@ NS_ASSUME_NONNULL_BEGIN
@property (assign, nonatomic) UInt32 parentCellId;
@property (assign, nonatomic) UInt32 cellId;
+@property (strong, nonatomic, readwrite) NSString *uniqueTitle;
@end
@implementation SDLMenuCell
- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon voiceCommands:(nullable NSArray<NSString *> *)voiceCommands handler:(SDLMenuCellSelectionHandler)handler {
+ return [self initWithTitle:title secondaryText:nil tertiaryText:nil icon:icon secondaryArtwork:nil voiceCommands:voiceCommands handler:handler];
+}
+
+- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells {
+ return [self initWithTitle:title secondaryText:nil tertiaryText:nil icon:icon secondaryArtwork:nil submenuLayout:layout subCells:subCells];
+}
+
+- (instancetype)initWithTitle:(NSString *)title secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText icon:(nullable SDLArtwork *)icon secondaryArtwork:(nullable SDLArtwork *)secondaryArtwork voiceCommands:(nullable NSArray<NSString *> *)voiceCommands handler:(SDLMenuCellSelectionHandler)handler {
self = [super init];
if (!self) { return nil; }
@@ -29,14 +39,20 @@ NS_ASSUME_NONNULL_BEGIN
_icon = icon;
_voiceCommands = voiceCommands;
_handler = handler;
+ _uniqueTitle = title;
_cellId = UINT32_MAX;
_parentCellId = UINT32_MAX;
+ _secondaryText = secondaryText;
+ _tertiaryText = tertiaryText;
+ _secondaryArtwork = secondaryArtwork;
+
return self;
}
-- (instancetype)initWithTitle:(NSString *)title icon:(nullable SDLArtwork *)icon submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells {
+- (instancetype)initWithTitle:(NSString *)title secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText icon:(nullable SDLArtwork *)icon secondaryArtwork:(nullable SDLArtwork *)secondaryArtwork submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells {
+
self = [super init];
if (!self) { return nil; }
@@ -44,30 +60,33 @@ NS_ASSUME_NONNULL_BEGIN
_submenuLayout = layout;
_icon = icon;
_subCells = subCells;
+ _uniqueTitle = title;
_cellId = UINT32_MAX;
_parentCellId = UINT32_MAX;
+ _secondaryText = secondaryText;
+ _tertiaryText = tertiaryText;
+ _secondaryArtwork = secondaryArtwork;
+
return self;
}
- (NSString *)description {
- return [NSString stringWithFormat:@"SDLMenuCell: %u-\"%@\", artworkName: %@, voice commands: %lu, isSubcell: %@, hasSubcells: %@, submenuLayout: %@", (unsigned int)_cellId, _title, _icon.name, (unsigned long)_voiceCommands.count, (_parentCellId != UINT32_MAX ? @"YES" : @"NO"), (_subCells.count > 0 ? @"YES" : @"NO"), _submenuLayout];
+ return [NSString stringWithFormat:@"SDLMenuCell: %u-\"%@\", unique title: %@, artworkName: %@, voice commands: %lu, isSubcell: %@, hasSubcells: %@, submenuLayout: %@", (unsigned int)_cellId, _title, ([_title isEqualToString:_uniqueTitle] ? @"NO" : _uniqueTitle), _icon.name, (unsigned long)_voiceCommands.count, (_parentCellId != UINT32_MAX ? @"YES" : @"NO"), (_subCells.count > 0 ? @"YES" : @"NO"), _submenuLayout];
}
#pragma mark - Object Equality
-NSUInteger const NSUIntBitCell = (CHAR_BIT * sizeof(NSUInteger));
-NSUInteger NSUIntRotateCell(NSUInteger val, NSUInteger howMuch) {
- return ((((NSUInteger)val) << howMuch) | (((NSUInteger)val) >> (NSUIntBitCell - howMuch)));
-}
-
- (NSUInteger)hash {
return NSUIntRotateCell(self.title.hash, NSUIntBitCell / 2)
^ NSUIntRotateCell(self.icon.name.hash, NSUIntBitCell / 3)
- ^ NSUIntRotateCell(self.voiceCommands.hash, NSUIntBitCell / 4)
- ^ NSUIntRotateCell(self.subCells.count !=0, NSUIntBitCell / 5)
- ^ NSUIntRotateCell(self.submenuLayout.hash, NSUIntBitCell / 6);
+ ^ NSUIntRotateCell(self.voiceCommands.dynamicHash, NSUIntBitCell / 4)
+ ^ NSUIntRotateCell((self.subCells.count != 0), NSUIntBitCell / 5)
+ ^ NSUIntRotateCell(self.secondaryText.hash, NSUIntBitCell / 6)
+ ^ NSUIntRotateCell(self.tertiaryText.hash, NSUIntBitCell / 7)
+ ^ NSUIntRotateCell(self.secondaryArtwork.name.hash, NSUIntBitCell / 8)
+ ^ NSUIntRotateCell(self.submenuLayout.hash, NSUIntBitCell / 9);
}
- (BOOL)isEqual:(id)object {
diff --git a/SmartDeviceLink/public/SDLMenuConfiguration.h b/SmartDeviceLink/public/SDLMenuConfiguration.h
index d3614001a..5bdd9bef1 100644
--- a/SmartDeviceLink/public/SDLMenuConfiguration.h
+++ b/SmartDeviceLink/public/SDLMenuConfiguration.h
@@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readonly) SDLMenuLayout defaultSubmenuLayout;
/**
- Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overriden per-submenu if desired.
+ Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overridden per-submenu if desired.
@param mainMenuLayout The new main menu layout
@param defaultSubmenuLayout The new default submenu layout
diff --git a/SmartDeviceLink/public/SDLMenuParams.h b/SmartDeviceLink/public/SDLMenuParams.h
index 89d807f9e..cd4c9aa5e 100644
--- a/SmartDeviceLink/public/SDLMenuParams.h
+++ b/SmartDeviceLink/public/SDLMenuParams.h
@@ -26,7 +26,17 @@ NS_ASSUME_NONNULL_BEGIN
/// @param parentId The unique ID of an existing submenu to which a command will be added
/// @param position The position within the items of the parent Command Menu
/// @return An instance of the add submenu class
-- (instancetype)initWithMenuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position;
+- (instancetype)initWithMenuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position __deprecated_msg("Use initWithMenuName:parentID:position:secondaryText:tertiaryText: instead");
+
+/**
+ * @param menuName - menuName
+ * @param parentID - parentID
+ * @param position - position
+ * @param secondaryText - secondaryText
+ * @param tertiaryText - tertiaryText
+ * @return A SDLMenuParams object
+ */
+- (instancetype)initWithMenuName:(NSString *)menuName parentID:(nullable NSNumber<SDLUInt> *)parentID position:(nullable NSNumber<SDLUInt> *)position secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText;
/**
* The unique ID of an existing submenu to which a command will be added
@@ -59,6 +69,22 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic) NSString *menuName;
+/**
+ * Optional secondary text to display
+ * {"string_min_length": 1, "string_max_length": 500}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSString *secondaryText;
+
+/**
+ * Optional tertiary text to display
+ * {"string_min_length": 1, "string_max_length": 500}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSString *tertiaryText;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLMenuParams.m b/SmartDeviceLink/public/SDLMenuParams.m
index 85cf5880a..9d96781ed 100644
--- a/SmartDeviceLink/public/SDLMenuParams.m
+++ b/SmartDeviceLink/public/SDLMenuParams.m
@@ -12,14 +12,18 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLMenuParams
- (instancetype)initWithMenuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position {
+ return [self initWithMenuName:menuName parentID:@(parentId) position:@(position) secondaryText:nil tertiaryText:nil];
+}
+
+- (instancetype)initWithMenuName:(NSString *)menuName parentID:(nullable NSNumber<SDLUInt> *)parentID position:(nullable NSNumber<SDLUInt> *)position secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText {
self = [self initWithMenuName:menuName];
if (!self) {
return nil;
}
-
- self.parentID = @(parentId);
- self.position = @(position);
-
+ self.parentID = parentID;
+ self.position = position;
+ self.secondaryText = secondaryText;
+ self.tertiaryText = tertiaryText;
return self;
}
@@ -58,6 +62,22 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:nil];
}
+- (void)setSecondaryText:(nullable NSString *)secondaryText {
+ [self.store sdl_setObject:secondaryText forName:SDLRPCParameterNameSecondaryText];
+}
+
+- (nullable NSString *)secondaryText {
+ return [self.store sdl_objectForName:SDLRPCParameterNameSecondaryText ofClass:NSString.class error:nil];
+}
+
+- (void)setTertiaryText:(nullable NSString *)tertiaryText {
+ [self.store sdl_setObject:tertiaryText forName:SDLRPCParameterNameTertiaryText];
+}
+
+- (nullable NSString *)tertiaryText {
+ return [self.store sdl_objectForName:SDLRPCParameterNameTertiaryText ofClass:NSString.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLMsgVersion.m b/SmartDeviceLink/public/SDLMsgVersion.m
index dce291b1b..ee0dc04fa 100644
--- a/SmartDeviceLink/public/SDLMsgVersion.m
+++ b/SmartDeviceLink/public/SDLMsgVersion.m
@@ -52,7 +52,7 @@
}
- (NSString *)description {
- return [NSString stringWithFormat:@"%@.%@.%@", self.majorVersion, self.minorVersion, self.patchVersion];
+ return [NSString stringWithFormat:@"%@.%@.%@", self.majorVersion, self.minorVersion, (self.patchVersion ?: @"0")];
}
@end
diff --git a/SmartDeviceLink/public/SDLOnAppCapabilityUpdated.h b/SmartDeviceLink/public/SDLOnAppCapabilityUpdated.h
new file mode 100644
index 000000000..47c9389ec
--- /dev/null
+++ b/SmartDeviceLink/public/SDLOnAppCapabilityUpdated.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCNotification.h"
+
+@class SDLAppCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * A notification to inform SDL Core that a specific app capability has changed.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLOnAppCapabilityUpdated : SDLRPCNotification
+
+/**
+ * @param appCapability - appCapability
+ * @return A SDLOnAppCapabilityUpdated object
+ */
+- (instancetype)initWithAppCapability:(SDLAppCapability *)appCapability;
+
+/**
+ * The app capability that has been updated
+ */
+@property (strong, nonatomic) SDLAppCapability *appCapability;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/public/SDLOnAppCapabilityUpdated.m b/SmartDeviceLink/public/SDLOnAppCapabilityUpdated.m
new file mode 100644
index 000000000..b89d75b13
--- /dev/null
+++ b/SmartDeviceLink/public/SDLOnAppCapabilityUpdated.m
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLAppCapability.h"
+#import "SDLOnAppCapabilityUpdated.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+@implementation SDLOnAppCapabilityUpdated
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+- (instancetype)init {
+ self = [super initWithName:SDLRPCFunctionNameOnAppCapabilityUpdated];
+ if (!self) {
+ return nil;
+ }
+ return self;
+}
+#pragma clang diagnostic pop
+
+- (instancetype)initWithAppCapability:(SDLAppCapability *)appCapability {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.appCapability = appCapability;
+ return self;
+}
+
+- (void)setAppCapability:(SDLAppCapability *)appCapability {
+ [self.parameters sdl_setObject:appCapability forName:SDLRPCParameterNameAppCapability];
+}
+
+- (SDLAppCapability *)appCapability {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameAppCapability ofClass:SDLAppCapability.class error:&error];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/public/SDLOnHMIStatus.h b/SmartDeviceLink/public/SDLOnHMIStatus.h
index 22a43500a..d8a7d8dd5 100644
--- a/SmartDeviceLink/public/SDLOnHMIStatus.h
+++ b/SmartDeviceLink/public/SDLOnHMIStatus.h
@@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLAudioStreamingState audioStreamingState;
/**
- Current availablility of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.
+ Current availability of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.
*/
@property (strong, nonatomic, nullable) SDLVideoStreamingState videoStreamingState;
@@ -55,7 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param hmiLevel The HMI level
/// @param systemContext The system context
/// @param audioStreamingState The ability for an audio app to be heard
-/// @param videoStreamingState The ability for a video straming app to stream
+/// @param videoStreamingState The ability for a video streaming app to stream
/// @param windowID Which window this status relates to
- (instancetype)initWithHMILevel:(SDLHMILevel)hmiLevel systemContext:(SDLSystemContext)systemContext audioStreamingState:(SDLAudioStreamingState)audioStreamingState videoStreamingState:(nullable SDLVideoStreamingState)videoStreamingState windowID:(nullable NSNumber<SDLUInt> *)windowID;
diff --git a/SmartDeviceLink/public/SDLOnVehicleData.h b/SmartDeviceLink/public/SDLOnVehicleData.h
index 66108cf47..a85d8610f 100644
--- a/SmartDeviceLink/public/SDLOnVehicleData.h
+++ b/SmartDeviceLink/public/SDLOnVehicleData.h
@@ -13,6 +13,7 @@
@class SDLAirbagStatus;
@class SDLBeltStatus;
@class SDLBodyInformation;
+@class SDLClimateData;
@class SDLClusterModeStatus;
@class SDLDeviceStatus;
@class SDLECallInfo;
@@ -22,6 +23,7 @@
@class SDLGPSData;
@class SDLHeadLampStatus;
@class SDLMyKey;
+@class SDLSeatOccupancy;
@class SDLStabilityControlsStatus;
@class SDLTireStatus;
@class SDLWindowStatus;
@@ -73,7 +75,46 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLOnVehicleData object
*/
-- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus;
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+/**
+ * Convenience init for setting all possible values on vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param vin - vin
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModeStatus - clusterModeStatus
+ * @param myKey - myKey
+ * @param windowStatus - windowStatus
+ * @param handsOffSteering - handsOffSteering
+ * @param seatOccupancy - seatOccupancy
+ * @return A SDLOnVehicleData object
+ */
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange climateData:(nullable SDLClimateData *)climateData turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable SDLSeatOccupancy *)seatOccupancy;
/**
* See GearStatus
@@ -120,9 +161,20 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *instantFuelConsumption;
/**
- The external temperature in degrees celsius.
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLClimateData *climateData;
+
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ * {"num_min_value": -40.0, "num_max_value": 100.0}
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *externalTemperature;
+@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *externalTemperature __deprecated_msg("Use climateData instead on 7.1+ RPC version connections");
/**
The Vehicle Identification Number
@@ -275,6 +327,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable NSObject *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLSeatOccupancy *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLOnVehicleData.m b/SmartDeviceLink/public/SDLOnVehicleData.m
index 9e8ebc13b..1df77371e 100644
--- a/SmartDeviceLink/public/SDLOnVehicleData.m
+++ b/SmartDeviceLink/public/SDLOnVehicleData.m
@@ -7,6 +7,7 @@
#import "SDLAirbagStatus.h"
#import "SDLBeltStatus.h"
#import "SDLBodyInformation.h"
+#import "SDLClimateData.h"
#import "SDLClusterModeStatus.h"
#import "SDLDeviceStatus.h"
#import "SDLECallInfo.h"
@@ -18,6 +19,7 @@
#import "SDLMyKey.h"
#import "SDLRPCParameterNames.h"
#import "SDLRPCFunctionNames.h"
+#import "SDLSeatOccupancy.h"
#import "SDLStabilityControlsStatus.h"
#import "SDLTireStatus.h"
#import "SDLWindowStatus.h"
@@ -38,6 +40,17 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus {
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(nullable NSNumber<SDLFloat> *)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(nullable NSNumber<SDLFloat> *)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange climateData:(nullable SDLClimateData *)climateData turnSignal:(nullable SDLTurnSignal)turnSignal vin:(nullable NSString *)vin gearStatus:(nullable SDLGearStatus *)gearStatus tirePressure:(nullable SDLTireStatus *)tirePressure odometer:(nullable NSNumber<SDLUInt> *)odometer beltStatus:(nullable SDLBeltStatus *)beltStatus bodyInformation:(nullable SDLBodyInformation *)bodyInformation deviceStatus:(nullable SDLDeviceStatus *)deviceStatus driverBraking:(nullable SDLVehicleDataEventStatus)driverBraking wiperStatus:(nullable SDLWiperStatus)wiperStatus headLampStatus:(nullable SDLHeadLampStatus *)headLampStatus engineTorque:(nullable NSNumber<SDLFloat> *)engineTorque accPedalPosition:(nullable NSNumber<SDLFloat> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLFloat> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLFloat> *)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLStabilityControlsStatus *)stabilityControlsStatus eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey windowStatus:(nullable NSArray<SDLWindowStatus *> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable SDLSeatOccupancy *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -47,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.vin = vin;
self.gearStatus = gearStatus;
@@ -71,8 +84,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -141,6 +155,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil];
}
+- (void)setClimateData:(nullable SDLClimateData *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable SDLClimateData *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:SDLClimateData.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable NSNumber<SDLFloat> *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -358,6 +380,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSObject.class error:nil];
}
+- (void)setSeatOccupancy:(nullable SDLSeatOccupancy *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable SDLSeatOccupancy *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:SDLSeatOccupancy.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLPermissionManager.h b/SmartDeviceLink/public/SDLPermissionManager.h
index 93107c9ee..a4da887e8 100644
--- a/SmartDeviceLink/public/SDLPermissionManager.h
+++ b/SmartDeviceLink/public/SDLPermissionManager.h
@@ -66,7 +66,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *)statusesOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames;
/**
- * Subscribe to specified RPC names, with a callback that will be called whenever the value changes. Tthe callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.
+ * Subscribe to specified RPC names, with a callback that will be called whenever the value changes. The callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.
*
* @warning The observer may be called before this method returns. Do not attempt to remove the observer from within the observer.
*
diff --git a/SmartDeviceLink/public/SDLPutFile.h b/SmartDeviceLink/public/SDLPutFile.h
index 40a4cc554..cdd2de779 100644
--- a/SmartDeviceLink/public/SDLPutFile.h
+++ b/SmartDeviceLink/public/SDLPutFile.h
@@ -33,7 +33,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType)fileType;
/**
- * Convenience init for creating a putfile with a name, file format, and persistance.
+ * Convenience init for creating a putfile with a name, file format, and persistence.
*
* @param fileName The file's name
* @param fileType The file's format
diff --git a/SmartDeviceLink/public/SDLRPCFunctionNames.h b/SmartDeviceLink/public/SDLRPCFunctionNames.h
index 22384942b..8f30ca746 100644
--- a/SmartDeviceLink/public/SDLRPCFunctionNames.h
+++ b/SmartDeviceLink/public/SDLRPCFunctionNames.h
@@ -97,6 +97,9 @@ extern SDLRPCFunctionName const SDLRPCFunctionNameGetWayPoints;
/// Function name for a ListFiles RPC
extern SDLRPCFunctionName const SDLRPCFunctionNameListFiles;
+/// Function name for an OnAppCapabilityUpdated notification RPC
+extern SDLRPCFunctionName const SDLRPCFunctionNameOnAppCapabilityUpdated;
+
/// Function name for an OnAppInterfaceUnregistered notification RPC
extern SDLRPCFunctionName const SDLRPCFunctionNameOnAppInterfaceUnregistered;
diff --git a/SmartDeviceLink/public/SDLRPCFunctionNames.m b/SmartDeviceLink/public/SDLRPCFunctionNames.m
index a0a0c4754..df164adee 100644
--- a/SmartDeviceLink/public/SDLRPCFunctionNames.m
+++ b/SmartDeviceLink/public/SDLRPCFunctionNames.m
@@ -36,6 +36,7 @@ SDLRPCFunctionName const SDLRPCFunctionNameGetSystemCapability = @"GetSystemCapa
SDLRPCFunctionName const SDLRPCFunctionNameGetVehicleData = @"GetVehicleData";
SDLRPCFunctionName const SDLRPCFunctionNameGetWayPoints = @"GetWayPoints";
SDLRPCFunctionName const SDLRPCFunctionNameListFiles = @"ListFiles";
+SDLRPCFunctionName const SDLRPCFunctionNameOnAppCapabilityUpdated = @"OnAppCapabilityUpdated";
SDLRPCFunctionName const SDLRPCFunctionNameOnAppInterfaceUnregistered = @"OnAppInterfaceUnregistered";
SDLRPCFunctionName const SDLRPCFunctionNameOnAppServiceData = @"OnAppServiceData";
SDLRPCFunctionName const SDLRPCFunctionNameOnAudioPassThru = @"OnAudioPassThru";
diff --git a/SmartDeviceLink/public/SDLRectangle.m b/SmartDeviceLink/public/SDLRectangle.m
index 7e6a8a3c3..34ada8e37 100644
--- a/SmartDeviceLink/public/SDLRectangle.m
+++ b/SmartDeviceLink/public/SDLRectangle.m
@@ -64,4 +64,19 @@
return [self.store sdl_objectForName:SDLRPCParameterNameHeight ofClass:NSNumber.class error:&error];
}
+- (BOOL)isEqual:(id)object {
+ if (!object) {
+ return NO;
+ }
+ if (![object isKindOfClass:self.class]) {
+ return NO;
+ }
+ typeof(self) rect2 = object;
+ return [self.x isEqualToNumber:rect2.x] && [self.y isEqualToNumber:rect2.y] && [self.width isEqualToNumber:rect2.width] && [self.height isEqualToNumber:rect2.height];
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"%@{%@, %@, {%@ x %@}}", NSStringFromClass(self.class), self.x, self.y, self.width, self.height];
+}
+
@end
diff --git a/SmartDeviceLink/public/SDLRegisterAppInterface.h b/SmartDeviceLink/public/SDLRegisterAppInterface.h
index 805411b9a..10cf41dac 100644
--- a/SmartDeviceLink/public/SDLRegisterAppInterface.h
+++ b/SmartDeviceLink/public/SDLRegisterAppInterface.h
@@ -209,7 +209,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* SDLAppInfo, Optional
*
- * @since SDL 2.0
+ * @since SDL 4.2
*/
@property (nullable, strong, nonatomic) SDLAppInfo *appInfo;
diff --git a/SmartDeviceLink/public/SDLRegisterAppInterfaceResponse.h b/SmartDeviceLink/public/SDLRegisterAppInterfaceResponse.h
index 3538e22e3..ea037da92 100644
--- a/SmartDeviceLink/public/SDLRegisterAppInterfaceResponse.h
+++ b/SmartDeviceLink/public/SDLRegisterAppInterfaceResponse.h
@@ -147,13 +147,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) SDLAudioPassThruCapabilities *pcmStreamCapabilities;
/**
- * Specifies the connected vehicle's type.
+ * Specifies the vehicle's type. See VehicleType.
*
- * SDLVehicleType, Optional
+ * @deprecated in SmartDeviceLink 7.1.0
*
- * @since SDL 2.0
+ * @added in SmartDeviceLink 2.0.0
*/
-@property (nullable, strong, nonatomic) SDLVehicleType *vehicleType;
+@property (nullable, strong, nonatomic) SDLVehicleType *vehicleType __deprecated_msg("Implement SDLManager.delegate.didReceiveSystemInfo instead");
/**
* Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.
@@ -184,12 +184,14 @@ NS_ASSUME_NONNULL_BEGIN
/**
* The software version of the system that implements the SmartDeviceLink core.
+ *
+ * {"string_min_length": 1, "string_max_length": 100}
*
- * String, Optional, Max length: 100
+ * @deprecated in SDL 7.1.0
*
- * @since SDL 3.0
+ * @added in SDL 3.0.0
*/
-@property (nullable, strong, nonatomic) NSString *systemSoftwareVersion;
+@property (nullable, strong, nonatomic) NSString *systemSoftwareVersion __deprecated_msg("Implement SDLManager.delegate.didReceiveSystemInfo instead");
/**
* Existence of apps icon at system. If true, apps icon was resumed at system. If false, apps icon is not resumed at system.
diff --git a/SmartDeviceLink/public/SDLRoofStatus.h b/SmartDeviceLink/public/SDLRoofStatus.h
new file mode 100644
index 000000000..e2ec90b07
--- /dev/null
+++ b/SmartDeviceLink/public/SDLRoofStatus.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLDoorStatusType.h"
+#import "SDLRPCStruct.h"
+
+@class SDLGrid;
+@class SDLWindowState;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Describes the status of a parameter of roof/convertible roof/sunroof/moonroof etc. If roof is open (AJAR), state will determine percentage of roof open.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLRoofStatus : SDLRPCStruct
+
+/**
+ * @param location - location
+ * @param status - status
+ * @return A SDLRoofStatus object
+ */
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status;
+
+/**
+ * @param location - location
+ * @param status - status
+ * @param state - state
+ * @return A SDLRoofStatus object
+ */
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status state:(nullable SDLWindowState *)state;
+
+@property (strong, nonatomic) SDLGrid *location;
+
+@property (strong, nonatomic) SDLDoorStatusType status;
+
+@property (nullable, strong, nonatomic) SDLWindowState *state;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLRoofStatus.m b/SmartDeviceLink/public/SDLRoofStatus.m
new file mode 100644
index 000000000..666286575
--- /dev/null
+++ b/SmartDeviceLink/public/SDLRoofStatus.m
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLDoorStatusType.h"
+#import "SDLGrid.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLRoofStatus.h"
+#import "SDLWindowState.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLRoofStatus
+
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.location = location;
+ self.status = status;
+ return self;
+}
+
+- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status state:(nullable SDLWindowState *)state {
+ self = [self initWithLocation:location status:status];
+ if (!self) {
+ return nil;
+ }
+ self.state = state;
+ return self;
+}
+
+- (void)setLocation:(SDLGrid *)location {
+ [self.store sdl_setObject:location forName:SDLRPCParameterNameLocation];
+}
+
+- (SDLGrid *)location {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameLocation ofClass:SDLGrid.class error:&error];
+}
+
+- (void)setStatus:(SDLDoorStatusType)status {
+ [self.store sdl_setObject:status forName:SDLRPCParameterNameStatus];
+}
+
+- (SDLDoorStatusType)status {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameStatus error:&error];
+}
+
+- (void)setState:(nullable SDLWindowState *)state {
+ [self.store sdl_setObject:state forName:SDLRPCParameterNameState];
+}
+
+- (nullable SDLWindowState *)state {
+ return [self.store sdl_objectForName:SDLRPCParameterNameState ofClass:SDLWindowState.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLScreenManager.h b/SmartDeviceLink/public/SDLScreenManager.h
index bd1c9597f..c941eaced 100644
--- a/SmartDeviceLink/public/SDLScreenManager.h
+++ b/SmartDeviceLink/public/SDLScreenManager.h
@@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>
#import "NSNumber+NumberType.h"
+#import "SDLAlertView.h"
#import "SDLButtonName.h"
#import "SDLInteractionMode.h"
#import "SDLMenuManagerConstants.h"
@@ -25,6 +26,7 @@
@class SDLMenuConfiguration;
@class SDLOnButtonEvent;
@class SDLOnButtonPress;
+@class SDLPermissionManager;
@class SDLSoftButtonObject;
@class SDLSystemCapabilityManager;
@class SDLTemplateConfiguration;
@@ -181,6 +183,12 @@ typedef void (^SDLSubscribeButtonHandler)(SDLOnButtonPress *_Nullable buttonPres
/**
The current list of menu cells displayed in the app's menu.
+
+ WARNING: If two or more cells in this array are duplicates – they contain all of the same data – the menu will not be set. Each list of `subCells` and the main menu are compared separately, which means you can have duplicate cells between the main menu and a sub cell list without a conflict occurring.
+
+ WARNING: If two or more cells contain the same `title` but are otherwise distinctive, unique identifiers will be appended in the style (2), (3), (4), etc. to those cells' `title`. The same rules apply to duplicate titles as apply to complete duplicates above: the titles can be duplicates between different array lists without a conflict.
+
+ WARNING: If any two cells contain the same voice command string in their `voiceCommands` list, the menu will not be set. Note that unlike the two warnings above, these lists *are not* checked separately. If you have the same voice command in a cell of the main menu and a sub cell, it will not be set.
*/
@property (copy, nonatomic) NSArray<SDLMenuCell *> *menu;
@@ -189,7 +197,7 @@ Change the mode of the dynamic menu updater to be enabled, disabled, or enabled
The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to `SDLDynamicMenuUpdatesModeForceOn`, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI.
-If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus.
+If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regardless if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus.
We recommend using either `SDLDynamicMenuUpdatesModeOnWithCompatibility` or `SDLDynamicMenuUpdatesModeForceOn`. `SDLDynamicMenuUpdatesModeOnWithCompatibility` turns dynamic updates off for head units that we know have poor compatibility with dynamic updates (e.g. they have bugs that cause menu items to not be placed correctly).
*/
@@ -197,6 +205,8 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
/**
The current list of voice commands available for the user to speak and be recognized by the IVI's voice recognition engine.
+
+ @warning May not be an empty string
*/
@property (copy, nonatomic) NSArray<SDLVoiceCommand *> *voiceCommands;
@@ -220,14 +230,27 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
/**
Initialize a screen manager
+ @warning For internal use. An exception will be thrown if used.
+
+ @param connectionManager The connection manager used to send RPCs
+ @param fileManager The file manager used to upload files
+ @param systemCapabilityManager The system capability manager object for reading window capabilities
+ @return The screen manager
+ */
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager __deprecated_msg("Use initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager: instead");
+
+/**
+ Initialize a screen manager
+
@warning For internal use
@param connectionManager The connection manager used to send RPCs
@param fileManager The file manager used to upload files
@param systemCapabilityManager The system capability manager object for reading window capabilities
+ @param permissionManager The permission manager object for checking RPC permissions
@return The screen manager
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager permissionManager:(SDLPermissionManager *)permissionManager;
/**
Starts the manager and all sub-managers
@@ -402,6 +425,18 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
*/
- (BOOL)openSubmenu:(SDLMenuCell *)cell;
+#pragma mark - Alert
+
+/// Present the alert on the screen. To replace a currently presenting alert with a new alert, you must first call `cancel` on the currently presenting alert before sending the new alert. Otherwise the newest alert will only be presented when the module dismisses the currently presented alert (either due to the timeout or the user selecting a button on the alert). Please note that cancelling a currently presented alert will only work on modules supporting RPC Spec v.5.0+.
+///
+/// If the alert contains an audio indication with a file that needs to be uploaded, it will be uploaded before presenting the alert. If the alert contains soft buttons with images, they will be uploaded before presenting the alert. If the alert contains an icon, that will be uploaded before presenting the alert.
+///
+/// The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The `userInfo` object on the error contais an `error` key with more information about the error. If the alert failed to present, the `userInfo` object will contain a `tryAgainTime` key with information on how long to wait before trying to send another alert. The value for `tryAgainTime` may be `nil` if the module did not return a value in its response.
+///
+/// @param alert Alert to be presented
+/// @param handler The handler to be called when the alert either dismisses from the screen or it has failed to present.
+- (void)presentAlert:(SDLAlertView *)alert withCompletionHandler:(nullable SDLScreenManagerUpdateCompletionHandler)handler;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLScreenManager.m b/SmartDeviceLink/public/SDLScreenManager.m
index a8792e2fa..ea60f9584 100644
--- a/SmartDeviceLink/public/SDLScreenManager.m
+++ b/SmartDeviceLink/public/SDLScreenManager.m
@@ -7,9 +7,12 @@
//
#import "SDLScreenManager.h"
+
+#import "SDLAlertManager.h"
#import "SDLArtwork.h"
#import "SDLChoiceSetManager.h"
#import "SDLMenuManager.h"
+#import "SDLPermissionManager.h"
#import "SDLSoftButtonManager.h"
#import "SDLSubscribeButtonManager.h"
#import "SDLTextAndGraphicManager.h"
@@ -25,22 +28,29 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLVoiceCommandManager *voiceCommandMenuManager;
@property (strong, nonatomic) SDLChoiceSetManager *choiceSetManager;
@property (strong, nonatomic) SDLSubscribeButtonManager *subscribeButtonManager;
+@property (strong, nonatomic) SDLAlertManager *alertManager;
-@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
-@property (weak, nonatomic) SDLFileManager *fileManager;
-@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
+@property (weak, nonatomic, nullable) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic, nullable) SDLFileManager *fileManager;
+@property (weak, nonatomic, nullable) SDLSystemCapabilityManager *systemCapabilityManager;
+@property (weak, nonatomic, nullable) SDLPermissionManager *permissionManager;
@end
@implementation SDLScreenManager
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager {
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"This convenience init is for internal use only and is no longer used. The initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager: convenience init is now used." userInfo:nil];
+}
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager permissionManager:(SDLPermissionManager *)permissionManager {
self = [super init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
_systemCapabilityManager = systemCapabilityManager;
+ _permissionManager = permissionManager;
_textAndGraphicManager = [[SDLTextAndGraphicManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
_softButtonManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
@@ -48,6 +58,7 @@ NS_ASSUME_NONNULL_BEGIN
_menuManager = [[SDLMenuManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
_voiceCommandMenuManager = [[SDLVoiceCommandManager alloc] initWithConnectionManager:connectionManager];
_choiceSetManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
+ _alertManager = [[SDLAlertManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager permissionManager:permissionManager];
return self;
}
@@ -58,6 +69,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.menuManager start];
[self.choiceSetManager start];
[self.subscribeButtonManager start];
+ [self.alertManager start];
handler(nil);
}
@@ -69,6 +81,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.voiceCommandMenuManager stop];
[self.choiceSetManager stop];
[self.subscribeButtonManager stop];
+ [self.alertManager stop];
}
#pragma mark - Setters
@@ -326,6 +339,12 @@ NS_ASSUME_NONNULL_BEGIN
return [self.menuManager openSubmenu:cell];
}
+#pragma mark - Alert
+
+- (void)presentAlert:(SDLAlertView *)alert withCompletionHandler:(nullable SDLScreenManagerUpdateCompletionHandler)handler {
+ [self.alertManager presentAlert:alert withCompletionHandler:handler];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSeatControlCapabilities.h b/SmartDeviceLink/public/SDLSeatControlCapabilities.h
index b85d9b3cb..c20f5db5f 100644
--- a/SmartDeviceLink/public/SDLSeatControlCapabilities.h
+++ b/SmartDeviceLink/public/SDLSeatControlCapabilities.h
@@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param coolingEnabledAvail Whether or not heating is available
/// @param heatingLevelAvail Whether or not heating level is available
/// @param coolingLevelAvail Whether or not cooling level is available
-/// @param horizontalPositionAvail Whether or not horizontal Position is aavailable
+/// @param horizontalPositionAvail Whether or not horizontal Position is available
/// @param verticalPositionAvail Whether or not vertical position is available
/// @param frontVerticalPositionAvail Whether or not front vertical position is available
/// @param backVerticalPositionAvail Whether or not back vertical position is available
diff --git a/SmartDeviceLink/public/SDLSeatMemoryActionType.h b/SmartDeviceLink/public/SDLSeatMemoryActionType.h
index 41dbc2a5f..ae9481746 100644
--- a/SmartDeviceLink/public/SDLSeatMemoryActionType.h
+++ b/SmartDeviceLink/public/SDLSeatMemoryActionType.h
@@ -11,7 +11,7 @@
typedef SDLEnum SDLSeatMemoryActionType NS_TYPED_ENUM;
/**
- * @abstract Save current seat postions and settings to seat memory.
+ * @abstract Save current seat positions and settings to seat memory.
*/
extern SDLSeatMemoryActionType const SDLSeatMemoryActionTypeSave;
diff --git a/SmartDeviceLink/public/SDLSeatOccupancy.h b/SmartDeviceLink/public/SDLSeatOccupancy.h
new file mode 100644
index 000000000..e453a97e1
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeatOccupancy.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCStruct.h"
+
+@class SDLSeatStatus;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLSeatOccupancy : SDLRPCStruct
+
+/**
+ * @param seatsOccupied - seatsOccupied
+ * @param seatsBelted - seatsBelted
+ * @return A SDLSeatOccupancy object
+ */
+- (instancetype)initWithSeatsOccupied:(nullable NSArray<SDLSeatStatus *> *)seatsOccupied seatsBelted:(nullable NSArray<SDLSeatStatus *> *)seatsBelted;
+
+/**
+ * Seat status array containing location and whether the seats are occupied.
+ * {"array_min_size": 0, "array_max_size": 100}
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLSeatStatus *> *seatsOccupied;
+
+/**
+ * Seat status array containing location and whether the seats are belted.
+ * {"array_min_size": 0, "array_max_size": 100}
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLSeatStatus *> *seatsBelted;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/public/SDLSeatOccupancy.m b/SmartDeviceLink/public/SDLSeatOccupancy.m
new file mode 100644
index 000000000..67d6f17f4
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeatOccupancy.m
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLSeatOccupancy.h"
+#import "SDLSeatStatus.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSeatOccupancy
+
+- (instancetype)initWithSeatsOccupied:(nullable NSArray<SDLSeatStatus *> *)seatsOccupied seatsBelted:(nullable NSArray<SDLSeatStatus *> *)seatsBelted {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.seatsOccupied = seatsOccupied;
+ self.seatsBelted = seatsBelted;
+ return self;
+}
+
+- (void)setSeatsOccupied:(nullable NSArray<SDLSeatStatus *> *)seatsOccupied {
+ [self.store sdl_setObject:seatsOccupied forName:SDLRPCParameterNameSeatsOccupied];
+}
+
+- (nullable NSArray<SDLSeatStatus *> *)seatsOccupied {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameSeatsOccupied ofClass:SDLSeatStatus.class error:nil];
+}
+
+- (void)setSeatsBelted:(nullable NSArray<SDLSeatStatus *> *)seatsBelted {
+ [self.store sdl_setObject:seatsBelted forName:SDLRPCParameterNameSeatsBelted];
+}
+
+- (nullable NSArray<SDLSeatStatus *> *)seatsBelted {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameSeatsBelted ofClass:SDLSeatStatus.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSeatStatus.h b/SmartDeviceLink/public/SDLSeatStatus.h
new file mode 100644
index 000000000..29d62c263
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeatStatus.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCStruct.h"
+
+@class SDLSeatLocation;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Describes the status of a parameter of seat.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLSeatStatus : SDLRPCStruct
+
+/**
+ * @param seatLocation - seatLocation
+ * @param conditionActive - @(conditionActive)
+ * @return A SDLSeatStatus object
+ */
+- (instancetype)initWithSeatLocation:(SDLSeatLocation *)seatLocation conditionActive:(BOOL)conditionActive;
+
+@property (strong, nonatomic) SDLSeatLocation *seatLocation;
+
+@property (strong, nonatomic) NSNumber<SDLBool> *conditionActive;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSeatStatus.m b/SmartDeviceLink/public/SDLSeatStatus.m
new file mode 100644
index 000000000..ec2d70d78
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeatStatus.m
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLSeatLocation.h"
+#import "SDLSeatStatus.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSeatStatus
+
+- (instancetype)initWithSeatLocation:(SDLSeatLocation *)seatLocation conditionActive:(BOOL)conditionActive {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.seatLocation = seatLocation;
+ self.conditionActive = @(conditionActive);
+ return self;
+}
+
+- (void)setSeatLocation:(SDLSeatLocation *)seatLocation {
+ [self.store sdl_setObject:seatLocation forName:SDLRPCParameterNameSeatLocation];
+}
+
+- (SDLSeatLocation *)seatLocation {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameSeatLocation ofClass:SDLSeatLocation.class error:&error];
+}
+
+- (void)setConditionActive:(NSNumber<SDLBool> *)conditionActive {
+ [self.store sdl_setObject:conditionActive forName:SDLRPCParameterNameConditionActive];
+}
+
+- (NSNumber<SDLBool> *)conditionActive {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameConditionActive ofClass:NSNumber.class error:&error];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSeekIndicatorType.h b/SmartDeviceLink/public/SDLSeekIndicatorType.h
new file mode 100644
index 000000000..77bc15de2
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeekIndicatorType.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLEnum.h"
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+typedef SDLEnum SDLSeekIndicatorType NS_TYPED_ENUM;
+
+extern SDLSeekIndicatorType const SDLSeekIndicatorTypeTrack;
+extern SDLSeekIndicatorType const SDLSeekIndicatorTypeTime;
diff --git a/SmartDeviceLink/public/SDLSeekIndicatorType.m b/SmartDeviceLink/public/SDLSeekIndicatorType.m
new file mode 100644
index 000000000..a2392cc17
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeekIndicatorType.m
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLSeekIndicatorType.h"
+
+SDLSeekIndicatorType const SDLSeekIndicatorTypeTrack = @"TRACK";
+SDLSeekIndicatorType const SDLSeekIndicatorTypeTime = @"TIME";
diff --git a/SmartDeviceLink/public/SDLSeekStreamingIndicator.h b/SmartDeviceLink/public/SDLSeekStreamingIndicator.h
new file mode 100644
index 000000000..a9881278f
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeekStreamingIndicator.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCStruct.h"
+#import "SDLSeekIndicatorType.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * The seek next / skip previous subscription buttons' content
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLSeekStreamingIndicator : SDLRPCStruct
+
+/**
+ * @param type - type
+ * @return A SDLSeekStreamingIndicator object
+ */
+- (instancetype)initWithType:(SDLSeekIndicatorType)type;
+
+/**
+ * @param type - type
+ * @param seekTime - seekTime
+ * @return A SDLSeekStreamingIndicator object
+ */
+- (instancetype)initWithType:(SDLSeekIndicatorType)type seekTime:(nullable NSNumber<SDLUInt> *)seekTime;
+
+/**
+ * @param seekTime - seekTime
+ * @return A SDLSeekStreamingIndicator object
+ */
++ (instancetype)seekIndicatorWithSeekTime:(NSUInteger)seekTime;
+
+@property (strong, nonatomic) SDLSeekIndicatorType type;
+
+/**
+ * If the type is TIME, this number of seconds may be present alongside the skip indicator. It will indicate the number of seconds that the currently playing media will skip forward or backward.
+ * {"num_min_value": 1, "num_max_value": 99}
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLUInt> *seekTime;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSeekStreamingIndicator.m b/SmartDeviceLink/public/SDLSeekStreamingIndicator.m
new file mode 100644
index 000000000..e255118d7
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSeekStreamingIndicator.m
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2020, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLSeekIndicatorType.h"
+#import "SDLSeekStreamingIndicator.h"
+
+NS_ASSUME_NONNULL_BEGIN
+@implementation SDLSeekStreamingIndicator
+
+- (instancetype)initWithType:(SDLSeekIndicatorType)type {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.type = type;
+ return self;
+}
+
+- (instancetype)initWithType:(SDLSeekIndicatorType)type seekTime:(nullable NSNumber<SDLUInt> *)seekTime {
+ self = [self initWithType:type];
+ if (!self) {
+ return nil;
+ }
+ self.seekTime = seekTime;
+ return self;
+}
+
++ (instancetype)seekIndicatorWithSeekTime:(NSUInteger)seekTime {
+ return [[self alloc] initWithType:SDLSeekIndicatorTypeTime seekTime:@(seekTime)];
+}
+
+- (void)setType:(SDLSeekIndicatorType)type {
+ [self.store sdl_setObject:type forName:SDLRPCParameterNameType];
+}
+
+- (SDLSeekIndicatorType)type {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameType error:&error];
+}
+
+- (void)setSeekTime:(nullable NSNumber<SDLUInt> *)seekTime {
+ [self.store sdl_setObject:seekTime forName:SDLRPCParameterNameSeekTime];
+}
+
+- (nullable NSNumber<SDLUInt> *)seekTime {
+ return [self.store sdl_objectForName:SDLRPCParameterNameSeekTime ofClass:NSNumber.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLServiceEncryptionDelegate.h b/SmartDeviceLink/public/SDLServiceEncryptionDelegate.h
index dd45696a9..ec25d4722 100644
--- a/SmartDeviceLink/public/SDLServiceEncryptionDelegate.h
+++ b/SmartDeviceLink/public/SDLServiceEncryptionDelegate.h
@@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN
* Called when the encryption service has been.
*
* @param type will return whichever type had an encryption update (for now probably only SDLServiceTypeRPC), but it could also apply to video / audio in the future.
- * @param encrypted return true if the the encryption service was setup successfully, will return false if the service is presently not encrypted.
+ * @param encrypted return true if the encryption service was setup successfully, will return false if the service is presently not encrypted.
* @param error will return any error that happens or nil if there is no error.
*/
- (void)serviceEncryptionUpdatedOnService:(SDLServiceType)type encrypted:(BOOL)encrypted error:(NSError *__nullable)error NS_SWIFT_NAME(serviceEncryptionUpdated(serviceType:isEncrypted:error:));
diff --git a/SmartDeviceLink/public/SDLSetMediaClockTimer.h b/SmartDeviceLink/public/SDLSetMediaClockTimer.h
index 4c8ccdd89..b79bda1f5 100644
--- a/SmartDeviceLink/public/SDLSetMediaClockTimer.h
+++ b/SmartDeviceLink/public/SDLSetMediaClockTimer.h
@@ -5,6 +5,7 @@
#import "SDLUpdateMode.h"
#import "SDLAudioStreamingIndicator.h"
+#import "SDLSeekStreamingIndicator.h"
@class SDLStartTime;
@@ -33,7 +34,34 @@ NS_ASSUME_NONNULL_BEGIN
@param playPauseIndicator An optional audio indicator to change the play/pause button
@return An object of SetMediaClockTimer
*/
-+ (instancetype)countUpFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countUp(from:to:playPauseIndicator:));
++ (instancetype)countUpFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countUp(from:to:playPauseIndicator:)) __deprecated_msg("Use countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate: instead");
+
+/**
+ Create a media clock timer that counts up, e.g from 0:00 to 4:18.
+
+ This will fail if startTime is greater than endTime
+
+ @param startTime The start time interval, e.g. (0) 0:00
+ @param endTime The end time interval, e.g. (258) 4:18
+ @param playPauseIndicator An optional audio indicator to change the play/pause button
+ @param countRate set the media playback timer, if `nil`, will default to 1.0
+ @param forwardSeekIndicator - forwardSeekIndicator
+ @param backSeekIndicator - backSeekIndicator
+ @return An object of SetMediaClockTimer
+ */
++ (instancetype)countUpFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate NS_SWIFT_NAME(countUp(from:to:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:));
+
+/**
+ Create a media clock timer that counts up, e.g from 0:00 to 4:18.
+
+ This will fail if startTime is greater than endTime
+
+ @param startTime The start time interval, e.g. 0:00
+ @param endTime The end time interval, e.g. 4:18
+ @param playPauseIndicator An optional audio indicator to change the play/pause button
+ @return An object of SetMediaClockTimer
+ */
++ (instancetype)countUpFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countUp(from:to:playPauseIndicator:)) __deprecated_msg("Use countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate: instead");
/**
Create a media clock timer that counts up, e.g from 0:00 to 4:18.
@@ -43,9 +71,12 @@ NS_ASSUME_NONNULL_BEGIN
@param startTime The start time interval, e.g. 0:00
@param endTime The end time interval, e.g. 4:18
@param playPauseIndicator An optional audio indicator to change the play/pause button
+ @param forwardSeekIndicator - forwardSeekIndicator
+ @param backSeekIndicator - backSeekIndicator
+ @param countRate set the media playback timer, if `nil`, will default to 1.0
@return An object of SetMediaClockTimer
*/
-+ (instancetype)countUpFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countUp(from:to:playPauseIndicator:));
++ (instancetype)countUpFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate NS_SWIFT_NAME(countUp(from:to:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:));
/**
Create a media clock timer that counts down, e.g. from 4:18 to 0:00
@@ -57,7 +88,34 @@ NS_ASSUME_NONNULL_BEGIN
@param playPauseIndicator An optional audio indicator to change the play/pause button
@return An object of SetMediaClockTimer
*/
-+ (instancetype)countDownFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countDown(from:to:playPauseIndicator:));
++ (instancetype)countDownFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countDown(from:to:playPauseIndicator:)) __deprecated_msg("Use countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate: instead");
+
+/**
+ Create a media clock timer that counts down, e.g. from 4:18 to 0:00
+
+ This will fail if endTime is greater than startTime
+
+ @param startTime The start time interval, e.g. (258) 4:18
+ @param endTime The end time interval, e.g. (0) 0:00
+ @param playPauseIndicator An optional audio indicator to change the play/pause button
+ @param forwardSeekIndicator - forwardSeekIndicator
+ @param backSeekIndicator - backSeekIndicator
+ @param countRate set the media playback timer, if `nil`, will default to 1.0
+ @return An object of SetMediaClockTimer
+ */
++ (instancetype)countDownFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate NS_SWIFT_NAME(countDown(from:to:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:));
+
+/**
+ Create a media clock timer that counts down, e.g. from 4:18 to 0:00
+
+ This will fail if endTime is greater than startTime
+
+ @param startTime The start time interval, e.g. 4:18
+ @param endTime The end time interval, e.g. 0:00
+ @param playPauseIndicator An optional audio indicator to change the play/pause button
+ @return An object of SetMediaClockTimer
+ */
++ (instancetype)countDownFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countDown(from:to:playPauseIndicator:)) __deprecated_msg("Use countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate: instead");
/**
Create a media clock timer that counts down, e.g. from 4:18 to 0:00
@@ -67,9 +125,12 @@ NS_ASSUME_NONNULL_BEGIN
@param startTime The start time interval, e.g. 4:18
@param endTime The end time interval, e.g. 0:00
@param playPauseIndicator An optional audio indicator to change the play/pause button
+ @param forwardSeekIndicator - forwardSeekIndicator
+ @param backSeekIndicator - backSeekIndicator
+ @param countRate set the media playback timer, if `nil`, will default to 1.0
@return An object of SetMediaClockTimer
*/
-+ (instancetype)countDownFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(countDown(from:to:playPauseIndicator:));
++ (instancetype)countDownFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate NS_SWIFT_NAME(countDown(from:to:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:));
/**
Pause an existing (counting up / down) media clock timer
@@ -105,7 +166,18 @@ NS_ASSUME_NONNULL_BEGIN
@param playPauseIndicator An optional audio indicator to change the play/pause button
@return An object of SetMediaClockTimer
*/
-+ (instancetype)resumeWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(resume(playPauseIndicator:));
++ (instancetype)resumeWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(resume(playPauseIndicator:)) __deprecated_msg("Use resumeWithPlayPauseIndicator:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:");
+
+/**
+ Resume a paused media clock timer. It resumes at the same time at which it was paused.
+
+ @param playPauseIndicator An optional audio indicator to change the play/pause button
+ @param forwardSeekIndicator - forwardSeekIndicator
+ @param backSeekIndicator - backSeekIndicator
+ @param countRate set the media playback timer
+ @return An object of SetMediaClockTimer, if `nil`, will default to 1.0
+ */
++ (instancetype)resumeWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate NS_SWIFT_NAME(resume(playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:));
/**
Remove a media clock timer from the screen
@@ -116,6 +188,12 @@ NS_ASSUME_NONNULL_BEGIN
+ (instancetype)clearWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(clear(playPauseIndicator:));
/**
+ * @param updateMode - updateMode
+ * @return A SDLSetMediaClockTimer object
+ */
+- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode;
+
+/**
Create a SetMediaClockTimer RPC with all available parameters. It's recommended to use the specific initializers above.
@param updateMode The type of SetMediaClockTimer RPC
@@ -124,7 +202,19 @@ NS_ASSUME_NONNULL_BEGIN
@param playPauseIndicator The display of the play/pause button
@return An object of SetMediaClockTimer
*/
-- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(init(updateMode:startTime:endTime:playPauseIndicator:));
+- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator NS_SWIFT_NAME(init(updateMode:startTime:endTime:playPauseIndicator:)) __deprecated_msg("Use initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate: instead");
+
+/**
+ * @param updateMode - updateMode
+ * @param startTime - startTime
+ * @param endTime - endTime
+ * @param audioStreamingIndicator - audioStreamingIndicator
+ * @param forwardSeekIndicator - forwardSeekIndicator
+ * @param backSeekIndicator - backSeekIndicator
+ * @param countRate - countRate
+ * @return A SDLSetMediaClockTimer object
+ */
+- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime audioStreamingIndicator:(nullable SDLAudioStreamingIndicator)audioStreamingIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate;
/**
* A Start Time with specifying hour, minute, second values
@@ -169,6 +259,28 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic, nullable) SDLAudioStreamingIndicator audioStreamingIndicator;
+/**
+ * Used to control the forward seek button to either skip forward a set amount of time or to the next track.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLSeekStreamingIndicator *forwardSeekIndicator;
+
+/**
+ * Used to control the back seek button to either skip back a set amount of time or to the previous track.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLSeekStreamingIndicator *backSeekIndicator;
+
+/**
+ * The value of this parameter is the amount that the media clock timer will advance per 1.0 seconds of real time. Values less than 1.0 will therefore advance the timer slower than real-time, while values greater than 1.0 will advance the timer faster than real-time. e.g. If this parameter is set to `0.5`, the timer will advance one second per two seconds real-time, or at 50% speed. If this parameter is set to `2.0`, the timer will advance two seconds per one second real-time, or at 200% speed.
+ * {"num_min_value": 0.1, "num_max_value": 100.0, "default_value": 1.0}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *countRate;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSetMediaClockTimer.m b/SmartDeviceLink/public/SDLSetMediaClockTimer.m
index bfbf77ec1..c50647782 100644
--- a/SmartDeviceLink/public/SDLSetMediaClockTimer.m
+++ b/SmartDeviceLink/public/SDLSetMediaClockTimer.m
@@ -22,61 +22,96 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma clang diagnostic pop
-- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
+- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode {
self = [self init];
- if (!self) { return nil; }
-
+ if (!self) {
+ return nil;
+ }
self.updateMode = updateMode;
+ return self;
+}
+
+- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
+ return [self initWithUpdateMode:updateMode startTime:startTime endTime:endTime audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
+}
+
+- (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime audioStreamingIndicator:(nullable SDLAudioStreamingIndicator)audioStreamingIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate {
+ self = [self initWithUpdateMode:updateMode];
+ if (!self) {
+ return nil;
+ }
self.startTime = startTime;
self.endTime = endTime;
- self.audioStreamingIndicator = playPauseIndicator;
-
+ self.audioStreamingIndicator = audioStreamingIndicator;
+ self.forwardSeekIndicator = forwardSeekIndicator;
+ self.backSeekIndicator = backSeekIndicator;
+ self.countRate = countRate;
return self;
}
+ (instancetype)countUpFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
+ return [self countUpFromStartTimeInterval:startTime toEndTimeInterval:endTime playPauseIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
+}
+
++ (instancetype)countUpFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate {
SDLStartTime *startTimeRPC = [[SDLStartTime alloc] initWithTimeInterval:startTime];
SDLStartTime *endTimeRPC = [[SDLStartTime alloc] initWithTimeInterval:endTime];
- return [[self alloc] initWithUpdateMode:SDLUpdateModeCountUp startTime:startTimeRPC endTime:endTimeRPC playPauseIndicator:playPauseIndicator];
+ return [[self alloc] initWithUpdateMode:SDLUpdateModeCountUp startTime:startTimeRPC endTime:endTimeRPC audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:forwardSeekIndicator backSeekIndicator:backSeekIndicator countRate:countRate];
}
+ (instancetype)countUpFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
- return [[self alloc] initWithUpdateMode:SDLUpdateModeCountUp startTime:startTime endTime:endTime playPauseIndicator:playPauseIndicator];
+ return [self countUpFromStartTime:startTime toEndTime:endTime playPauseIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
+}
+
++ (instancetype)countUpFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate {
+ return [[self alloc] initWithUpdateMode:SDLUpdateModeCountUp startTime:startTime endTime:endTime audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:forwardSeekIndicator backSeekIndicator:backSeekIndicator countRate:countRate];
}
+ (instancetype)countDownFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
+ return [self countDownFromStartTimeInterval:startTime toEndTimeInterval:endTime playPauseIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
+}
+
++ (instancetype)countDownFromStartTimeInterval:(NSTimeInterval)startTime toEndTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate {
SDLStartTime *startTimeRPC = [[SDLStartTime alloc] initWithTimeInterval:startTime];
SDLStartTime *endTimeRPC = [[SDLStartTime alloc] initWithTimeInterval:endTime];
- return [[self alloc] initWithUpdateMode:SDLUpdateModeCountDown startTime:startTimeRPC endTime:endTimeRPC playPauseIndicator:playPauseIndicator];
+ return [[self alloc] initWithUpdateMode:SDLUpdateModeCountDown startTime:startTimeRPC endTime:endTimeRPC audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:forwardSeekIndicator backSeekIndicator:backSeekIndicator countRate:countRate];
}
+ (instancetype)countDownFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
- return [[self alloc] initWithUpdateMode:SDLUpdateModeCountDown startTime:startTime endTime:endTime playPauseIndicator:playPauseIndicator];
+ return [self countDownFromStartTime:startTime toEndTime:endTime playPauseIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
+}
+
++ (instancetype)countDownFromStartTime:(SDLStartTime *)startTime toEndTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate {
+ return [[self alloc] initWithUpdateMode:SDLUpdateModeCountDown startTime:startTime endTime:endTime audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:forwardSeekIndicator backSeekIndicator:backSeekIndicator countRate:countRate];
}
+ (instancetype)pauseWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
- return [[self alloc] initWithUpdateMode:SDLUpdateModePause startTime:nil endTime:nil playPauseIndicator:playPauseIndicator];
+ return [[self alloc] initWithUpdateMode:SDLUpdateModePause startTime:nil endTime:nil audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
}
+ (instancetype)updatePauseWithNewStartTimeInterval:(NSTimeInterval)startTime endTimeInterval:(NSTimeInterval)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
SDLStartTime *startTimeRPC = [[SDLStartTime alloc] initWithTimeInterval:startTime];
SDLStartTime *endTimeRPC = [[SDLStartTime alloc] initWithTimeInterval:endTime];
- return [[self alloc] initWithUpdateMode:SDLUpdateModePause startTime:startTimeRPC endTime:endTimeRPC playPauseIndicator:playPauseIndicator];
+ return [[self alloc] initWithUpdateMode:SDLUpdateModePause startTime:startTimeRPC endTime:endTimeRPC audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
}
+ (instancetype)updatePauseWithNewStartTime:(SDLStartTime *)startTime endTime:(SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
- return [[self alloc] initWithUpdateMode:SDLUpdateModePause startTime:startTime endTime:endTime playPauseIndicator:playPauseIndicator];
+ return [[self alloc] initWithUpdateMode:SDLUpdateModePause startTime:startTime endTime:endTime audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
}
+ (instancetype)resumeWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
- return [[self alloc] initWithUpdateMode:SDLUpdateModeResume startTime:nil endTime:nil playPauseIndicator:playPauseIndicator];
+ return [self resumeWithPlayPauseIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
+}
+
++ (instancetype)resumeWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator forwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator backSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator countRate:(nullable NSNumber<SDLFloat> *)countRate {
+ return [[self alloc] initWithUpdateMode:SDLUpdateModeResume startTime:nil endTime:nil audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:forwardSeekIndicator backSeekIndicator:backSeekIndicator countRate:countRate];
}
+ (instancetype)clearWithPlayPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator {
- return [[self alloc] initWithUpdateMode:SDLUpdateModeClear startTime:nil endTime:nil playPauseIndicator:playPauseIndicator];
+ return [[self alloc] initWithUpdateMode:SDLUpdateModeClear startTime:nil endTime:nil audioStreamingIndicator:playPauseIndicator forwardSeekIndicator:nil backSeekIndicator:nil countRate:nil];
}
- (void)setStartTime:(nullable SDLStartTime *)startTime {
@@ -112,6 +147,30 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_enumForName:SDLRPCParameterNameAudioStreamingIndicator error:nil];
}
+- (void)setForwardSeekIndicator:(nullable SDLSeekStreamingIndicator *)forwardSeekIndicator {
+ [self.parameters sdl_setObject:forwardSeekIndicator forName:SDLRPCParameterNameForwardSeekIndicator];
+}
+
+- (nullable SDLSeekStreamingIndicator *)forwardSeekIndicator {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameForwardSeekIndicator ofClass:SDLSeekStreamingIndicator.class error:nil];
+}
+
+- (void)setBackSeekIndicator:(nullable SDLSeekStreamingIndicator *)backSeekIndicator {
+ [self.parameters sdl_setObject:backSeekIndicator forName:SDLRPCParameterNameBackSeekIndicator];
+}
+
+- (nullable SDLSeekStreamingIndicator *)backSeekIndicator {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameBackSeekIndicator ofClass:SDLSeekStreamingIndicator.class error:nil];
+}
+
+- (void)setCountRate:(nullable NSNumber<SDLFloat> *)countRate {
+ [self.parameters sdl_setObject:countRate forName:SDLRPCParameterNameCountRate];
+}
+
+- (nullable NSNumber<SDLFloat> *)countRate {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameCountRate ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLShow.h b/SmartDeviceLink/public/SDLShow.h
index 723e5fd83..9b0706ee9 100644
--- a/SmartDeviceLink/public/SDLShow.h
+++ b/SmartDeviceLink/public/SDLShow.h
@@ -45,7 +45,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param mainField2 The text displayed on the second display line
/// @param alignment The alignment that specifies how the text should be aligned on display
/// @return An SDLShow object
-- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment;
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment __deprecated_msg("Use initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration: instead");
/// Convenience init to set template elements with the following parameters
///
@@ -55,7 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param mainField2Type Text field metadata types
/// @param alignment The alignment that specifies how the text should be aligned on display
/// @return An SDLShow object
-- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField1Type:(nullable SDLMetadataType)mainField1Type mainField2:(nullable NSString *)mainField2 mainField2Type:(nullable SDLMetadataType)mainField2Type alignment:(nullable SDLTextAlignment)alignment;
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField1Type:(nullable SDLMetadataType)mainField1Type mainField2:(nullable NSString *)mainField2 mainField2Type:(nullable SDLMetadataType)mainField2Type alignment:(nullable SDLTextAlignment)alignment __deprecated_msg("Use initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration: instead");
/// Convenience init to set template elements with the following parameters
///
@@ -65,7 +65,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param mainField4 The text displayed on the fourth display line
/// @param alignment The alignment that specifies how the text should be aligned on display
/// @return An SDLShow object
-- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment;
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment __deprecated_msg("Use initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration: instead");
/// Convenience init to set template elements with the following parameters
///
@@ -79,7 +79,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param mainField4Type Text field metadata types
/// @param alignment The alignment that specifies how the text should be aligned on display
/// @return An SDLShow object
-- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField1Type:(nullable SDLMetadataType)mainField1Type mainField2:(nullable NSString *)mainField2 mainField2Type:(nullable SDLMetadataType)mainField2Type mainField3:(nullable NSString *)mainField3 mainField3Type:(nullable SDLMetadataType)mainField3Type mainField4:(nullable NSString *)mainField4 mainField4Type:(nullable SDLMetadataType)mainField4Type alignment:(nullable SDLTextAlignment)alignment;
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField1Type:(nullable SDLMetadataType)mainField1Type mainField2:(nullable NSString *)mainField2 mainField2Type:(nullable SDLMetadataType)mainField2Type mainField3:(nullable NSString *)mainField3 mainField3Type:(nullable SDLMetadataType)mainField3Type mainField4:(nullable NSString *)mainField4 mainField4Type:(nullable SDLMetadataType)mainField4Type alignment:(nullable SDLTextAlignment)alignment __deprecated_msg("Use initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration: instead");
/// Convenience init to set template elements with the following parameters
///
@@ -90,7 +90,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param mediaClock The value for the mediaClock field
/// @param mediaTrack The text in the track field
/// @return An SDLShow object
-- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaClock:(nullable NSString *)mediaClock mediaTrack:(nullable NSString *)mediaTrack;
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaClock:(nullable NSString *)mediaClock mediaTrack:(nullable NSString *)mediaTrack __deprecated_msg("Use initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration: instead");
/// Convenience init to set template elements with the following parameters
///
@@ -107,7 +107,27 @@ NS_ASSUME_NONNULL_BEGIN
/// @param customPresets The custom presets defined by the App
/// @param metadata Text field metadata
/// @return An SDLShow object
-- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaClock:(nullable NSString *)mediaClock mediaTrack:(nullable NSString *)mediaTrack graphic:(nullable SDLImage *)graphic softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons customPresets:(nullable NSArray<NSString *> *)customPresets textFieldMetadata:(nullable SDLMetadataTags *)metadata;
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaClock:(nullable NSString *)mediaClock mediaTrack:(nullable NSString *)mediaTrack graphic:(nullable SDLImage *)graphic softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons customPresets:(nullable NSArray<NSString *> *)customPresets textFieldMetadata:(nullable SDLMetadataTags *)metadata __deprecated_msg("Use initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration: instead");
+
+/**
+ * @param mainField1 - mainField1
+ * @param mainField2 - mainField2
+ * @param mainField3 - mainField3
+ * @param mainField4 - mainField4
+ * @param alignment - alignment
+ * @param statusBar - statusBar
+ * @param mediaTrack - mediaTrack
+ * @param graphic - graphic
+ * @param secondaryGraphic - secondaryGraphic
+ * @param softButtons - softButtons
+ * @param customPresets - customPresets
+ * @param metadataTags - metadataTags
+ * @param templateTitle - templateTitle
+ * @param windowID - windowID
+ * @param templateConfiguration - templateConfiguration
+ * @return A SDLShow object
+ */
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaTrack:(nullable NSString *)mediaTrack graphic:(nullable SDLImage *)graphic secondaryGraphic:(nullable SDLImage *)secondaryGraphic softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons customPresets:(nullable NSArray<NSString *> *)customPresets metadataTags:(nullable SDLMetadataTags *)metadataTags templateTitle:(nullable NSString *)templateTitle windowID:(nullable NSNumber<SDLInt> *)windowID templateConfiguration:(nullable SDLTemplateConfiguration *)templateConfiguration;
/**
* The text displayed in a single-line display, or in the upper display
@@ -215,23 +235,15 @@ NS_ASSUME_NONNULL_BEGIN
* </ul>
*/
@property (strong, nonatomic, nullable) NSString *statusBar;
+
/**
- * This property is deprecated use SetMediaClockTimer instead.
- * <p> The value for the MediaClock field using a format described in the
- * MediaClockFormat enumeration
+ * Text value for MediaClock field. Has to be properly formatted by Mobile App according to the module's capabilities. If this text is set, any automatic media clock updates previously set with SetMediaClockTimer will be stopped.
+ * {"string_min_length": 0, "string_max_length": 500}
*
- * @discussion A String value for the MediaClock
- * <p>
- * <b>Notes: </b><br/>
- * <ul>
- * <li>Must be properly formatted as described in the
- * MediaClockFormat enumeration</li>
- * <li>If a value of five spaces is provided, this will clear
- * that field on the display (i.e. the media clock timer field
- * will not display anything)</li>
- * </ul>
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 1.0.0
*/
-@property (strong, nonatomic, nullable) NSString *mediaClock;
+@property (strong, nonatomic, nullable) NSString *mediaClock __deprecated;
/**
* The text in the track field
*
diff --git a/SmartDeviceLink/public/SDLShow.m b/SmartDeviceLink/public/SDLShow.m
index c42295dd1..e6234546f 100644
--- a/SmartDeviceLink/public/SDLShow.m
+++ b/SmartDeviceLink/public/SDLShow.m
@@ -27,51 +27,29 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment {
- return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:nil mainField4:nil alignment:alignment];
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:nil mainField4:nil alignment:alignment statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:nil templateTitle:nil windowID:nil templateConfiguration:nil];;
}
- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField1Type:(nullable SDLMetadataType)mainField1Type mainField2:(nullable NSString *)mainField2 mainField2Type:(nullable SDLMetadataType)mainField2Type alignment:(nullable SDLTextAlignment)alignment {
- self = [self init];
- if (!self) {
- return nil;
- }
-
NSArray<SDLMetadataType> *field1Array = mainField1Type ? @[mainField1Type] : nil;
NSArray<SDLMetadataType> *field2Array = mainField2Type ? @[mainField2Type] : nil;
SDLMetadataTags* metadataTags = (field1Array != nil || field2Array != nil) ? [[SDLMetadataTags alloc] initWithTextFieldTypes:field1Array mainField2:field2Array] : nil;
- self.mainField1 = mainField1;
- self.mainField2 = mainField2;
- self.alignment = alignment;
- self.metadataTags = metadataTags;
-
- return self;
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:nil mainField4:nil alignment:alignment statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:metadataTags templateTitle:nil windowID:nil templateConfiguration:nil];
}
- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment {
- return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:mainField3 mainField4:mainField4 alignment:alignment statusBar:nil mediaClock:nil mediaTrack:nil graphic:nil softButtons:nil customPresets:nil textFieldMetadata:nil];
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:mainField3 mainField4:mainField4 alignment:alignment statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:nil templateTitle:nil windowID:nil templateConfiguration:nil];;
}
- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField1Type:(nullable SDLMetadataType)mainField1Type mainField2:(nullable NSString *)mainField2 mainField2Type:(nullable SDLMetadataType)mainField2Type mainField3:(nullable NSString *)mainField3 mainField3Type:(nullable SDLMetadataType)mainField3Type mainField4:(nullable NSString *)mainField4 mainField4Type:(nullable SDLMetadataType)mainField4Type alignment:(nullable SDLTextAlignment)alignment {
- self = [self init];
- if (!self) {
- return nil;
- }
-
NSArray<SDLMetadataType> *field1Array = mainField1Type ? @[mainField1Type] : nil;
NSArray<SDLMetadataType> *field2Array = mainField2Type ? @[mainField2Type] : nil;
NSArray<SDLMetadataType> *field3Array = mainField3Type ? @[mainField3Type] : nil;
NSArray<SDLMetadataType> *field4Array = mainField4Type ? @[mainField4Type] : nil;
SDLMetadataTags* metadataTags = (field1Array != nil || field2Array != nil || field3Array != nil || field4Array != nil) ? [[SDLMetadataTags alloc] initWithTextFieldTypes:field1Array mainField2:field2Array mainField3:field3Array mainField4:field4Array] : nil;
- self.mainField1 = mainField1;
- self.mainField2 = mainField2;
- self.mainField3 = mainField3;
- self.mainField4 = mainField4;
- self.alignment = alignment;
- self.metadataTags = metadataTags;
-
- return self;
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:mainField3 mainField4:mainField4 alignment:alignment statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:metadataTags templateTitle:nil windowID:nil templateConfiguration:nil];
}
- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaClock:(nullable NSString *)mediaClock mediaTrack:(nullable NSString *)mediaTrack {
@@ -79,6 +57,17 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaClock:(nullable NSString *)mediaClock mediaTrack:(nullable NSString *)mediaTrack graphic:(nullable SDLImage *)graphic softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons customPresets:(nullable NSArray<NSString *> *)customPresets textFieldMetadata:(nullable SDLMetadataTags *)metadata {
+ self = [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:mainField3 mainField4:mainField4 alignment:alignment statusBar:statusBar mediaTrack:mediaTrack graphic:graphic secondaryGraphic:nil softButtons:softButtons customPresets:customPresets metadataTags:metadata templateTitle:nil windowID:nil templateConfiguration:nil];
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.mediaClock = mediaClock;
+#pragma clang diagnostic pop
+
+ return self;
+}
+
+- (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 mainField3:(nullable NSString *)mainField3 mainField4:(nullable NSString *)mainField4 alignment:(nullable SDLTextAlignment)alignment statusBar:(nullable NSString *)statusBar mediaTrack:(nullable NSString *)mediaTrack graphic:(nullable SDLImage *)graphic secondaryGraphic:(nullable SDLImage *)secondaryGraphic softButtons:(nullable NSArray<SDLSoftButton *> *)softButtons customPresets:(nullable NSArray<NSString *> *)customPresets metadataTags:(nullable SDLMetadataTags *)metadataTags templateTitle:(nullable NSString *)templateTitle windowID:(nullable NSNumber<SDLInt> *)windowID templateConfiguration:(nullable SDLTemplateConfiguration *)templateConfiguration {
self = [self init];
if (!self) {
return nil;
@@ -88,17 +77,19 @@ NS_ASSUME_NONNULL_BEGIN
self.mainField2 = mainField2;
self.mainField3 = mainField3;
self.mainField4 = mainField4;
+ self.alignment = alignment;
self.statusBar = statusBar;
- self.mediaClock = mediaClock;
self.mediaTrack = mediaTrack;
- self.alignment = alignment;
self.graphic = graphic;
- self.softButtons = [softButtons mutableCopy];
- self.customPresets = [customPresets mutableCopy];
- self.metadataTags = metadata;
+ self.secondaryGraphic = secondaryGraphic;
+ self.softButtons = softButtons;
+ self.customPresets = customPresets;
+ self.metadataTags = metadataTags;
+ self.templateTitle = templateTitle;
+ self.windowID = windowID;
+ self.templateConfiguration = templateConfiguration;
return self;
-
}
- (void)setMainField1:(nullable NSString *)mainField1 {
diff --git a/SmartDeviceLink/public/SDLShowConstantTBT.h b/SmartDeviceLink/public/SDLShowConstantTBT.h
index 3ac01780d..b45774838 100644
--- a/SmartDeviceLink/public/SDLShowConstantTBT.h
+++ b/SmartDeviceLink/public/SDLShowConstantTBT.h
@@ -25,8 +25,8 @@ NS_ASSUME_NONNULL_BEGIN
/// @param totalDistance The distance to the final destination
/// @param turnIcon An icon to show with the turn description
/// @param nextTurnIcon An icon to show with the next turn description
-/// @param distanceToManeuver Fraction of distance till next maneuver
-/// @param distanceToManeuverScale Distance till next maneuver
+/// @param distanceToManeuver Distance (in meters) until next maneuver.
+/// @param distanceToManeuverScale Distance (in meters) from previous maneuver to next maneuver.
/// @param maneuverComplete If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE
/// @param softButtons Three dynamic SoftButtons available (first SoftButton is fixed to "Turns")
/// @return An SDLShowConstantTBT object
@@ -86,14 +86,14 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLImage *nextTurnIcon;
/**
- * Fraction of distance till next maneuver (starting from when AlertManeuver is triggered). Used to calculate progress bar.
+ * Distance (in meters) until next maneuver. May be used to calculate progress bar.
*
* Optional, Float, 0 - 1,000,000,000
*/
@property (strong, nonatomic, nullable) NSNumber<SDLFloat> *distanceToManeuver;
/**
- * Distance till next maneuver (starting from) from previous maneuver. Used to calculate progress bar.
+ * Distance (in meters) from previous maneuver to next maneuver. May be used to calculate progress bar.
*
* Optional, Float, 0 - 1,000,000,000
*/
diff --git a/SmartDeviceLink/public/SDLStaticIconName.h b/SmartDeviceLink/public/SDLStaticIconName.h
index c2e731d79..bcec6ea12 100644
--- a/SmartDeviceLink/public/SDLStaticIconName.h
+++ b/SmartDeviceLink/public/SDLStaticIconName.h
@@ -54,9 +54,14 @@ extern SDLStaticIconName const SDLStaticIconNameAudiobookEpisode;
extern SDLStaticIconName const SDLStaticIconNameAudiobookNarrator;
/**
- * Static icon auxillary audio
+ * Static icon auxiliary audio
*/
-extern SDLStaticIconName const SDLStaticIconNameAuxillaryAudio;
+extern SDLStaticIconName const SDLStaticIconNameAuxillaryAudio __deprecated_msg("Use SDLStaticIconNameAuxiliaryAudio instead");
+
+/**
+ * Static icon auxiliary audio
+ */
+extern SDLStaticIconName const SDLStaticIconNameAuxiliaryAudio;
/**
* Static icon back / return
diff --git a/SmartDeviceLink/public/SDLStaticIconName.m b/SmartDeviceLink/public/SDLStaticIconName.m
index c39ef14f2..ff00e1266 100644
--- a/SmartDeviceLink/public/SDLStaticIconName.m
+++ b/SmartDeviceLink/public/SDLStaticIconName.m
@@ -17,6 +17,7 @@ SDLStaticIconName const SDLStaticIconNameAudioMute = @"0x12";
SDLStaticIconName const SDLStaticIconNameAudiobookEpisode = @"0x83";
SDLStaticIconName const SDLStaticIconNameAudiobookNarrator = @"0x82";
SDLStaticIconName const SDLStaticIconNameAuxillaryAudio = @"0x45";
+SDLStaticIconName const SDLStaticIconNameAuxiliaryAudio = @"0x45";
SDLStaticIconName const SDLStaticIconNameBack = @"0x86";
SDLStaticIconName const SDLStaticIconNameBatteryCapacity0Of5 = @"0xF7";
SDLStaticIconName const SDLStaticIconNameBatteryCapacity1Of5 = @"0xF8";
diff --git a/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h b/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h
index 2c1585f16..669e59319 100644
--- a/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h
+++ b/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h
@@ -12,7 +12,8 @@
@protocol SDLSecurityType;
@protocol SDLStreamingMediaManagerDataSource;
-
+@protocol SDLStreamingVideoDelegate;
+@class SDLVideoStreamingRange;
NS_ASSUME_NONNULL_BEGIN
@@ -57,7 +58,7 @@ typedef NS_ENUM(NSUInteger, SDLCarWindowRenderingType) {
@note If you wish to alter this `rootViewController` while streaming via CarWindow, you must set a new `rootViewController` on `SDLStreamingMediaManager` and this will update both the haptic view parser and CarWindow.
- @warning Apps using views outside of the `UIView` heirarchy (such as OpenGL) are currently unsupported. If you app uses partial views in the heirarchy, only those views will be discovered. Your OpenGL views will not be discoverable to a haptic interface head unit and you will have to manually make these views discoverable via the `SDLSendHapticData` RPC request.
+ @warning Apps using views outside of the `UIView` hierarchy (such as OpenGL) are currently unsupported. If you app uses partial views in the hierarchy, only those views will be discovered. Your OpenGL views will not be discoverable to a haptic interface head unit and you will have to manually make these views discoverable via the `SDLSendHapticData` RPC request.
@warning If the `rootViewController` is app UI and is set from the `UIViewController` class, it should only be set after viewDidAppear:animated is called. Setting the `rootViewController` in `viewDidLoad` or `viewWillAppear:animated` can cause weird behavior when setting the new frame.
@@ -83,6 +84,25 @@ typedef NS_ENUM(NSUInteger, SDLCarWindowRenderingType) {
@property (assign, nonatomic) BOOL allowMultipleViewControllerOrientations;
/**
+ Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module's screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to `nil`, the default is to support all lanscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a `disabled` video streaming range.
+ If desired, you can subscribe to screen size updates via the SDLStreamingVideoDelegate.
+ @warning If you disable both the supportedLandscapeStreamingRange and supportedPortraitStreamingRange, video will not stream
+ */
+@property (strong, nonatomic, nullable) SDLVideoStreamingRange *supportedLandscapeStreamingRange;
+
+/**
+ Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports. If the module's screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to `nil`, the default is to support all portrait streaming ranges. If you wish to disable support for streaming in portrait mode, set a `disabled` video streaming range.
+ If desired, you can subscribe to screen size updates via the SDLStreamingVideoDelegate.
+ @warning If you disable both the supportedLandscapeStreamingRange and supportedPortraitStreamingRange, video will not stream
+ */
+@property (strong, nonatomic, nullable) SDLVideoStreamingRange *supportedPortraitStreamingRange;
+
+/**
+ The configuration delegate, this is an object conforming to the SDLStreamingVideoDelegate protocol. If video streaming parameters change then this object will be called on.
+ */
+@property (weak, nonatomic, nullable) id<SDLStreamingVideoDelegate> delegate;
+
+/**
Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you'd like custom video encoder settings, you can set the property manually.
@return The configuration
@@ -99,12 +119,22 @@ typedef NS_ENUM(NSUInteger, SDLCarWindowRenderingType) {
/**
Manually set all the properties to the streaming media configuration
- @param encryptionFlag The maximum encrpytion supported. If the connected head unit supports less than set here, it will still connect, but if it supports more than set here, it will not connect.
+ @param encryptionFlag The maximum encryption supported. If the connected head unit supports less than set here, it will still connect, but if it supports more than set here, it will not connect.
@param videoSettings Custom video encoder settings to be used in video streaming.
- @param rootViewController The UIViewController wih the content that is being streamed on, to use for haptics if needed and possible (only works for UIViews)
+ @param rootViewController The UIViewController with the content that is being streamed on, to use for haptics if needed and possible (only works for UIViews)
@return The configuration
*/
-- (instancetype)initWithEncryptionFlag:(SDLStreamingEncryptionFlag)encryptionFlag videoSettings:(nullable NSDictionary<NSString *, id> *)videoSettings dataSource:(nullable id<SDLStreamingMediaManagerDataSource>)dataSource rootViewController:(nullable UIViewController *)rootViewController;
+- (instancetype)initWithEncryptionFlag:(SDLStreamingEncryptionFlag)encryptionFlag videoSettings:(nullable NSDictionary<NSString *, id> *)videoSettings dataSource:(nullable id<SDLStreamingMediaManagerDataSource>)dataSource rootViewController:(nullable UIViewController *)rootViewController __deprecated_msg("Use initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:");
+
+/// Manually set all the properties to the streaming media configuration
+/// @param encryptionFlag The maximum encryption supported. If the connected head unit supports less than set here, it will still connect, but if it supports more than set here, it will not connect
+/// @param videoSettings Custom video encoder settings to be used in video streaming
+/// @param landscapeRange Set a landscape image dimension range and/or aspect ratio range that your app supports
+/// @param portraitRange Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports
+/// @param dataSource Allows you to respond with preferred resolutions and/or formats
+/// @param delegate Provides a delegate with notifications about changes to the audio stream
+/// @param rootViewController A view controller that should be automatically streamed
+- (instancetype)initWithEncryptionFlag:(SDLStreamingEncryptionFlag)encryptionFlag videoSettings:(nullable NSDictionary<NSString *, id> *)videoSettings supportedLandscapeRange:(nullable SDLVideoStreamingRange *)landscapeRange supportedPortraitRange:(nullable SDLVideoStreamingRange *)portraitRange dataSource:(nullable id<SDLStreamingMediaManagerDataSource>)dataSource delegate:(nullable id<SDLStreamingVideoDelegate>)delegate rootViewController:(nullable UIViewController *)rootViewController;
/**
Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you'd like custom video encoder settings, you can set the property manually. This is equivalent to `init`.
diff --git a/SmartDeviceLink/public/SDLStreamingMediaConfiguration.m b/SmartDeviceLink/public/SDLStreamingMediaConfiguration.m
index 7438b2678..ad677d856 100644
--- a/SmartDeviceLink/public/SDLStreamingMediaConfiguration.m
+++ b/SmartDeviceLink/public/SDLStreamingMediaConfiguration.m
@@ -16,11 +16,11 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLStreamingMediaConfiguration
- (instancetype)init {
- return [self initWithEncryptionFlag:SDLStreamingEncryptionFlagNone videoSettings:nil dataSource:nil rootViewController:nil];
+ return [self initWithEncryptionFlag:SDLStreamingEncryptionFlagNone videoSettings:nil supportedLandscapeRange:nil supportedPortraitRange:nil dataSource:nil delegate:nil rootViewController:nil];
}
+ (instancetype)secureConfiguration {
- return [[self alloc] initWithEncryptionFlag:SDLStreamingEncryptionFlagAuthenticateAndEncrypt videoSettings:nil dataSource:nil rootViewController:nil];
+ return [[self alloc] initWithEncryptionFlag:SDLStreamingEncryptionFlagAuthenticateAndEncrypt videoSettings:nil supportedLandscapeRange:nil supportedPortraitRange:nil dataSource:nil delegate:nil rootViewController:nil];
}
+ (instancetype)insecureConfiguration {
@@ -43,18 +43,37 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)initWithEncryptionFlag:(SDLStreamingEncryptionFlag)encryptionFlag videoSettings:(nullable NSDictionary<NSString *,id> *)videoSettings supportedLandscapeRange:(nullable SDLVideoStreamingRange *)landscapeRange supportedPortraitRange:(nullable SDLVideoStreamingRange *)portraitRange dataSource:(nullable id<SDLStreamingMediaManagerDataSource>)dataSource delegate:(nullable id<SDLStreamingVideoDelegate>)delegate rootViewController:(nullable UIViewController *)rootViewController {
+ if (!self) {
+ return nil;
+ }
+
+ _maximumDesiredEncryption = encryptionFlag;
+ _customVideoEncoderSettings = videoSettings;
+ _supportedLandscapeStreamingRange = landscapeRange;
+ _supportedPortraitStreamingRange = portraitRange;
+ _dataSource = dataSource;
+ _delegate = delegate;
+ _rootViewController = rootViewController;
+ _carWindowRenderingType = SDLCarWindowRenderingTypeLayer;
+ _enableForcedFramerateSync = YES;
+ _allowMultipleViewControllerOrientations = NO;
+
+ return self;
+}
+
+ (instancetype)autostreamingInsecureConfigurationWithInitialViewController:(UIViewController *)initialViewController {
- return [[self alloc] initWithEncryptionFlag:SDLStreamingEncryptionFlagNone videoSettings:nil dataSource:nil rootViewController:initialViewController];
+ return [[self alloc] initWithEncryptionFlag:SDLStreamingEncryptionFlagNone videoSettings:nil supportedLandscapeRange:nil supportedPortraitRange:nil dataSource:nil delegate:nil rootViewController:initialViewController];
}
+ (instancetype)autostreamingSecureConfigurationWithInitialViewController:(UIViewController *)initialViewController {
- return [[self alloc] initWithEncryptionFlag:SDLStreamingEncryptionFlagAuthenticateAndEncrypt videoSettings:nil dataSource:nil rootViewController:initialViewController];
+ return [[self alloc] initWithEncryptionFlag:SDLStreamingEncryptionFlagAuthenticateAndEncrypt videoSettings:nil supportedLandscapeRange:nil supportedPortraitRange:nil dataSource:nil delegate:nil rootViewController:initialViewController];
}
#pragma mark NSCopying
- (id)copyWithZone:(nullable NSZone *)zone {
- SDLStreamingMediaConfiguration *newConfig = [[self.class allocWithZone:zone] initWithEncryptionFlag:_maximumDesiredEncryption videoSettings:_customVideoEncoderSettings dataSource:_dataSource rootViewController:_rootViewController];
+ SDLStreamingMediaConfiguration *newConfig = [[self.class allocWithZone:zone] initWithEncryptionFlag:_maximumDesiredEncryption videoSettings:_customVideoEncoderSettings supportedLandscapeRange:_supportedLandscapeStreamingRange supportedPortraitRange:_supportedPortraitStreamingRange dataSource:_dataSource delegate:_delegate rootViewController:_rootViewController];
newConfig.carWindowRenderingType = self.carWindowRenderingType;
newConfig.enableForcedFramerateSync = self.enableForcedFramerateSync;
diff --git a/SmartDeviceLink/public/SDLStreamingVideoDelegate.h b/SmartDeviceLink/public/SDLStreamingVideoDelegate.h
new file mode 100644
index 000000000..fc9284c33
--- /dev/null
+++ b/SmartDeviceLink/public/SDLStreamingVideoDelegate.h
@@ -0,0 +1,18 @@
+//
+// SDLStreamingVideoDelegate.h
+// SmartDeviceLink
+//
+// Created on 6/11/20.
+//
+
+#import <CoreGraphics/CGGeometry.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLStreamingVideoDelegate <NSObject>
+
+- (void)videoStreamingSizeDidUpdate:(CGSize)displaySize NS_SWIFT_NAME(videoStreamingSizeDidUpdate(toSize:));
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLStreamingVideoScaleManager.h b/SmartDeviceLink/public/SDLStreamingVideoScaleManager.h
index 77d4a97d4..ee9cc6144 100644
--- a/SmartDeviceLink/public/SDLStreamingVideoScaleManager.h
+++ b/SmartDeviceLink/public/SDLStreamingVideoScaleManager.h
@@ -10,6 +10,7 @@
@class SDLOnTouchEvent;
@class SDLHapticRect;
+@class SDLImageResolution;
NS_ASSUME_NONNULL_BEGIN
@@ -69,10 +70,24 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLHapticRect *)scaleHapticRect:(SDLHapticRect *)hapticRect;
/**
+ Create and return the current display resolution respecting the scale factor
+ @return A new created object of type SDLImageResolution
+ */
+- (SDLImageResolution *)makeScaledResolution;
+
+/**
Stops the manager. This method is used internally.
*/
- (void)stop;
+/**
+ Calculate a new size based on the given size and the scale factor
+ @param scale The scale factor to apply
+ @param size The size struct to apply the scale to
+ @return A new created and inited struct of type CGSize
+ */
++ (CGSize)scale:(float)scale size:(CGSize)size;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLStreamingVideoScaleManager.m b/SmartDeviceLink/public/SDLStreamingVideoScaleManager.m
index d9c2158d9..74bc349a3 100644
--- a/SmartDeviceLink/public/SDLStreamingVideoScaleManager.m
+++ b/SmartDeviceLink/public/SDLStreamingVideoScaleManager.m
@@ -6,8 +6,10 @@
// Copyright © 2019 smartdevicelink. All rights reserved.
//
+#import <simd/simd.h>
#import "SDLStreamingVideoScaleManager.h"
+#import "SDLImageResolution.h"
#import "SDLOnTouchEvent.h"
#import "SDLRectangle.h"
#import "SDLTouchCoord.h"
@@ -17,19 +19,15 @@
NS_ASSUME_NONNULL_BEGIN
-@interface SDLStreamingVideoScaleManager ()
-
-@property (assign, nonatomic, readwrite) CGRect appViewportFrame;
-
-@end
-
@implementation SDLStreamingVideoScaleManager
-const float SDLDefaultScaleValue = 1.0;
+const float SDLDefaultScaleValue = 1.0f;
+const float SDLMaxScaleValue = 10.0f;
+const float SDLMinScaleValue = 1.0f;
CGSize const SDLDefaultDisplayViewportResolution = {0, 0};
- (instancetype)init {
- return [[self.class alloc] initWithScale:SDLDefaultScaleValue displayViewportResolution:SDLDefaultDisplayViewportResolution];
+ return [self initWithScale:SDLDefaultScaleValue displayViewportResolution:SDLDefaultDisplayViewportResolution];
}
- (void)stop {
@@ -43,7 +41,7 @@ CGSize const SDLDefaultDisplayViewportResolution = {0, 0};
return nil;
}
- _scale = [self.class validateScale:scale];
+ _scale = [self.class sdl_validateScale:scale];
_displayViewportResolution = displayViewportResolution;
return self;
@@ -74,23 +72,33 @@ CGSize const SDLDefaultDisplayViewportResolution = {0, 0};
- (CGRect)appViewportFrame {
// Screen capture in the CarWindow API only works if the width and height are integer values
- return CGRectMake(0, 0, roundf((float)self.displayViewportResolution.width / self.scale), roundf((float)self.displayViewportResolution.height / self.scale));
+ return (CGRect){CGPointZero, [self.class scale:self.scale size:self.displayViewportResolution]};
}
- (void)setScale:(float)scale {
- _scale = [self.class validateScale:scale];
+ _scale = [self.class sdl_validateScale:scale];
+}
+
+- (SDLImageResolution *)makeScaledResolution {
+ const CGSize size = [self.class scale:self.scale size:self.displayViewportResolution];
+ return [[SDLImageResolution alloc] initWithWidth:(uint16_t)size.width height:(uint16_t)size.height];
}
#pragma mark - Helpers
/**
- Validates the scale value. Returns the default scale value for 1.0 if the scale value is less than 1.0
+ Validates the scale value. Returns a clamped scale value in the range [SDLMinScaleValue...SDLMaxScaleValue]
@param scale The scale value to be validated.
@return The validated scale value
*/
-+ (float)validateScale:(float)scale {
- return (scale > SDLDefaultScaleValue) ? scale : SDLDefaultScaleValue;
++ (float)sdl_validateScale:(float)scale {
+ return simd_clamp(scale, SDLMinScaleValue, SDLMaxScaleValue);
+}
+
++ (CGSize)scale:(float)scale size:(CGSize)size {
+ const float validScale = [self sdl_validateScale:scale];
+ return CGSizeMake(roundf((float)size.width / validScale), roundf((float)size.height / validScale));
}
@end
diff --git a/SmartDeviceLink/public/SDLSubscribeVehicleData.h b/SmartDeviceLink/public/SDLSubscribeVehicleData.h
index 27c830199..053c8c68c 100644
--- a/SmartDeviceLink/public/SDLSubscribeVehicleData.h
+++ b/SmartDeviceLink/public/SDLSubscribeVehicleData.h
@@ -53,7 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param wiperStatus Subscribe to wiperStatus
* @return A SDLSubscribeVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
/**
* Convenience init for subscribing to all possible vehicle data items.
@@ -90,7 +90,45 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLSubscribeVehicleData object
*/
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus;
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+/**
+ * Convenience init for subscribing to all possible vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModeStatus - clusterModeStatus
+ * @param myKey - myKey
+ * @param windowStatus - windowStatus
+ * @param handsOffSteering - handsOffSteering
+ * @param seatOccupancy - seatOccupancy
+ * @return A SDLSubscribeVehicleData object
+ */
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange climateData:(nullable NSNumber<SDLBool> *)climateData turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey windowStatus:(nullable NSNumber<SDLBool> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy;
/**
* See GearStatus
@@ -135,9 +173,19 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *instantFuelConsumption;
/**
- * A boolean value. If true, subscribes External Temperature data.
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
*/
-@property (strong, nonatomic, nullable) NSNumber<SDLBool> *externalTemperature;
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *climateData;
+
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *externalTemperature __deprecated_msg("Use climateData instead on 7.1+ RPC version connections");
/**
* See PRNDL. This parameter is deprecated and it is now covered in `gearStatus`
@@ -284,6 +332,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable NSNumber<SDLBool> *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSubscribeVehicleData.m b/SmartDeviceLink/public/SDLSubscribeVehicleData.m
index 0e8b39c53..d63fe65e6 100644
--- a/SmartDeviceLink/public/SDLSubscribeVehicleData.m
+++ b/SmartDeviceLink/public/SDLSubscribeVehicleData.m
@@ -24,19 +24,32 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus {
- self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:@(fuelRange) externalTemperature:@(externalTemperature) turnSignal:@(turnSignal) gearStatus:nil tirePressure:@(tirePressure) odometer:@(odometer) beltStatus:@(beltStatus) bodyInformation:@(bodyInformation) deviceStatus:@(deviceStatus) driverBraking:@(driverBraking) wiperStatus:@(wiperStatus) headLampStatus:@(headLampStatus) engineTorque:@(engineTorque) accPedalPosition:@(accelerationPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:@(electronicParkBrakeStatus) cloudAppVehicleID:@(cloudAppVehicleID) stabilityControlsStatus:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil windowStatus:nil];
+ self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:@(fuelRange) climateData:nil turnSignal:@(turnSignal) gearStatus:nil tirePressure:@(tirePressure) odometer:@(odometer) beltStatus:@(beltStatus) bodyInformation:@(bodyInformation) deviceStatus:@(deviceStatus) driverBraking:@(driverBraking) wiperStatus:@(wiperStatus) headLampStatus:@(headLampStatus) engineTorque:@(engineTorque) accPedalPosition:nil steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:@(electronicParkBrakeStatus) cloudAppVehicleID:@(cloudAppVehicleID) stabilityControlsStatus:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) windowStatus:nil handsOffSteering:nil seatOccupancy:nil];
if (self) {
+ self.accPedalPosition = @(accelerationPedalPosition);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.fuelLevel = @(fuelLevel);
self.fuelLevel_State = @(fuelLevelState);
self.prndl = @(prndl);
+ self.externalTemperature = @(externalTemperature);
#pragma clang diagnostic pop
}
return self;
}
- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus {
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange climateData:(nullable NSNumber<SDLBool> *)climateData turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey windowStatus:(nullable NSNumber<SDLBool> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -46,7 +59,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.gearStatus = gearStatus;
self.tirePressure = tirePressure;
@@ -69,8 +82,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -138,6 +152,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil];
}
+- (void)setClimateData:(nullable NSNumber<SDLBool> *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable NSNumber<SDLBool> *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:NSNumber.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -348,6 +370,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSNumber.class error:nil];
}
+- (void)setSeatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable NSNumber<SDLBool> *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.h b/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.h
index 5e37053d8..de02ed1ef 100644
--- a/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.h
+++ b/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.h
@@ -51,7 +51,46 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLSubscribeVehicleDataResponse object
*/
-- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange externalTemperature:(nullable SDLVehicleDataResult *)externalTemperature turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering windowStatus:(nullable SDLVehicleDataResult *)windowStatus;
+- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange externalTemperature:(nullable SDLVehicleDataResult *)externalTemperature turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering windowStatus:(nullable SDLVehicleDataResult *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+
+/**
+ * Convenience init for setting all possible values on vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModes - clusterModes
+ * @param myKey - myKey
+ * @param windowStatus - windowStatus
+ * @param handsOffSteering - handsOffSteering
+ * @param seatOccupancy - seatOccupancy
+ * @return A SDLSubscribeVehicleDataResponse object
+ */
+- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange climateData:(nullable SDLVehicleDataResult *)climateData turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey windowStatus:(nullable SDLVehicleDataResult *)windowStatus handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering seatOccupancy:(nullable SDLVehicleDataResult *)seatOccupancy;
/**
* See GearStatus
@@ -110,11 +149,19 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLVehicleDataResult *instantFuelConsumption;
/**
- The result of requesting to subscribe to the external temperature in degrees celsius.
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLVehicleDataResult *climateData;
- Optional
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
*/
-@property (strong, nonatomic, nullable) SDLVehicleDataResult *externalTemperature;
+@property (nullable, strong, nonatomic) SDLVehicleDataResult *externalTemperature __deprecated_msg("Use climateData instead on 7.1+ RPC version connections");
/**
* See PRNDL. This parameter is deprecated and it is now covered in `gearStatus`
@@ -301,6 +348,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable SDLVehicleDataResult *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLVehicleDataResult *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.m b/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.m
index 332847ed6..3ee8eab91 100644
--- a/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.m
+++ b/SmartDeviceLink/public/SDLSubscribeVehicleDataResponse.m
@@ -25,6 +25,18 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange externalTemperature:(nullable SDLVehicleDataResult *)externalTemperature turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering windowStatus:(nullable SDLVehicleDataResult *)windowStatus {
+
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModes:clusterModes myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange climateData:(nullable SDLVehicleDataResult *)climateData turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey windowStatus:(nullable SDLVehicleDataResult *)windowStatus handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering seatOccupancy:(nullable SDLVehicleDataResult *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -34,7 +46,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.gearStatus = gearStatus;
self.tirePressure = tirePressure;
@@ -57,8 +69,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModes = clusterModes;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -126,6 +139,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:SDLVehicleDataResult.class error:nil];
}
+- (void)setClimateData:(nullable SDLVehicleDataResult *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable SDLVehicleDataResult *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:SDLVehicleDataResult.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable SDLVehicleDataResult *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -336,6 +357,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:SDLVehicleDataResult.class error:nil];
}
+- (void)setSeatOccupancy:(nullable SDLVehicleDataResult *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable SDLVehicleDataResult *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:SDLVehicleDataResult.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSystemCapability.m b/SmartDeviceLink/public/SDLSystemCapability.m
index 8cfe47dbe..114bf2478 100755
--- a/SmartDeviceLink/public/SDLSystemCapability.m
+++ b/SmartDeviceLink/public/SDLSystemCapability.m
@@ -217,6 +217,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameDriverDistractionCapability ofClass:SDLDriverDistractionCapability.class error:nil];
}
+// for debugging only
+- (NSString *)description {
+ if ([self.systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming]) {
+ return [NSString stringWithFormat:@"<%@:%p>type:VIDEO_STREAMING {%@}", NSStringFromClass(self.class), self,
+ self.videoStreamingCapability];
+ }
+ return [super description];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSystemCapabilityManager.h b/SmartDeviceLink/public/SDLSystemCapabilityManager.h
index 42467a2fb..9d25b5729 100644
--- a/SmartDeviceLink/public/SDLSystemCapabilityManager.h
+++ b/SmartDeviceLink/public/SDLSystemCapabilityManager.h
@@ -232,7 +232,7 @@ typedef void (^SDLCapabilityUpdateWithErrorHandler)(SDLSystemCapability * _Nulla
* To get the capabilities of the main window on the main display (i.e. your app's primary app screen on the head unit itself).
*
* @param windowID The ID of the window from which to get capabilities
- * @returns The window window capabilities of the window with the specified windowID, or nil if the window is not known or no window capabilities exist.
+ * @returns The window capabilities of the window with the specified windowID, or nil if the window is not known or no window capabilities exist.
*/
- (nullable SDLWindowCapability *)windowCapabilityWithWindowID:(NSUInteger)windowID;
diff --git a/SmartDeviceLink/public/SDLSystemCapabilityManager.m b/SmartDeviceLink/public/SDLSystemCapabilityManager.m
index 8d7e14a78..4d9160f92 100644
--- a/SmartDeviceLink/public/SDLSystemCapabilityManager.m
+++ b/SmartDeviceLink/public/SDLSystemCapabilityManager.m
@@ -53,7 +53,10 @@ typedef NSString * SDLServiceID;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (nullable, strong, nonatomic, readwrite) NSArray<SDLDisplayCapability *> *displays;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@property (nullable, strong, nonatomic, readwrite) SDLDisplayCapabilities *displayCapabilities;
+#pragma clang diagnostic pop
@property (nullable, strong, nonatomic, readwrite) SDLHMICapabilities *hmiCapabilities;
@property (nullable, copy, nonatomic, readwrite) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
@property (nullable, copy, nonatomic, readwrite) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
@@ -167,13 +170,14 @@ typedef NSString * SDLServiceID;
return nil;
}
- SDLDisplayCapability *mainDisplay = capabilities.firstObject;
+ SDLDisplayCapability *mainDisplay = capabilities[0];
for (SDLWindowCapability *windowCapability in mainDisplay.windowCapabilities) {
NSUInteger currentWindowID = windowCapability.windowID != nil ? windowCapability.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
- if (currentWindowID == windowID) {
- return windowCapability;
- }
+ if (currentWindowID != windowID) { continue; }
+
+ return windowCapability;
}
+
return nil;
}
@@ -200,6 +204,8 @@ typedef NSString * SDLServiceID;
/// @param display The old-style `SDLDisplayCapabilities` object to convert
/// @param buttons The old-style `SDLButtonCapabilities` object to convert
/// @param softButtons The old-style `SDLSoftButtonCapabilities` to convert
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (NSArray<SDLDisplayCapability *> *)sdl_createDisplayCapabilityListFromDeprecatedDisplayCapabilities:(SDLDisplayCapabilities *)display buttons:(NSArray<SDLButtonCapabilities *> *)buttons softButtons:(NSArray<SDLSoftButtonCapabilities *> *)softButtons {
SDLLogV(@"Creating display capability from deprecated display capabilities");
// Based on deprecated Display capabilities we don't know if widgets are supported. The default MAIN window is the only window we know is supported, so it's the only one we will expose.
@@ -245,6 +251,7 @@ typedef NSString * SDLServiceID;
displayCapability.windowCapabilities = @[defaultWindowCapability];
return @[displayCapability];
}
+#pragma clang diagnostic pop
#pragma mark Convert New to Deprecated
@@ -257,7 +264,10 @@ typedef NSString * SDLServiceID;
}
// Create the deprecated capabilities for backward compatibility if developers try to access them
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLDisplayCapabilities *convertedCapabilities = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic pop
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
convertedCapabilities.displayType = SDLDisplayTypeGeneric; // deprecated but it is mandatory
@@ -374,15 +384,13 @@ typedef NSString * SDLServiceID;
[self.connectionManager sendConnectionRequest:getSystemCapability withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (![response isKindOfClass:[SDLGetSystemCapabilityResponse class]]) {
SDLLogE(@"GetSystemCapability failed, type: %@, did not return a GetSystemCapability response", type);
- if (handler == nil) { return; }
- handler(nil, NO, [NSError sdl_systemCapabilityManager_moduleDoesNotSupportSystemCapabilities]);
+ [self sdl_notifyObserversOfCapabilityType:getSystemCapability.systemCapabilityType capability:nil error:[NSError sdl_systemCapabilityManager_moduleDoesNotSupportSystemCapabilities]];
return;
}
if (response.success.boolValue == false) {
SDLLogE(@"GetSystemCapability failed, type: %@, error: %@", type, error);
- if (handler == nil) { return; }
- handler(nil, NO, error);
+ [self sdl_notifyObserversOfCapabilityType:getSystemCapability.systemCapabilityType capability:nil error:error];
return;
}
@@ -399,6 +407,12 @@ typedef NSString * SDLServiceID;
}];
}
+- (void)sdl_notifyObserversOfCapabilityType:(SDLSystemCapabilityType)type capability:(nullable SDLSystemCapability *)capability error:(nullable NSError *)error {
+ for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[type]) {
+ [self sdl_invokeObserver:observer withCapabilityType:type capability:capability error:error];
+ }
+}
+
#pragma mark Saving Capability Responses
/**
@@ -653,10 +667,7 @@ typedef NSString * SDLServiceID;
SDLLogV(@"Calling observers for type: %@ with update: %@", type, capability);
[self sdl_removeNilObserversAndUnsubscribeIfNecessary];
-
- for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[type]) {
- [self sdl_invokeObserver:observer withCapabilityType:type capability:capability error:error];
- }
+ [self sdl_notifyObserversOfCapabilityType:type capability:capability error:error];
if (handler == nil) { return; }
handler(capability, self.subscriptionStatus[type].boolValue, error);
diff --git a/SmartDeviceLink/public/SDLSystemInfo.h b/SmartDeviceLink/public/SDLSystemInfo.h
new file mode 100644
index 000000000..0a14f7fb8
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSystemInfo.h
@@ -0,0 +1,43 @@
+//
+// SDLSystemInfo.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 2/23/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLVehicleType;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLSystemInfo : NSObject
+
+/// The connected module's vehicle type: it's make, model, trim, and model year
+@property (strong, nonatomic, readonly, nullable) SDLVehicleType *vehicleType;
+
+/// The connected module's software version
+@property (strong, nonatomic, readonly, nullable) NSString *systemSoftwareVersion;
+
+/// The connected module's hardware version
+@property (strong, nonatomic, readonly, nullable) NSString *systemHardwareVersion;
+
+/// Initialize a system info object with individual pieces
+/// @param make The vehicle's make
+/// @param model The vehicle's model
+/// @param trim The vehicle's trim
+/// @param modelYear The vehicle's model year
+/// @param softwareVersion The vehicle's software version
+/// @param hardwareVersion The vehicle's hardware version
+- (instancetype)initWithMake:(nullable NSString *)make model:(nullable NSString *)model trim:(nullable NSString *)trim modelYear:(nullable NSString *)modelYear softwareVersion:(nullable NSString *)softwareVersion hardwareVersion:(nullable NSString *)hardwareVersion;
+
+/// Initialize a system info object with the vehicle type and versions
+/// @param vehicleType The vehicle information
+/// @param softwareVersion The vehicle's software version
+/// @param hardwareVersion The vehicle's hardware version
+- (instancetype)initWithVehicleType:(nullable SDLVehicleType *)vehicleType softwareVersion:(nullable NSString *)softwareVersion hardwareVersion:(nullable NSString *)hardwareVersion;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLSystemInfo.m b/SmartDeviceLink/public/SDLSystemInfo.m
new file mode 100644
index 000000000..8b0df3100
--- /dev/null
+++ b/SmartDeviceLink/public/SDLSystemInfo.m
@@ -0,0 +1,49 @@
+//
+// SDLSystemInfo.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 2/23/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLSystemInfo.h"
+
+#import "SDLVehicleType.h"
+
+@interface SDLSystemInfo ()
+
+@property (strong, nonatomic, readwrite, nullable) SDLVehicleType *vehicleType;
+@property (strong, nonatomic, readwrite, nullable) NSString *systemSoftwareVersion;
+@property (strong, nonatomic, readwrite, nullable) NSString *systemHardwareVersion;
+
+@end
+
+@implementation SDLSystemInfo
+
+- (instancetype)initWithMake:(nullable NSString *)make model:(nullable NSString *)model trim:(nullable NSString *)trim modelYear:(nullable NSString *)modelYear softwareVersion:(nullable NSString *)softwareVersion hardwareVersion:(nullable NSString *)hardwareVersion {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _vehicleType = [[SDLVehicleType alloc] initWithMake:make model:model modelYear:modelYear trim:trim];
+ _systemSoftwareVersion = softwareVersion;
+ _systemHardwareVersion = hardwareVersion;
+
+ return self;
+}
+
+- (instancetype)initWithVehicleType:(nullable SDLVehicleType *)vehicleType softwareVersion:(nullable NSString *)softwareVersion hardwareVersion:(nullable NSString *)hardwareVersion {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _vehicleType = vehicleType;
+ _systemSoftwareVersion = softwareVersion;
+ _systemHardwareVersion = hardwareVersion;
+
+ return self;
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"Vehicle Type: %@, software version: %@, hardware version: %@", _vehicleType, _systemSoftwareVersion, _systemHardwareVersion];
+}
+
+@end
diff --git a/SmartDeviceLink/public/SDLTTSChunk.h b/SmartDeviceLink/public/SDLTTSChunk.h
index d0d04a0fd..3eb3f6a64 100644
--- a/SmartDeviceLink/public/SDLTTSChunk.h
+++ b/SmartDeviceLink/public/SDLTTSChunk.h
@@ -10,7 +10,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).
- In SDL, words, and therefore sentences, can be built up from phonemes and are used to explicitly provide the proper pronounciation to the TTS engine. For example, to have SDL pronounce the word "read" as "red", rather than as when it is pronounced like "reed", the developer would use phonemes to express this desired pronounciation.
+ In SDL, words, and therefore sentences, can be built up from phonemes and are used to explicitly provide the proper pronunciation to the TTS engine. For example, to have SDL pronounce the word "read" as "red", rather than as when it is pronounced like "reed", the developer would use phonemes to express this desired pronunciation.
For more information about phonemes, see <a href="http://en.wikipedia.org/wiki/Phoneme">http://en.wikipedia.org/wiki/Phoneme</a>.
diff --git a/SmartDeviceLink/public/SDLTemplateConfiguration.h b/SmartDeviceLink/public/SDLTemplateConfiguration.h
index 39d0b0df7..79f04b32d 100644
--- a/SmartDeviceLink/public/SDLTemplateConfiguration.h
+++ b/SmartDeviceLink/public/SDLTemplateConfiguration.h
@@ -33,7 +33,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
- Convinience constructor with all the parameters.
+ Convenience constructor with all the parameters.
@param template Predefined or dynamically created window template. Currently only predefined window template layouts are defined.
@param dayColorScheme The color scheme to use when the head unit is in a light / day situation. If nil, the existing color scheme will be used.
diff --git a/SmartDeviceLink/public/SDLTextField.h b/SmartDeviceLink/public/SDLTextField.h
index a345ff145..0ce0f4009 100644
--- a/SmartDeviceLink/public/SDLTextField.h
+++ b/SmartDeviceLink/public/SDLTextField.h
@@ -44,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic) NSNumber<SDLInt> *rows;
-/// Convenience initalizer for the TextField RPC struct
+/// Convenience initializer for the TextField RPC struct
/// @param name The name identifying this text field
/// @param characterSet The character set of this text field
/// @param width The number of characters per row allowed in this text field
diff --git a/SmartDeviceLink/public/SDLTextFieldName.h b/SmartDeviceLink/public/SDLTextFieldName.h
index 57d741026..33fb61eaf 100644
--- a/SmartDeviceLink/public/SDLTextFieldName.h
+++ b/SmartDeviceLink/public/SDLTextFieldName.h
@@ -81,8 +81,11 @@ extern SDLTextFieldName const SDLTextFieldNameStatusBar;
* Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.
*
* @discussion This field is commonly used to show elapsed or remaining time in an audio track or audio capture.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 1.0.0
*/
-extern SDLTextFieldName const SDLTextFieldNameMediaClock;
+extern SDLTextFieldName const SDLTextFieldNameMediaClock __deprecated;
/**
* The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.
@@ -229,6 +232,20 @@ extern SDLTextFieldName const SDLTextFieldNameAddressLines;
extern SDLTextFieldName const SDLTextFieldNamePhoneNumber;
/**
+ * Optional time to destination field for ShowConstantTBT
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLTextFieldName const SDLTextFieldNameTimeToDestination;
+
+/**
+ * Turn text for turnList parameter of UpdateTurnList
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLTextFieldName const SDLTextFieldNameTurnText;
+
+/**
* The first line of the subtle alert text field; applies to `SubtleAlert` `alertText1`
*
* @since SDL 7.0.0
@@ -248,3 +265,31 @@ extern SDLTextFieldName const SDLTextFieldNameSubtleAlertText2;
* @since SDL 7.0.0
*/
extern SDLTextFieldName const SDLTextFieldNameSubtleAlertSoftButtonText;
+
+/**
+ * Secondary text for AddCommand
+ *
+ * @added in SmartDeviceLink 7.0.0
+ */
+extern SDLTextFieldName const SDLTextFieldNameMenuCommandSecondaryText;
+
+/**
+ * Tertiary text for AddCommand
+ *
+ * @added in SmartDeviceLink 7.0.0
+ */
+extern SDLTextFieldName const SDLTextFieldNameMenuCommandTertiaryText;
+
+/**
+ * Secondary text for AddSubMenu
+ *
+ * @added in SmartDeviceLink 7.0.0
+ */
+extern SDLTextFieldName const SDLTextFieldNameMenuSubMenuSecondaryText;
+
+/**
+ * Tertiary text for AddSubMenu
+ *
+ * @added in SmartDeviceLink 7.0.0
+ */
+extern SDLTextFieldName const SDLTextFieldNameMenuSubMenuTertiaryText;
diff --git a/SmartDeviceLink/public/SDLTextFieldName.m b/SmartDeviceLink/public/SDLTextFieldName.m
index 54f8c781e..d02826ca2 100644
--- a/SmartDeviceLink/public/SDLTextFieldName.m
+++ b/SmartDeviceLink/public/SDLTextFieldName.m
@@ -61,6 +61,12 @@ SDLTextFieldName const SDLTextFieldNameLocationName = @"locationName";
SDLTextFieldName const SDLTextFieldNameLocationDescription = @"locationDescription";
SDLTextFieldName const SDLTextFieldNameAddressLines = @"addressLines";
SDLTextFieldName const SDLTextFieldNamePhoneNumber = @"phoneNumber";
+SDLTextFieldName const SDLTextFieldNameTimeToDestination = @"timeToDestination";
+SDLTextFieldName const SDLTextFieldNameTurnText = @"turnText";
SDLTextFieldName const SDLTextFieldNameSubtleAlertText1 = @"subtleAlertText1";
SDLTextFieldName const SDLTextFieldNameSubtleAlertText2 = @"subtleAlertText2";
SDLTextFieldName const SDLTextFieldNameSubtleAlertSoftButtonText = @"subtleAlertSoftButtonText";
+SDLTextFieldName const SDLTextFieldNameMenuCommandSecondaryText = @"menuCommandSecondaryText";
+SDLTextFieldName const SDLTextFieldNameMenuCommandTertiaryText = @"menuCommandTertiaryText";
+SDLTextFieldName const SDLTextFieldNameMenuSubMenuSecondaryText = @"menuSubMenuSecondaryText";
+SDLTextFieldName const SDLTextFieldNameMenuSubMenuTertiaryText = @"menuSubMenuTertiaryText";
diff --git a/SmartDeviceLink/public/SDLTireStatus.h b/SmartDeviceLink/public/SDLTireStatus.h
index 2d00f1787..e61341f6e 100644
--- a/SmartDeviceLink/public/SDLTireStatus.h
+++ b/SmartDeviceLink/public/SDLTireStatus.h
@@ -57,7 +57,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLSingleTireStatus *innerLeftRear;
/**
- The status of the innter right rear tire.
+ The status of the inner right rear tire.
Required
*/
diff --git a/SmartDeviceLink/public/SDLTouch.h b/SmartDeviceLink/public/SDLTouch.h
index b6df4bacf..2919531b5 100644
--- a/SmartDeviceLink/public/SDLTouch.h
+++ b/SmartDeviceLink/public/SDLTouch.h
@@ -49,7 +49,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
* @abstract
- * Timestamp in which the touch occured.
+ * Timestamp in which the touch occurred.
*/
@property (nonatomic, assign, readonly) NSUInteger timeStamp;
diff --git a/SmartDeviceLink/public/SDLTouchManager.m b/SmartDeviceLink/public/SDLTouchManager.m
index ad9eb4703..a50408fbb 100644
--- a/SmartDeviceLink/public/SDLTouchManager.m
+++ b/SmartDeviceLink/public/SDLTouchManager.m
@@ -238,7 +238,7 @@ static NSUInteger const MaximumNumberOfTouches = 2;
if ([self.touchEventDelegate respondsToSelector:@selector(touchManager:pinchDidStartInView:atCenterPoint:)]) {
CGPoint center = self.currentPinchGesture.center;
dispatch_async(dispatch_get_main_queue(), ^{
- UIView *hitView = (self.hitTester != nil) ? [self.hitTester viewForPoint:center] : nil;
+ UIView *hitView = [self.hitTester viewForPoint:center];
[self.touchEventDelegate touchManager:self pinchDidStartInView:hitView atCenterPoint:center];
});
}
@@ -434,12 +434,16 @@ static NSUInteger const MaximumNumberOfTouches = 2;
[self sdl_cancelSingleTapTimer];
}
- __weak typeof(self) weakSelf = self;
- self.singleTapTimer = [[SDLTimer alloc] initWithDuration:self.tapTimeThreshold];
- self.singleTapTimer.elapsedBlock = ^{
- [weakSelf sdl_singleTapTimerCallbackWithPoint:point];
- };
- [self.singleTapTimer start];
+ if (self.tapTimeThreshold == 0.0) {
+ [self sdl_singleTapTimerCallbackWithPoint:point];
+ } else {
+ __weak typeof(self) weakSelf = self;
+ self.singleTapTimer = [[SDLTimer alloc] initWithDuration:self.tapTimeThreshold];
+ self.singleTapTimer.elapsedBlock = ^{
+ [weakSelf sdl_singleTapTimerCallbackWithPoint:point];
+ };
+ [self.singleTapTimer start];
+ }
}
/**
diff --git a/SmartDeviceLink/public/SDLTouchManagerDelegate.h b/SmartDeviceLink/public/SDLTouchManagerDelegate.h
index 1e3bc57b5..f6a85fd36 100644
--- a/SmartDeviceLink/public/SDLTouchManagerDelegate.h
+++ b/SmartDeviceLink/public/SDLTouchManagerDelegate.h
@@ -83,7 +83,7 @@ NS_ASSUME_NONNULL_BEGIN
* @abstract
* Pinch did move.
* @param manager
- * Current initalized SDLTouchManager issuing the callback.
+ * Current initialized SDLTouchManager issuing the callback.
* @param point
* Center point of the pinch in the head unit's coordinate system.
* @param scale
diff --git a/SmartDeviceLink/public/SDLUnsubscribeVehicleData.h b/SmartDeviceLink/public/SDLUnsubscribeVehicleData.h
index 57acba53d..04b08cf29 100644
--- a/SmartDeviceLink/public/SDLUnsubscribeVehicleData.h
+++ b/SmartDeviceLink/public/SDLUnsubscribeVehicleData.h
@@ -55,7 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param wiperStatus Unsubscribe to wiperStatus
* @return A SDLUnsubscribeVehicleData object
*/
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
/**
* Convenience init for unsubscribing from all possible vehicle data items.
@@ -92,7 +92,45 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLUnsubscribeVehicleData object
*/
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus;
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+/**
+ * Convenience init for unsubscribing from all possible vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModeStatus - clusterModeStatus
+ * @param myKey - myKey
+ * @param windowStatus - windowStatus
+ * @param handsOffSteering - handsOffSteering
+ * @param seatOccupancy - seatOccupancy
+ * @return A SDLUnsubscribeVehicleData object
+ */
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange climateData:(nullable NSNumber<SDLBool> *)climateData turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey windowStatus:(nullable NSNumber<SDLBool> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy;
/**
* See GearStatus
@@ -137,9 +175,19 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *instantFuelConsumption;
/**
- * If true, unsubscribes from External Temperature
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
*/
-@property (strong, nonatomic, nullable) NSNumber<SDLBool> *externalTemperature;
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *climateData;
+
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *externalTemperature __deprecated_msg("Use climateData instead on 7.1+ RPC version connections");
/**
* See PRNDL. This parameter is deprecated and it is now covered in `gearStatus`
@@ -286,6 +334,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable NSNumber<SDLBool> *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLUnsubscribeVehicleData.m b/SmartDeviceLink/public/SDLUnsubscribeVehicleData.m
index 217c23ce5..569d5bcfb 100644
--- a/SmartDeviceLink/public/SDLUnsubscribeVehicleData.m
+++ b/SmartDeviceLink/public/SDLUnsubscribeVehicleData.m
@@ -23,20 +23,32 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma clang diagnostic pop
-- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus {
- self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:@(fuelRange) externalTemperature:@(externalTemperature) turnSignal:@(turnSignal) gearStatus:nil tirePressure:@(tirePressure) odometer:@(odometer) beltStatus:@(beltStatus) bodyInformation:@(bodyInformation) deviceStatus:@(deviceStatus) driverBraking:@(driverBraking) wiperStatus:@(wiperStatus) headLampStatus:@(headLampStatus) engineTorque:@(engineTorque) accPedalPosition:@(accelerationPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:@(electronicParkBrakeStatus) cloudAppVehicleID:@(cloudAppVehicleID) stabilityControlsStatus:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil windowStatus:nil];
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation cloudAppVehicleID:(BOOL)cloudAppVehicleID clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo electronicParkBrakeStatus:(BOOL)electronicParkBrakeStatus emergencyEvent:(BOOL)emergencyEvent engineOilLife:(BOOL)engineOilLife engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState fuelRange:(BOOL)fuelRange gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure turnSignal:(BOOL)turnSignal wiperStatus:(BOOL)wiperStatus {
+ self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:@(fuelRange) climateData:nil turnSignal:@(turnSignal) gearStatus:nil tirePressure:@(tirePressure) odometer:@(odometer) beltStatus:@(beltStatus) bodyInformation:@(bodyInformation) deviceStatus:@(deviceStatus) driverBraking:@(driverBraking) wiperStatus:@(wiperStatus) headLampStatus:@(headLampStatus) engineTorque:@(engineTorque) accPedalPosition:@(accPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:@(electronicParkBrakeStatus) cloudAppVehicleID:@(cloudAppVehicleID) stabilityControlsStatus:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) windowStatus:nil handsOffSteering:nil seatOccupancy:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.fuelLevel = @(fuelLevel);
self.fuelLevel_State = @(fuelLevelState);
self.prndl = @(prndl);
+ self.externalTemperature = @(externalTemperature);
#pragma clang diagnostic pop
}
return self;
}
- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange externalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering windowStatus:(nullable NSNumber<SDLBool> *)windowStatus {
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm instantFuelConsumption:(nullable NSNumber<SDLBool> *)instantFuelConsumption fuelRange:(nullable NSNumber<SDLBool> *)fuelRange climateData:(nullable NSNumber<SDLBool> *)climateData turnSignal:(nullable NSNumber<SDLBool> *)turnSignal gearStatus:(nullable NSNumber<SDLBool> *)gearStatus tirePressure:(nullable NSNumber<SDLBool> *)tirePressure odometer:(nullable NSNumber<SDLBool> *)odometer beltStatus:(nullable NSNumber<SDLBool> *)beltStatus bodyInformation:(nullable NSNumber<SDLBool> *)bodyInformation deviceStatus:(nullable NSNumber<SDLBool> *)deviceStatus driverBraking:(nullable NSNumber<SDLBool> *)driverBraking wiperStatus:(nullable NSNumber<SDLBool> *)wiperStatus headLampStatus:(nullable NSNumber<SDLBool> *)headLampStatus engineTorque:(nullable NSNumber<SDLBool> *)engineTorque accPedalPosition:(nullable NSNumber<SDLBool> *)accPedalPosition steeringWheelAngle:(nullable NSNumber<SDLBool> *)steeringWheelAngle engineOilLife:(nullable NSNumber<SDLBool> *)engineOilLife electronicParkBrakeStatus:(nullable NSNumber<SDLBool> *)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSNumber<SDLBool> *)cloudAppVehicleID stabilityControlsStatus:(nullable NSNumber<SDLBool> *)stabilityControlsStatus eCallInfo:(nullable NSNumber<SDLBool> *)eCallInfo airbagStatus:(nullable NSNumber<SDLBool> *)airbagStatus emergencyEvent:(nullable NSNumber<SDLBool> *)emergencyEvent clusterModeStatus:(nullable NSNumber<SDLBool> *)clusterModeStatus myKey:(nullable NSNumber<SDLBool> *)myKey windowStatus:(nullable NSNumber<SDLBool> *)windowStatus handsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering seatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -46,7 +58,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.gearStatus = gearStatus;
self.tirePressure = tirePressure;
@@ -69,8 +81,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -138,6 +151,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil];
}
+- (void)setClimateData:(nullable NSNumber<SDLBool> *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable NSNumber<SDLBool> *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:NSNumber.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable NSNumber<SDLBool> *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -348,6 +369,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSNumber.class error:nil];
}
+- (void)setSeatOccupancy:(nullable NSNumber<SDLBool> *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable NSNumber<SDLBool> *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.h b/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.h
index cbc79afc3..1d5c1ae81 100644
--- a/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.h
+++ b/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.h
@@ -50,7 +50,45 @@ NS_ASSUME_NONNULL_BEGIN
* @param windowStatus - windowStatus
* @return A SDLUnsubscribeVehicleDataResponse object
*/
-- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange externalTemperature:(nullable SDLVehicleDataResult *)externalTemperature turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering windowStatus:(nullable SDLVehicleDataResult *)windowStatus;
+- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange externalTemperature:(nullable SDLVehicleDataResult *)externalTemperature turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering windowStatus:(nullable SDLVehicleDataResult *)windowStatus __deprecated_msg("Use initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy: instead");
+
+/**
+ * Convenience init for setting all possible values on vehicle data items.
+ *
+ * @param gps - gps
+ * @param speed - speed
+ * @param rpm - rpm
+ * @param instantFuelConsumption - instantFuelConsumption
+ * @param fuelRange - fuelRange
+ * @param climateData - climateData
+ * @param turnSignal - turnSignal
+ * @param gearStatus - gearStatus
+ * @param tirePressure - tirePressure
+ * @param odometer - odometer
+ * @param beltStatus - beltStatus
+ * @param bodyInformation - bodyInformation
+ * @param deviceStatus - deviceStatus
+ * @param driverBraking - driverBraking
+ * @param wiperStatus - wiperStatus
+ * @param headLampStatus - headLampStatus
+ * @param engineTorque - engineTorque
+ * @param accPedalPosition - accPedalPosition
+ * @param steeringWheelAngle - steeringWheelAngle
+ * @param engineOilLife - engineOilLife
+ * @param electronicParkBrakeStatus - electronicParkBrakeStatus
+ * @param cloudAppVehicleID - cloudAppVehicleID
+ * @param stabilityControlsStatus - stabilityControlsStatus
+ * @param eCallInfo - eCallInfo
+ * @param airbagStatus - airbagStatus
+ * @param emergencyEvent - emergencyEvent
+ * @param clusterModes - clusterModes
+ * @param myKey - myKey
+ * @param windowStatus - windowStatus
+ * @param handsOffSteering - handsOffSteering
+ * @param seatOccupancy - seatOccupancy
+ * @return A SDLUnsubscribeVehicleDataResponse object
+ */
+- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange climateData:(nullable SDLVehicleDataResult *)climateData turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey windowStatus:(nullable SDLVehicleDataResult *)windowStatus handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering seatOccupancy:(nullable SDLVehicleDataResult *)seatOccupancy;
/**
* See GearStatus
@@ -109,11 +147,19 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLVehicleDataResult *instantFuelConsumption;
/**
- The result of requesting to unsubscribe to the external temperature in degrees celsius.
+ * See ClimateData
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *climateData;
- Optional
+/**
+ * The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ *
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
*/
-@property (strong, nonatomic, nullable) SDLVehicleDataResult *externalTemperature;
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *externalTemperature __deprecated_msg("use climateData instead on 7.1+ RPC version connections");
/**
* See PRNDL. This parameter is deprecated and it is now covered in `gearStatus`
@@ -300,6 +346,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (nullable SDLVehicleDataResult *)getOEMCustomVehicleData:(NSString *)vehicleDataName;
+/**
+ * See SeatOccupancy
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLVehicleDataResult *seatOccupancy;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.m b/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.m
index 3a44257e1..5fd1af7b5 100644
--- a/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.m
+++ b/SmartDeviceLink/public/SDLUnsubscribeVehicleDataResponse.m
@@ -25,6 +25,17 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange externalTemperature:(nullable SDLVehicleDataResult *)externalTemperature turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering windowStatus:(nullable SDLVehicleDataResult *)windowStatus {
+ self = [self initWithGps:gps speed:speed rpm:rpm instantFuelConsumption:instantFuelConsumption fuelRange:fuelRange climateData:nil turnSignal:turnSignal gearStatus:gearStatus tirePressure:tirePressure odometer:odometer beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:engineTorque accPedalPosition:accPedalPosition steeringWheelAngle:steeringWheelAngle engineOilLife:engineOilLife electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModes:clusterModes myKey:myKey windowStatus:windowStatus handsOffSteering:handsOffSteering seatOccupancy:nil];
+ if (self) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.externalTemperature = externalTemperature;
+#pragma clang diagnostic pop
+ }
+ return self;
+}
+
+- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm instantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption fuelRange:(nullable SDLVehicleDataResult *)fuelRange climateData:(nullable SDLVehicleDataResult *)climateData turnSignal:(nullable SDLVehicleDataResult *)turnSignal gearStatus:(nullable SDLVehicleDataResult *)gearStatus tirePressure:(nullable SDLVehicleDataResult *)tirePressure odometer:(nullable SDLVehicleDataResult *)odometer beltStatus:(nullable SDLVehicleDataResult *)beltStatus bodyInformation:(nullable SDLVehicleDataResult *)bodyInformation deviceStatus:(nullable SDLVehicleDataResult *)deviceStatus driverBraking:(nullable SDLVehicleDataResult *)driverBraking wiperStatus:(nullable SDLVehicleDataResult *)wiperStatus headLampStatus:(nullable SDLVehicleDataResult *)headLampStatus engineTorque:(nullable SDLVehicleDataResult *)engineTorque accPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition steeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle engineOilLife:(nullable SDLVehicleDataResult *)engineOilLife electronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus cloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID stabilityControlsStatus:(nullable SDLVehicleDataResult *)stabilityControlsStatus eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey windowStatus:(nullable SDLVehicleDataResult *)windowStatus handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering seatOccupancy:(nullable SDLVehicleDataResult *)seatOccupancy {
self = [self init];
if (!self) {
return nil;
@@ -34,7 +45,7 @@ NS_ASSUME_NONNULL_BEGIN
self.rpm = rpm;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
- self.externalTemperature = externalTemperature;
+ self.climateData = climateData;
self.turnSignal = turnSignal;
self.gearStatus = gearStatus;
self.tirePressure = tirePressure;
@@ -57,8 +68,9 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModes = clusterModes;
self.myKey = myKey;
- self.handsOffSteering = handsOffSteering;
self.windowStatus = windowStatus;
+ self.handsOffSteering = handsOffSteering;
+ self.seatOccupancy = seatOccupancy;
return self;
}
@@ -127,6 +139,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:SDLVehicleDataResult.class error:nil];
}
+- (void)setClimateData:(nullable SDLVehicleDataResult *)climateData {
+ [self.parameters sdl_setObject:climateData forName:SDLRPCParameterNameClimateData];
+}
+
+- (nullable SDLVehicleDataResult *)climateData {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameClimateData ofClass:SDLVehicleDataResult.class error:nil];
+}
+
- (void)setExternalTemperature:(nullable SDLVehicleDataResult *)externalTemperature {
[self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature];
}
@@ -337,6 +357,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:SDLVehicleDataResult.class error:nil];
}
+- (void)setSeatOccupancy:(nullable SDLVehicleDataResult *)seatOccupancy {
+ [self.parameters sdl_setObject:seatOccupancy forName:SDLRPCParameterNameSeatOccupancy];
+}
+
+- (nullable SDLVehicleDataResult *)seatOccupancy {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSeatOccupancy ofClass:SDLVehicleDataResult.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLVehicleDataStatus.h b/SmartDeviceLink/public/SDLVehicleDataStatus.h
index 16e32700a..7e81dad48 100644
--- a/SmartDeviceLink/public/SDLVehicleDataStatus.h
+++ b/SmartDeviceLink/public/SDLVehicleDataStatus.h
@@ -12,7 +12,7 @@
typedef SDLEnum SDLVehicleDataStatus NS_TYPED_ENUM;
/**
- No data avaliable
+ No data available
*/
extern SDLVehicleDataStatus const SDLVehicleDataStatusNoDataExists;
diff --git a/SmartDeviceLink/public/SDLVehicleDataType.h b/SmartDeviceLink/public/SDLVehicleDataType.h
index 3426695d0..d3412eff9 100644
--- a/SmartDeviceLink/public/SDLVehicleDataType.h
+++ b/SmartDeviceLink/public/SDLVehicleDataType.h
@@ -51,9 +51,16 @@ extern SDLVehicleDataType const SDLVehicleDataTypeFuelLevelState __deprecated_ms
extern SDLVehicleDataType const SDLVehicleDataTypeFuelConsumption;
/**
- Vehicle external temperature data
+ * Vehicle external temperature data
+ * @deprecated in SmartDeviceLink 7.1.0
+ * @added in SmartDeviceLink 2.0.0
*/
-extern SDLVehicleDataType const SDLVehicleDataTypeExternalTemperature;
+extern SDLVehicleDataType const SDLVehicleDataTypeExternalTemperature __deprecated_msg("Use SDLVehicleDataTypeVehicleDataClimateData instead on 7.1+ RPC version connections");
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLVehicleDataType const SDLVehicleDataTypeVehicleDataClimateData;
/**
Vehicle VIN data
@@ -157,7 +164,7 @@ extern SDLVehicleDataType const SDLVehicleDataTypeEngineOilLife;
extern SDLVehicleDataType const SDLVehicleDataTypeEngineTorque;
/**
- Vehicle accleration pedal data
+ Vehicle acceleration pedal data
*/
extern SDLVehicleDataType const SDLVehicleDataTypeAccelerationPedal;
@@ -194,3 +201,8 @@ extern SDLVehicleDataType const SDLVehicleDataTypeOEMVehicleDataType;
* @since SDL 7.0
*/
extern SDLVehicleDataType const SDLVehicleDataTypeWindowStatus;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLVehicleDataType const SDLVehicleDataTypeSeatOccupancy;
diff --git a/SmartDeviceLink/public/SDLVehicleDataType.m b/SmartDeviceLink/public/SDLVehicleDataType.m
index 90bf95888..a78eca1ca 100644
--- a/SmartDeviceLink/public/SDLVehicleDataType.m
+++ b/SmartDeviceLink/public/SDLVehicleDataType.m
@@ -37,6 +37,8 @@ SDLVehicleDataType const SDLVehicleDataTypeStabilityControlsStatus = @"VEHICLEDA
SDLVehicleDataType const SDLVehicleDataTypeSteeringWheel = @"VEHICLEDATA_STEERINGWHEEL";
SDLVehicleDataType const SDLVehicleDataTypeTirePressure = @"VEHICLEDATA_TIREPRESSURE";
SDLVehicleDataType const SDLVehicleDataTypeTurnSignal = @"VEHICLEDATA_TURNSIGNAL";
+SDLVehicleDataType const SDLVehicleDataTypeVehicleDataClimateData = @"VEHICLEDATA_CLIMATEDATA";
SDLVehicleDataType const SDLVehicleDataTypeVIN = @"VEHICLEDATA_VIN";
+SDLVehicleDataType const SDLVehicleDataTypeSeatOccupancy = @"VEHICLEDATA_SEATOCCUPANCY";
SDLVehicleDataType const SDLVehicleDataTypeWindowStatus = @"VEHICLEDATA_WINDOWSTATUS";
SDLVehicleDataType const SDLVehicleDataTypeWiperStatus = @"VEHICLEDATA_WIPERSTATUS";
diff --git a/SmartDeviceLink/public/SDLVehicleType.h b/SmartDeviceLink/public/SDLVehicleType.h
index 0c9c100dc..f2a4da7ca 100644
--- a/SmartDeviceLink/public/SDLVehicleType.h
+++ b/SmartDeviceLink/public/SDLVehicleType.h
@@ -49,6 +49,17 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic, nullable) NSString *trim;
+/**
+ * Initialize the object
+ *
+ * @param make - make
+ * @param model - model
+ * @param modelYear - modelYear
+ * @param trim - trim
+ * @return A SDLVehicleType object
+ */
+- (instancetype)initWithMake:(nullable NSString *)make model:(nullable NSString *)model modelYear:(nullable NSString *)modelYear trim:(nullable NSString *)trim;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLVehicleType.m b/SmartDeviceLink/public/SDLVehicleType.m
index 5f3df0700..15a47b9f0 100644
--- a/SmartDeviceLink/public/SDLVehicleType.m
+++ b/SmartDeviceLink/public/SDLVehicleType.m
@@ -11,6 +11,18 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLVehicleType
+- (instancetype)initWithMake:(nullable NSString *)make model:(nullable NSString *)model modelYear:(nullable NSString *)modelYear trim:(nullable NSString *)trim {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.make = make;
+ self.model = model;
+ self.modelYear = modelYear;
+ self.trim = trim;
+ return self;
+}
+
- (void)setMake:(nullable NSString *)make {
[self.store sdl_setObject:make forName:SDLRPCParameterNameMake];
}
diff --git a/SmartDeviceLink/public/SDLVideoStreamingCapability.h b/SmartDeviceLink/public/SDLVideoStreamingCapability.h
index 6a28c30bc..3bbfa426f 100644
--- a/SmartDeviceLink/public/SDLVideoStreamingCapability.h
+++ b/SmartDeviceLink/public/SDLVideoStreamingCapability.h
@@ -30,7 +30,21 @@ NS_ASSUME_NONNULL_BEGIN
@param scale The scaling factor the app should use to change the size of the projecting view
@return A SDLVideoStreamingCapability object
*/
-- (instancetype)initWithPreferredResolution:(nullable SDLImageResolution *)preferredResolution maxBitrate:(int32_t)maxBitrate supportedFormats:(nullable NSArray<SDLVideoStreamingFormat *> *)supportedFormats hapticDataSupported:(BOOL)hapticDataSupported diagonalScreenSize:(float)diagonalScreenSize pixelPerInch:(float)pixelPerInch scale:(float)scale;
+- (instancetype)initWithPreferredResolution:(nullable SDLImageResolution *)preferredResolution maxBitrate:(int32_t)maxBitrate supportedFormats:(nullable NSArray<SDLVideoStreamingFormat *> *)supportedFormats hapticDataSupported:(BOOL)hapticDataSupported diagonalScreenSize:(float)diagonalScreenSize pixelPerInch:(float)pixelPerInch scale:(float)scale __deprecated_msg("Use initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS instead");
+
+/**
+ * Convenience init for creating a video streaming capability with all parameters.
+ * @param preferredResolution - preferredResolution
+ * @param maxBitrate - maxBitrate
+ * @param supportedFormats - supportedFormats
+ * @param hapticSpatialDataSupported - hapticSpatialDataSupported
+ * @param diagonalScreenSize - diagonalScreenSize
+ * @param pixelPerInch - pixelPerInch
+ * @param scale - scale
+ * @param preferredFPS - preferredFPS
+ * @return A SDLVideoStreamingCapability object
+ */
+- (instancetype)initWithPreferredResolution:(nullable SDLImageResolution *)preferredResolution maxBitrate:(nullable NSNumber<SDLUInt> *)maxBitrate supportedFormats:(nullable NSArray<SDLVideoStreamingFormat *> *)supportedFormats hapticSpatialDataSupported:(nullable NSNumber<SDLBool> *)hapticSpatialDataSupported diagonalScreenSize:(nullable NSNumber<SDLFloat> *)diagonalScreenSize pixelPerInch:(nullable NSNumber<SDLFloat> *)pixelPerInch scale:(nullable NSNumber<SDLFloat> *)scale preferredFPS:(nullable NSNumber<SDLUInt> *)preferredFPS;
/**
The preferred resolution of a video stream for decoding and rendering on HMI
@@ -62,7 +76,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
The diagonal screen size in inches.
-
+
Float, Optional, minvalue="0"
@since SDL 6.0
*/
@@ -78,12 +92,28 @@ NS_ASSUME_NONNULL_BEGIN
/**
The scaling factor the app should use to change the size of the projecting view.
-
+
Float, Optional, minvalue="1" maxvalue="10"
@since SDL 6.0
*/
@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *scale;
+/**
+ * {"array_min_size": 1, "array_max_size": 100}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ * @note can be recursive under certain circumstances
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLVideoStreamingCapability *> *additionalVideoStreamingCapabilities;
+
+/**
+ * The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.
+ * {"num_min_value": 0, "num_max_value": 2147483647}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLUInt> *preferredFPS;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLVideoStreamingCapability.m b/SmartDeviceLink/public/SDLVideoStreamingCapability.m
index ec4f2c591..baee8a16f 100644
--- a/SmartDeviceLink/public/SDLVideoStreamingCapability.m
+++ b/SmartDeviceLink/public/SDLVideoStreamingCapability.m
@@ -6,31 +6,36 @@
// Copyright © 2017 smartdevicelink. All rights reserved.
//
-#import "SDLImageResolution.h"
+#import "SDLImageResolution+StreamingVideoExtensions.h"
#import "SDLVideoStreamingCapability.h"
#import "SDLVideoStreamingFormat.h"
#import "NSMutableDictionary+Store.h"
#import "SDLRPCParameterNames.h"
+#import "SDLStreamingVideoScaleManager.h"
NS_ASSUME_NONNULL_BEGIN
@implementation SDLVideoStreamingCapability
+// deprecated method, and will be removed in the future
- (instancetype)initWithPreferredResolution:(nullable SDLImageResolution *)preferredResolution maxBitrate:(int32_t)maxBitrate supportedFormats:(nullable NSArray<SDLVideoStreamingFormat *> *)supportedFormats hapticDataSupported:(BOOL)hapticDataSupported diagonalScreenSize:(float)diagonalScreenSize pixelPerInch:(float)pixelPerInch scale:(float)scale {
+ return [self initWithPreferredResolution:preferredResolution maxBitrate:@(maxBitrate) supportedFormats:supportedFormats hapticSpatialDataSupported:@(hapticDataSupported) diagonalScreenSize:@(diagonalScreenSize) pixelPerInch:@(pixelPerInch) scale:@(scale) preferredFPS:nil];
+}
+
+- (instancetype)initWithPreferredResolution:(nullable SDLImageResolution *)preferredResolution maxBitrate:(nullable NSNumber<SDLUInt> *)maxBitrate supportedFormats:(nullable NSArray<SDLVideoStreamingFormat *> *)supportedFormats hapticSpatialDataSupported:(nullable NSNumber<SDLBool> *)hapticSpatialDataSupported diagonalScreenSize:(nullable NSNumber<SDLFloat> *)diagonalScreenSize pixelPerInch:(nullable NSNumber<SDLFloat> *)pixelPerInch scale:(nullable NSNumber<SDLFloat> *)scale preferredFPS:(nullable NSNumber<SDLUInt> *)preferredFPS {
self = [self init];
if (!self) {
- return self;
+ return nil;
}
-
- self.maxBitrate = @(maxBitrate);
self.preferredResolution = preferredResolution;
+ self.maxBitrate = maxBitrate;
self.supportedFormats = supportedFormats;
- self.hapticSpatialDataSupported = @(hapticDataSupported);
- self.diagonalScreenSize = @(diagonalScreenSize);
- self.pixelPerInch = @(pixelPerInch);
- self.scale = @(scale);
-
+ self.hapticSpatialDataSupported = hapticSpatialDataSupported;
+ self.diagonalScreenSize = diagonalScreenSize;
+ self.pixelPerInch = pixelPerInch;
+ self.scale = scale;
+ self.preferredFPS = preferredFPS;
return self;
}
@@ -90,6 +95,23 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameScale ofClass:NSNumber.class error:nil];
}
+- (void)setAdditionalVideoStreamingCapabilities:(nullable NSArray <SDLVideoStreamingCapability *> *)additionalVideoStreamingCapabilities {
+ [self.store sdl_setObject:additionalVideoStreamingCapabilities forName:SDLRPCParameterNameAdditionalVideoStreamingCapabilities];
+}
+
+- (nullable NSArray <SDLVideoStreamingCapability *> *)additionalVideoStreamingCapabilities {
+ NSError *error = nil;
+ return [self.store sdl_objectsForName:SDLRPCParameterNameAdditionalVideoStreamingCapabilities ofClass:SDLVideoStreamingCapability.class error:&error];
+}
+
+- (void)setPreferredFPS:(nullable NSNumber<SDLUInt> *)preferredFPS {
+ [self.store sdl_setObject:preferredFPS forName:SDLRPCParameterNamePreferredFPS];
+}
+
+- (nullable NSNumber<SDLUInt> *)preferredFPS {
+ return [self.store sdl_objectForName:SDLRPCParameterNamePreferredFPS ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLVideoStreamingFormat.m b/SmartDeviceLink/public/SDLVideoStreamingFormat.m
index 4fda8d340..e153bc585 100644
--- a/SmartDeviceLink/public/SDLVideoStreamingFormat.m
+++ b/SmartDeviceLink/public/SDLVideoStreamingFormat.m
@@ -42,6 +42,10 @@ NS_ASSUME_NONNULL_BEGIN
[self.store sdl_setObject:codec forName:SDLRPCParameterNameVideoCodec];
}
+- (NSString *)description {
+ return [NSString stringWithFormat:@"{codec:protocol=[%@:%@]}", self.codec, self.protocol];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLVideoStreamingRange.h b/SmartDeviceLink/public/SDLVideoStreamingRange.h
new file mode 100644
index 000000000..458476094
--- /dev/null
+++ b/SmartDeviceLink/public/SDLVideoStreamingRange.h
@@ -0,0 +1,44 @@
+//
+// SDLVideoStreamingRange.h
+// SmartDeviceLink
+//
+// Created on 6/11/20.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLImageResolution;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLVideoStreamingRange : NSObject <NSCopying>
+
+// The minimum supported normalized aspect ratio, Min value is 1
+@property (nonatomic, assign) float minimumAspectRatio;
+
+// The maximum supported normalized aspect ratio, Min value is 1
+@property (nonatomic, assign) float maximumAspectRatio;
+
+// The minimum supported diagonal screen size in inches, defaults to 0 (0 matches any size)
+@property (nonatomic, assign) float minimumDiagonal;
+
+// The minimum resolution to support, it overrides .minimumAspectRatio
+@property (nonatomic, strong, nullable) SDLImageResolution *minimumResolution;
+
+// The maximum resolution to support, it overrides .maximumAspectRatio
+@property (nonatomic, strong, nullable) SDLImageResolution *maximumResolution;
+
+// Check if the argument is within the [.minimumResolution, .maximumResolution] range
+- (BOOL)isImageResolutionInRange:(SDLImageResolution *)imageResolution;
+
+// Check if the argument is within the [.minimumAspectRatio, .maximumAspectRatio] range
+- (BOOL)isAspectRatioInRange:(float)aspectRatio;
+
+- (instancetype)initWithMinimumResolution:(SDLImageResolution *)minResolution maximumResolution:(SDLImageResolution *)maxResolution;
+
+// A convenience method to create a disabled range with the min and max resolutions equal to zero
++ (instancetype)disabled;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLVideoStreamingRange.m b/SmartDeviceLink/public/SDLVideoStreamingRange.m
new file mode 100644
index 000000000..ccdae6210
--- /dev/null
+++ b/SmartDeviceLink/public/SDLVideoStreamingRange.m
@@ -0,0 +1,97 @@
+//
+// SDLVideoStreamingRange.m
+// SmartDeviceLink
+//
+// Created on 6/11/20.
+//
+
+#import "SDLVideoStreamingRange.h"
+#import "SDLImageResolution+StreamingVideoExtensions.h"
+#import "SDLLogMacros.h"
+
+@implementation SDLVideoStreamingRange
+
+- (instancetype)initWithMinimumResolution:(SDLImageResolution *)minResolution maximumResolution:(SDLImageResolution *)maxResolution {
+ if ((self = [super init])) {
+ if (minResolution && maxResolution) {
+ // if both min and max present then min must be below max
+ if ((minResolution.resolutionWidth.floatValue > maxResolution.resolutionWidth.floatValue) ||
+ (minResolution.resolutionHeight.floatValue > maxResolution.resolutionHeight.floatValue)) {
+ SDLLogD(@"minResolution is bigger than maxResolution (%@ <> %@)", minResolution, maxResolution);
+ }
+ }
+ _minimumResolution = minResolution;
+ _maximumResolution = maxResolution;
+ }
+ return self;
+}
+
+- (instancetype)copyWithZone:(nullable NSZone *)zone {
+ typeof(self) aCopy = [[self.class allocWithZone:zone] init];
+ // create a deep copy to prevent resolutions from outside update
+ aCopy.minimumResolution = [self.minimumResolution copyWithZone:zone];
+ aCopy.maximumResolution = [self.maximumResolution copyWithZone:zone];
+ aCopy->_minimumAspectRatio = self->_minimumAspectRatio;
+ aCopy->_maximumAspectRatio = self->_maximumAspectRatio;
+ aCopy->_minimumDiagonal = self->_minimumDiagonal;
+ return aCopy;
+}
+
++ (instancetype)disabled {
+ SDLImageResolution *disabledResolution = [[SDLImageResolution alloc] initWithWidth:0 height:0];
+ return [[self alloc] initWithMinimumResolution:disabledResolution maximumResolution:disabledResolution];
+}
+
+- (BOOL)isImageResolutionRangeValid {
+ return (self.minimumResolution || self.maximumResolution);
+}
+
+- (BOOL)isImageResolutionInRange:(SDLImageResolution *)imageResolution {
+ if (!imageResolution) {
+ return NO;
+ }
+ if (![self isImageResolutionRangeValid]) {
+ // no min & max resolutions - no restriction, no resolution pass
+ return NO;
+ }
+ const CGSize size = imageResolution.makeSize;
+ BOOL isAboveMin = YES;
+ BOOL isBelowMax = YES;
+ if (self.minimumResolution) {
+ // is the size bigger than min? (no check if not set)
+ const CGSize minSize = self.minimumResolution.makeSize;
+ isAboveMin = ((size.width >= minSize.width) && (size.height >= minSize.height));
+ }
+ if (self.maximumResolution) {
+ // is the size smaller than max? (no check if not set)
+ const CGSize maxSize = self.maximumResolution.makeSize;
+ isBelowMax = ((size.width <= maxSize.width) && (size.height <= maxSize.height));
+ }
+ return isAboveMin && isBelowMax;
+}
+
+- (BOOL)isAspectRatioInRange:(float)aspectRatio {
+ if (self.minimumAspectRatio <= 1.f && self.maximumAspectRatio <= 1.f) {
+ // min/max ratio not specified - any aspectRatio is OK
+ return YES;
+ }
+
+ BOOL isInRange = YES;
+ if (self.minimumAspectRatio >= 1.f) {
+ isInRange = (aspectRatio >= self.minimumAspectRatio);
+ }
+ if (isInRange && (self.maximumAspectRatio >= 1.f)) {
+ isInRange = (aspectRatio <= self.maximumAspectRatio);
+ }
+ return isInRange;
+}
+
+- (NSString *)description {
+ NSString *strClass = NSStringFromClass(self.class);
+ NSString *strRatio = [NSString stringWithFormat:@"ratio-min/max:[%2.2f/%2.2f]", self.minimumAspectRatio, self.maximumAspectRatio];
+ NSString *strDiagonal = [NSString stringWithFormat:@"min-diagonal:%2.2f", self.minimumDiagonal];
+ NSString *strResolution = [NSString stringWithFormat:@"resolution-min/max:[%@x%@/%@x%@]", self.minimumResolution.resolutionWidth, self.minimumResolution.resolutionHeight, self.maximumResolution.resolutionWidth, self.maximumResolution.resolutionHeight];
+ return [NSString stringWithFormat:@"%@: {%@, %@, %@}", strClass, strRatio, strDiagonal, strResolution];
+}
+
+@end
diff --git a/SmartDeviceLink/public/SDLWeatherServiceManifest.h b/SmartDeviceLink/public/SDLWeatherServiceManifest.h
index 761474b44..2f0d55edd 100644
--- a/SmartDeviceLink/public/SDLWeatherServiceManifest.h
+++ b/SmartDeviceLink/public/SDLWeatherServiceManifest.h
@@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
* Convenience init for all parameters.
*
- * @param currentForecastSupported Whether or not the current forcast is supported.
+ * @param currentForecastSupported Whether or not the current forecast is supported.
* @param maxMultidayForecastAmount The maximum number of day-by-day forecasts.
* @param maxHourlyForecastAmount The maximum number of hour-by-hour forecasts.
* @param maxMinutelyForecastAmount The maximum number of minute-by-minute forecasts.
@@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithCurrentForecastSupported:(BOOL)currentForecastSupported maxMultidayForecastAmount:(UInt32)maxMultidayForecastAmount maxHourlyForecastAmount:(UInt32)maxHourlyForecastAmount maxMinutelyForecastAmount:(UInt32)maxMinutelyForecastAmount weatherForLocationSupported:(BOOL)weatherForLocationSupported;
/**
- * Whether or not the current forcast is supported.
+ * Whether or not the current forecast is supported.
*
* Boolean, Optional
*/
diff --git a/SmartDeviceLink/public/SDLWindowCapability.h b/SmartDeviceLink/public/SDLWindowCapability.h
index 4795e667b..afb7a905e 100644
--- a/SmartDeviceLink/public/SDLWindowCapability.h
+++ b/SmartDeviceLink/public/SDLWindowCapability.h
@@ -38,10 +38,10 @@
@class SDLButtonCapabilities;
@class SDLDynamicUpdateCapabilities;
@class SDLImageField;
+@class SDLKeyboardCapabilities;
@class SDLSoftButtonCapabilities;
@class SDLTextField;
-
NS_ASSUME_NONNULL_BEGIN
/**
@@ -64,7 +64,23 @@ NS_ASSUME_NONNULL_BEGIN
* @param dynamicUpdateCapabilities - dynamicUpdateCapabilities
* @return A SDLWindowCapability object
*/
-- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities;
+- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities __deprecated_msg("please use initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities: instead");
+
+/**
+ * @param windowID - windowID
+ * @param textFields - textFields
+ * @param imageFields - imageFields
+ * @param imageTypeSupported - imageTypeSupported
+ * @param templatesAvailable - templatesAvailable
+ * @param numCustomPresetsAvailable - numCustomPresetsAvailable
+ * @param buttonCapabilities - buttonCapabilities
+ * @param softButtonCapabilities - softButtonCapabilities
+ * @param menuLayoutsAvailable - menuLayoutsAvailable
+ * @param dynamicUpdateCapabilities - dynamicUpdateCapabilities
+ * @param keyboardCapabilities - keyboardCapabilities
+ * @return A SDLWindowCapability object
+ */
+- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities keyboardCapabilities:(nullable SDLKeyboardCapabilities *)keyboardCapabilities;
/**
The specified ID of the window. Can be set to a predefined window, or omitted for the main window on the main display.
@@ -136,6 +152,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLDynamicUpdateCapabilities *dynamicUpdateCapabilities;
+/**
+ * See KeyboardCapabilities
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLKeyboardCapabilities *keyboardCapabilities;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLWindowCapability.m b/SmartDeviceLink/public/SDLWindowCapability.m
index 9c3ebe7e2..3db3195ff 100644
--- a/SmartDeviceLink/public/SDLWindowCapability.m
+++ b/SmartDeviceLink/public/SDLWindowCapability.m
@@ -36,6 +36,7 @@
#import "SDLButtonCapabilities.h"
#import "SDLDynamicUpdateCapabilities.h"
#import "SDLImageField.h"
+#import "SDLKeyboardCapabilities.h"
#import "SDLRPCParameterNames.h"
#import "SDLSoftButtonCapabilities.h"
#import "SDLTextField.h"
@@ -43,6 +44,10 @@
@implementation SDLWindowCapability
- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities {
+ return [self initWithWindowID:windowID textFields:textFields imageFields:imageFields imageTypeSupported:imageTypeSupported templatesAvailable:templatesAvailable numCustomPresetsAvailable:numCustomPresetsAvailable buttonCapabilities:buttonCapabilities softButtonCapabilities:softButtonCapabilities menuLayoutsAvailable:menuLayoutsAvailable dynamicUpdateCapabilities:dynamicUpdateCapabilities keyboardCapabilities:nil];
+}
+
+- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities keyboardCapabilities:(nullable SDLKeyboardCapabilities *)keyboardCapabilities {
self = [super init];
if (!self) {
return nil;
@@ -57,6 +62,7 @@
self.softButtonCapabilities = softButtonCapabilities;
self.menuLayoutsAvailable = menuLayoutsAvailable;
self.dynamicUpdateCapabilities = dynamicUpdateCapabilities;
+ self.keyboardCapabilities = keyboardCapabilities;
return self;
}
@@ -141,4 +147,12 @@
return [self.store sdl_objectForName:SDLRPCParameterNameDynamicUpdateCapabilities ofClass:SDLDynamicUpdateCapabilities.class error:nil];
}
+- (void)setKeyboardCapabilities:(nullable SDLKeyboardCapabilities *)keyboardCapabilities {
+ [self.store sdl_setObject:keyboardCapabilities forName:SDLRPCParameterNameKeyboardCapabilities];
+}
+
+- (nullable SDLKeyboardCapabilities *)keyboardCapabilities {
+ return [self.store sdl_objectForName:SDLRPCParameterNameKeyboardCapabilities ofClass:SDLKeyboardCapabilities.class error:nil];
+}
+
@end
diff --git a/SmartDeviceLink/public/SmartDeviceLink.h b/SmartDeviceLink/public/SmartDeviceLink.h
index 197e01b4c..8882ae147 100644
--- a/SmartDeviceLink/public/SmartDeviceLink.h
+++ b/SmartDeviceLink/public/SmartDeviceLink.h
@@ -38,8 +38,8 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLDialNumber.h"
#import "SDLEncodedSyncPData.h"
#import "SDLEndAudioPassThru.h"
-#import "SDLGetCloudAppProperties.h"
#import "SDLGetAppServiceData.h"
+#import "SDLGetCloudAppProperties.h"
#import "SDLGetDTCs.h"
#import "SDLGetFile.h"
#import "SDLGetInteriorVehicleData.h"
@@ -55,6 +55,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLPutFile.h"
#import "SDLReadDID.h"
#import "SDLRegisterAppInterface.h"
+#import "SDLReleaseInteriorVehicleDataModule.h"
#import "SDLResetGlobalProperties.h"
#import "SDLScrollableMessage.h"
#import "SDLSendHapticData.h"
@@ -77,7 +78,6 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLSyncPData.h"
#import "SDLSystemRequest.h"
#import "SDLUnpublishAppService.h"
-#import "SDLReleaseInteriorVehicleDataModule.h"
#import "SDLUnregisterAppInterface.h"
#import "SDLUnsubscribeButton.h"
#import "SDLUnsubscribeVehicleData.h"
@@ -105,8 +105,8 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLEncodedSyncPDataResponse.h"
#import "SDLEndAudioPassThruResponse.h"
#import "SDLGenericResponse.h"
-#import "SDLGetCloudAppPropertiesResponse.h"
#import "SDLGetAppServiceDataResponse.h"
+#import "SDLGetCloudAppPropertiesResponse.h"
#import "SDLGetDTCsResponse.h"
#import "SDLGetFileResponse.h"
#import "SDLGetInteriorVehicleDataConsentResponse.h"
@@ -122,6 +122,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLPutFileResponse.h"
#import "SDLReadDIDResponse.h"
#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLReleaseInteriorVehicleDataModuleResponse.h"
#import "SDLResetGlobalPropertiesResponse.h"
#import "SDLScrollableMessageResponse.h"
#import "SDLSendHapticDataResponse.h"
@@ -132,9 +133,9 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLSetGlobalPropertiesResponse.h"
#import "SDLSetInteriorVehicleDataResponse.h"
#import "SDLSetMediaClockTimerResponse.h"
+#import "SDLShowAppMenuResponse.h"
#import "SDLShowConstantTBTResponse.h"
#import "SDLShowResponse.h"
-#import "SDLShowAppMenuResponse.h"
#import "SDLSliderResponse.h"
#import "SDLSpeakResponse.h"
#import "SDLSubscribeButtonResponse.h"
@@ -144,7 +145,6 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLSyncPDataResponse.h"
#import "SDLSystemRequestResponse.h"
#import "SDLUnpublishAppServiceResponse.h"
-#import "SDLReleaseInteriorVehicleDataModuleResponse.h"
#import "SDLUnregisterAppInterfaceResponse.h"
#import "SDLUnsubscribeButtonResponse.h"
#import "SDLUnsubscribeVehicleDataResponse.h"
@@ -152,6 +152,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLUpdateTurnListResponse.h"
#pragma mark Notifications
+#import "SDLOnAppCapabilityUpdated.h"
#import "SDLOnAppInterfaceUnregistered.h"
#import "SDLOnAppServiceData.h"
#import "SDLOnAudioPassThru.h"
@@ -180,47 +181,55 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#pragma mark Structs
#import "SDLAirbagStatus.h"
+#import "SDLAppCapability.h"
#import "SDLAppInfo.h"
#import "SDLAppServiceCapability.h"
#import "SDLAppServiceData.h"
#import "SDLAppServiceManifest.h"
#import "SDLAppServiceRecord.h"
#import "SDLAppServicesCapabilities.h"
-#import "SDLAudioControlData.h"
#import "SDLAudioControlCapabilities.h"
+#import "SDLAudioControlData.h"
#import "SDLAudioPassThruCapabilities.h"
#import "SDLBeltStatus.h"
#import "SDLBodyInformation.h"
#import "SDLButtonCapabilities.h"
#import "SDLChoice.h"
-#import "SDLClusterModeStatus.h"
#import "SDLClimateControlCapabilities.h"
#import "SDLClimateControlData.h"
+#import "SDLClimateData.h"
#import "SDLCloudAppProperties.h"
-#import "SDLDIDResult.h"
+#import "SDLClusterModeStatus.h"
#import "SDLDateTime.h"
#import "SDLDeviceInfo.h"
#import "SDLDeviceStatus.h"
+#import "SDLDIDResult.h"
#import "SDLDisplayCapabilities.h"
#import "SDLDisplayCapability.h"
+#import "SDLDoorStatus.h"
+#import "SDLDoorStatusType.h"
#import "SDLDynamicUpdateCapabilities.h"
#import "SDLDriverDistractionCapability.h"
+#import "SDLDynamicUpdateCapabilities.h"
#import "SDLECallInfo.h"
#import "SDLEmergencyEvent.h"
-#import "SDLFuelRange.h"
#import "SDLEqualizerSettings.h"
+#import "SDLFuelRange.h"
+#import "SDLGateStatus.h"
#import "SDLGearStatus.h"
#import "SDLGPSData.h"
#import "SDLGrid.h"
#import "SDLHapticRect.h"
+#import "SDLHeadLampStatus.h"
#import "SDLHMICapabilities.h"
#import "SDLHMIPermissions.h"
-#import "SDLHMISettingsControlData.h"
#import "SDLHMISettingsControlCapabilities.h"
-#import "SDLHeadLampStatus.h"
+#import "SDLHMISettingsControlData.h"
#import "SDLImage.h"
#import "SDLImageField.h"
#import "SDLImageResolution.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
#import "SDLKeyboardProperties.h"
#import "SDLLightCapabilities.h"
#import "SDLLightControlCapabilities.h"
@@ -252,12 +261,15 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLRectangle.h"
#import "SDLRemoteControlCapabilities.h"
#import "SDLRGBColor.h"
+#import "SDLRoofStatus.h"
#import "SDLScreenParams.h"
#import "SDLSeatControlCapabilities.h"
#import "SDLSeatControlData.h"
-#import "SDLSeatMemoryAction.h"
#import "SDLSeatLocation.h"
#import "SDLSeatLocationCapability.h"
+#import "SDLSeatMemoryAction.h"
+#import "SDLSeatOccupancy.h"
+#import "SDLSeatStatus.h"
#import "SDLSingleTireStatus.h"
#import "SDLSISData.h"
#import "SDLSoftButton.h"
@@ -267,7 +279,6 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLStationIDNumber.h"
#import "SDLMsgVersion.h"
#import "SDLSystemCapability.h"
-#import "SDLTTSChunk.h"
#import "SDLTemperature.h"
#import "SDLTemplateColorScheme.h"
#import "SDLTemplateConfiguration.h"
@@ -277,6 +288,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLTouchEvent.h"
#import "SDLTouchEventCapabilities.h"
#import "SDLTransmissionType.h"
+#import "SDLTTSChunk.h"
#import "SDLTurn.h"
#import "SDLVehicleDataResult.h"
#import "SDLVehicleType.h"
@@ -294,11 +306,12 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#pragma mark Enums
#import "SDLAmbientLightStatus.h"
+#import "SDLAppCapabilityType.h"
#import "SDLAppHMIType.h"
#import "SDLAppInterfaceUnregisteredReason.h"
#import "SDLAppServiceType.h"
-#import "SDLAudioStreamingState.h"
#import "SDLAudioStreamingIndicator.h"
+#import "SDLAudioStreamingState.h"
#import "SDLAudioType.h"
#import "SDLBitsPerSample.h"
#import "SDLButtonEventMode.h"
@@ -333,6 +346,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLImageType.h"
#import "SDLInteractionMode.h"
#import "SDLKeyboardEvent.h"
+#import "SDLKeyboardInputMask.h"
#import "SDLKeyboardLayout.h"
#import "SDLKeypressMode.h"
#import "SDLLanguage.h"
@@ -356,31 +370,32 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLPowerModeQualificationStatus.h"
#import "SDLPowerModeStatus.h"
#import "SDLPredefinedLayout.h"
-#import "SDLPrerecordedSpeech.h"
#import "SDLPredefinedWindows.h"
+#import "SDLPrerecordedSpeech.h"
#import "SDLPrimaryAudioSource.h"
+#import "SDLRPCMessageType.h"
#import "SDLRadioBand.h"
#import "SDLRadioState.h"
-#import "SDLRPCMessageType.h"
#import "SDLRequestType.h"
#import "SDLResult.h"
#import "SDLSamplingRate.h"
#import "SDLSeatMemoryActionType.h"
+#import "SDLSeekIndicatorType.h"
#import "SDLServiceUpdateReason.h"
-#import "SDLSupportedSeat.h"
#import "SDLSoftButtonType.h"
#import "SDLSpeechCapabilities.h"
#import "SDLStaticIconName.h"
+#import "SDLSupportedSeat.h"
#import "SDLSystemAction.h"
#import "SDLSystemCapabilityType.h"
#import "SDLSystemContext.h"
#import "SDLTBTState.h"
+#import "SDLTPMS.h"
#import "SDLTemperatureUnit.h"
#import "SDLTextAlignment.h"
#import "SDLTextFieldName.h"
#import "SDLTimerMode.h"
#import "SDLTouchType.h"
-#import "SDLTPMS.h"
#import "SDLTriggerSource.h"
#import "SDLTurnSignal.h"
#import "SDLUpdateMode.h"
@@ -424,8 +439,11 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLTouchManager.h"
#import "SDLTouchManagerDelegate.h"
#import "SDLSecurityType.h"
+#import "SDLStreamingVideoDelegate.h"
+#import "SDLSeekStreamingIndicator.h"
#import "SDLStreamingMediaManagerDataSource.h"
#import "SDLStreamingVideoScaleManager.h"
+#import "SDLVideoStreamingRange.h"
#pragma mark Files
#import "SDLArtwork.h"
@@ -463,6 +481,10 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLChoiceSetDelegate.h"
#import "SDLKeyboardDelegate.h"
+#import "SDLAlertAudioData.h"
+#import "SDLAlertView.h"
+#import "SDLAudioData.h"
+
#pragma mark Touches
#import "SDLPinchGesture.h"
#import "SDLTouch.h"
diff --git a/SmartDeviceLinkTests/DevAPISpecs/NSArray+ExtensionsSpec.m b/SmartDeviceLinkTests/DevAPISpecs/NSArray+ExtensionsSpec.m
new file mode 100644
index 000000000..7a8bf1277
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/NSArray+ExtensionsSpec.m
@@ -0,0 +1,60 @@
+//
+// NSArray+ExtensionsSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 2/22/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "NSArray+Extensions.h"
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+QuickSpecBegin(NSArray_ExtensionsSpec)
+
+describe(@"checking the dynamic hash of an array", ^{
+ __block NSArray *testArray = nil;
+
+ beforeEach(^{
+ testArray = nil;
+ });
+
+ context(@"when the array has no objects", ^{
+ beforeEach(^{
+ testArray = @[];
+ });
+
+ it(@"should return a dynamic hash of 0", ^{
+ expect(testArray.dynamicHash).to(equal(0));
+ });
+ });
+
+ context(@"when the array contains one string", ^{
+ beforeEach(^{
+ testArray = @[@"test string"];
+ });
+
+ it(@"should return a consistent dynamic hash", ^{
+ expect(testArray.dynamicHash).to(equal(testArray.dynamicHash));
+ });
+
+ it(@"should return a different hash than the normal hash function", ^{
+ expect(testArray.dynamicHash).toNot(equal(testArray.hash));
+ });
+ });
+
+ context(@"when the array contains multiple strings", ^{
+ it(@"should return different numbers depending on where the strings are in the array", ^{
+ testArray = @[@"test string", @"test string 2"];
+ NSUInteger hash1 = testArray.dynamicHash;
+
+ testArray = @[@"test string 2", @"test string"];
+ NSUInteger hash2 = testArray.dynamicHash;
+
+ expect(hash1).toNot(equal(hash2));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m
index afd6a783b..986accda5 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m
@@ -162,6 +162,39 @@ describe(@"SDLArtwork Tests", ^{
expect(expectedName1).toNot(equal(expectedName2));
});
});
+
+ describe(@"copying the image", ^{
+ context(@"a dynamic image", ^{
+ beforeEach(^{
+ expectedArtwork = [[SDLArtwork alloc] initWithImage:testImagePNGTemplate persistent:YES asImageFormat:SDLArtworkImageFormatPNG];
+ expectedArtwork.overwrite = YES;
+ });
+
+ it(@"should copy correctly", ^{
+ SDLArtwork *copiedArtwork = [expectedArtwork copy];
+ expect(copiedArtwork.isTemplate).to(equal(expectedArtwork.isTemplate));
+ expect(copiedArtwork.data).to(equal(expectedArtwork.data));
+ expect(copiedArtwork.imageRPC).to(equal(expectedArtwork.imageRPC));
+ expect(copiedArtwork.overwrite).to(equal(expectedArtwork.overwrite));
+ expect(copiedArtwork.isStaticIcon).to(equal(expectedArtwork.isStaticIcon));
+ });
+ });
+
+ context(@"a static image", ^{
+ beforeEach(^{
+ expectedArtwork = [[SDLArtwork alloc] initWithStaticIcon:SDLStaticIconNameKey];
+ });
+
+ it(@"should copy correctly", ^{
+ SDLArtwork *copiedArtwork = [expectedArtwork copy];
+ expect(copiedArtwork.isTemplate).to(equal(expectedArtwork.isTemplate));
+ expect(copiedArtwork.data).to(equal(expectedArtwork.data));
+ expect(copiedArtwork.imageRPC).to(equal(expectedArtwork.imageRPC));
+ expect(copiedArtwork.overwrite).to(equal(expectedArtwork.overwrite));
+ expect(copiedArtwork.isStaticIcon).to(equal(expectedArtwork.isStaticIcon));
+ });
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLAsynchronousRPCRequestOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLAsynchronousRPCRequestOperationSpec.m
index 9a80d5fd4..8376a8922 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLAsynchronousRPCRequestOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLAsynchronousRPCRequestOperationSpec.m
@@ -56,10 +56,9 @@ describe(@"sending asynchronous requests", ^{
}];
[testOperationQueue addOperation:testOperation];
- [NSThread sleepForTimeInterval:0.5];
- expect(testSuccess).toEventually(beTruthy());
- expect(testError).toEventually(beNil());
+ expect(testSuccess).withTimeout(3.0).toEventually(beTrue());
+ expect(testError).withTimeout(3.0).toEventually(beNil());
});
});
@@ -120,11 +119,10 @@ describe(@"sending asynchronous requests", ^{
[resultResponses addObject:response];
} completionHandler:^(BOOL success) {
expect(resultResponses).to(haveCount(3));
- expect(success).to(beFalsy());
+ expect(success).to(beFalse());
}];
[testOperationQueue addOperation:testOperation];
- [NSThread sleepForTimeInterval:0.5];
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m
index 373003311..3c2bcc6dd 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m
@@ -39,13 +39,11 @@ describe(@"the audio stream manager", ^{
beforeEach(^{
[mockAudioManager clearData];
[testManager playNextWhenReady];
- // playNextWhenReady dispatches to a new thread so the test can sometimes fail due to timing issues even when using `toEventually`.
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should fail to send data", ^{
- expect(mockAudioManager.dataSinceClear.length).toEventually(equal(0));
- expect(mockAudioManager.error.code).toEventually(equal(SDLAudioStreamManagerErrorNotConnected));
+ expect(mockAudioManager.dataSinceClear.length).withTimeout(3.0).toEventually(equal(0));
+ expect(mockAudioManager.error.code).withTimeout(3.0).toEventually(equal(SDLAudioStreamManagerErrorNotConnected));
});
});
});
@@ -89,13 +87,7 @@ describe(@"the audio stream manager", ^{
it(@"should be sending data", ^{
expect(testManager.isPlaying).toEventually(beTrue());
expect(mockAudioManager.dataSinceClear.length).toEventually(equal(34380));
-
- // wait for the delegate to be called when the audio finishes
- float waitTime = 1.1 + 0.25; // length of audio in testAudioFileURL + 0.25 buffer
- NSLog(@"Please wait %f for audio file to finish playing...", waitTime);
- [NSThread sleepForTimeInterval:waitTime];
-
- expect(mockAudioManager.finishedPlaying).toEventually(beTrue());
+ expect(mockAudioManager.finishedPlaying).withTimeout(3.0).toEventually(beTrue());
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceCellSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceCellSpec.m
index 1f4b6d469..47b6c675c 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceCellSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceCellSpec.m
@@ -43,6 +43,7 @@ describe(@"an SDLChoiceCell", ^{
expect(testCell.artwork).to(beNil());
expect(testCell.secondaryArtwork).to(beNil());
expect(@(testCell.choiceId)).to(equal(@(UINT16_MAX)));
+ expect(testCell.uniqueText).to(equal(testText));
});
it(@"should initialize properly with initWithText:artwork:voiceCommands:", ^{
@@ -55,6 +56,7 @@ describe(@"an SDLChoiceCell", ^{
expect(testCell.artwork).to(equal(testArtwork));
expect(testCell.secondaryArtwork).to(beNil());
expect(@(testCell.choiceId)).to(equal(@(UINT16_MAX)));
+ expect(testCell.uniqueText).to(equal(testText));
});
it(@"should initialize properly with initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:", ^{
@@ -67,6 +69,7 @@ describe(@"an SDLChoiceCell", ^{
expect(testCell.artwork).to(equal(testArtwork));
expect(testCell.secondaryArtwork).to(equal(testSecondaryArtwork));
expect(@(testCell.choiceId)).to(equal(@(UINT16_MAX)));
+ expect(testCell.uniqueText).to(equal(testText));
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
index 47156d1c0..3fde3aa15 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
@@ -35,6 +35,7 @@
@interface SDLPresentChoiceSetOperation()
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (assign, nonatomic) UInt16 cancelId;
@end
@@ -48,6 +49,7 @@
@property (strong, nonatomic, readonly) SDLStateMachine *stateMachine;
@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (assign, nonatomic) UInt16 nextCancelId;
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
@@ -62,7 +64,8 @@
@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification;
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability;
+- (void)sdl_displayCapabilityDidUpdate;
+- (void)sdl_addUniqueNamesToCells:(NSMutableSet<SDLChoiceCell *> *)choices;
@end
@@ -82,6 +85,9 @@ describe(@"choice set manager tests", ^{
__block SDLChoiceCell *testCell1 = nil;
__block SDLChoiceCell *testCell2 = nil;
__block SDLChoiceCell *testCell3 = nil;
+ __block SDLChoiceCell *testCellDuplicate = nil;
+ __block SDLVersion *choiceSetUniquenessActiveVersion = nil;
+ __block SDLArtwork *testArtwork = nil;
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
@@ -90,9 +96,11 @@ describe(@"choice set manager tests", ^{
testManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager systemCapabilityManager:testSystemCapabilityManager];
+ testArtwork = [[SDLArtwork alloc] initWithStaticIcon:SDLStaticIconNameKey];
testCell1 = [[SDLChoiceCell alloc] initWithText:@"test1"];
testCell2 = [[SDLChoiceCell alloc] initWithText:@"test2"];
testCell3 = [[SDLChoiceCell alloc] initWithText:@"test3"];
+ testCellDuplicate = [[SDLChoiceCell alloc] initWithText:@"test1" artwork:nil voiceCommands:nil];
enabledWindowCapability = [[SDLWindowCapability alloc] init];
enabledWindowCapability.textFields = @[[[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1]];
@@ -100,12 +108,13 @@ describe(@"choice set manager tests", ^{
disabledWindowCapability.textFields = @[];
blankWindowCapability = [[SDLWindowCapability alloc] init];
blankWindowCapability.textFields = @[];
+ choiceSetUniquenessActiveVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
});
it(@"should be in the correct startup state", ^{
expect(testManager.currentState).to(equal(SDLChoiceManagerStateShutdown));
- SDLKeyboardProperties *defaultProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs layout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteText:nil autoCompleteList:nil];
+ SDLKeyboardProperties *defaultProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs keyboardLayout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
expect(testManager.keyboardConfiguration).to(equal(defaultProperties));
});
@@ -134,9 +143,8 @@ describe(@"choice set manager tests", ^{
it(@"should enable the queue when receiving a good window capability", ^{
testManager.currentWindowCapability = disabledWindowCapability;
-
- SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"TEST" windowCapabilities:@[enabledWindowCapability] windowTypeSupported:nil];
- [testManager sdl_displayCapabilityDidUpdate:[[SDLSystemCapability alloc] initWithDisplayCapabilities:@[displayCapability]]];
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(enabledWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
expect(testManager.transactionQueue.isSuspended).to(beFalse());
});
@@ -158,15 +166,15 @@ describe(@"choice set manager tests", ^{
});
it(@"should suspend the queue when receiving a bad display capability", ^{
- SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"TEST" windowCapabilities:@[disabledWindowCapability] windowTypeSupported:nil];
- [testManager sdl_displayCapabilityDidUpdate:[[SDLSystemCapability alloc] initWithDisplayCapabilities:@[displayCapability]]];
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(disabledWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
expect(testManager.transactionQueue.isSuspended).to(beTrue());
});
it(@"should not suspend the queue when receiving an empty display capability", ^{
- SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"TEST" windowCapabilities:@[blankWindowCapability] windowTypeSupported:nil];
- [testManager sdl_displayCapabilityDidUpdate:[[SDLSystemCapability alloc] initWithDisplayCapabilities:@[displayCapability]]];
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(blankWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
expect(testManager.transactionQueue.isSuspended).to(beTrue());
});
@@ -255,6 +263,46 @@ describe(@"choice set manager tests", ^{
});
});
+ context(@"when some choices are already uploaded with duplicate titles version >= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = choiceSetUniquenessActiveVersion;
+ [testManager preloadChoices:@[testCell1, testCellDuplicate] withCompletionHandler:^(NSError * _Nullable error) { }];
+ });
+
+ it(@"should not update the choiceCells' unique title", ^{
+ SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
+ testOp.completionBlock();
+ NSArray <SDLChoiceCell *> *testArrays = testManager.preloadedChoices.allObjects;
+ for (SDLChoiceCell *choiceCell in testArrays) {
+ expect(choiceCell.uniqueText).to(equal("test1"));
+ }
+ expect(testManager.preloadedChoices).to(contain(testCell1));
+ expect(testManager.preloadedChoices).to(contain(testCellDuplicate));
+ });
+ });
+
+ context(@"when some choices are already uploaded with duplicate titles version <= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [[SDLVersion alloc] initWithMajor:7 minor:0 patch:0];
+ [testManager preloadChoices:@[testCell1, testCellDuplicate] withCompletionHandler:^(NSError * _Nullable error) { }];
+ });
+
+ it(@"append a number to the unique text for choice set cells", ^{
+ SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
+ testOp.completionBlock();
+ NSArray <SDLChoiceCell *> *testArrays = testManager.preloadedChoices.allObjects;
+ for (SDLChoiceCell *choiceCell in testArrays) {
+ if (choiceCell.artwork) {
+ expect(choiceCell.uniqueText).to(equal("test1 (2)"));
+ } else {
+ expect(choiceCell.uniqueText).to(equal("test1"));
+ }
+ }
+ expect(testManager.preloadedChoices).to(contain(testCell1));
+ expect(testManager.preloadedChoices).to(contain(testCellDuplicate));
+ });
+ });
+
context(@"when some choices are already pending", ^{
beforeEach(^{
testManager.pendingMutablePreloadChoices = [NSMutableSet setWithArray:@[testCell1]];
@@ -526,6 +574,45 @@ describe(@"choice set manager tests", ^{
});
});
+ describe(@"generating a cancel id", ^{
+ __block SDLChoiceSet *testChoiceSet = nil;
+ __block id<SDLChoiceSetDelegate> testChoiceDelegate = nil;
+
+ beforeEach(^{
+ testChoiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
+ testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:@"tests" delegate:testChoiceDelegate choices:@[testCell1]];
+ testManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager systemCapabilityManager:testSystemCapabilityManager];
+ [testManager.stateMachine setToState:SDLChoiceManagerStateReady fromOldState:SDLChoiceManagerStateCheckingVoiceOptional callEnterTransition:NO];
+ });
+
+ it(@"should set the first cancelID correctly", ^{
+ [testManager presentChoiceSet:testChoiceSet mode:SDLInteractionModeBoth withKeyboardDelegate:nil];
+
+ expect(testManager.transactionQueue.operations.count).to(equal(2));
+ expect(testManager.transactionQueue.operations[0]).to(beAKindOf([SDLPreloadChoicesOperation class]));
+ SDLPresentChoiceSetOperation *testPresentOp = (SDLPresentChoiceSetOperation *)testManager.transactionQueue.operations[1];
+ expect(@(testPresentOp.cancelId)).to(equal(101));
+ });
+
+ it(@"should reset the cancelID correctly once the max has been reached", ^{
+ testManager.nextCancelId = 200;
+ [testManager presentChoiceSet:testChoiceSet mode:SDLInteractionModeBoth withKeyboardDelegate:nil];
+
+ expect(testManager.transactionQueue.operations.count).to(equal(2));
+
+ expect(testManager.transactionQueue.operations[0]).to(beAKindOf([SDLPreloadChoicesOperation class]));
+ SDLPresentChoiceSetOperation *testPresentOp = (SDLPresentChoiceSetOperation *)testManager.transactionQueue.operations[1];
+ expect(@(testPresentOp.cancelId)).to(equal(200));
+
+ [testManager presentChoiceSet:testChoiceSet mode:SDLInteractionModeBoth withKeyboardDelegate:nil];
+
+ expect(testManager.transactionQueue.operations.count).to(equal(3));
+
+ SDLPresentChoiceSetOperation *testPresentOp2 = (SDLPresentChoiceSetOperation *)testManager.transactionQueue.operations[2];
+ expect(@(testPresentOp2.cancelId)).to(equal(101));
+ });
+ });
+
describe(@"dismissing the keyboard", ^{
__block SDLPresentKeyboardOperation *mockKeyboardOp1 = nil;
__block SDLPresentKeyboardOperation *mockKeyboardOp2 = nil;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m
index 76d1e4338..110a6c53a 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m
@@ -8,6 +8,7 @@
#import "SDLChoiceSetDelegate.h"
#import "SDLTTSChunk.h"
#import "SDLVrHelpItem.h"
+#import "SDLArtwork.h"
@interface SDLChoiceSet()
@@ -134,12 +135,14 @@ describe(@"an SDLChoiceSet", ^{
expect(testChoiceSet).to(beNil());
});
- it(@"should return nil with too short or too long timeout", ^{
+ it(@"should cap the timeout when too long or too short", ^{
testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:testDelegate layout:testLayout timeout:4.9 initialPromptString:nil timeoutPromptString:nil helpPromptString:nil vrHelpList:nil choices:@[testCell]];
- expect(testChoiceSet).to(beNil());
+ expect(testChoiceSet).toNot(beNil());
+ expect(testChoiceSet.timeout).to(beCloseTo(5.0));
testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:testDelegate layout:testLayout timeout:100.1 initialPromptString:nil timeoutPromptString:nil helpPromptString:nil vrHelpList:nil choices:@[testCell]];
- expect(testChoiceSet).to(beNil());
+ expect(testChoiceSet).toNot(beNil());
+ expect(testChoiceSet.timeout).to(beCloseTo(100.0));
});
it(@"should return nil with too short or too long title", ^{
@@ -156,23 +159,24 @@ describe(@"an SDLChoiceSet", ^{
expect(testChoiceSet).to(beNil());
});
- it(@"should return nil with equivalent cell text", ^{
+ it(@"should return nil when 2 or more cells are identical", ^{
+ // Cells cannot be identical
+ SDLArtwork *testArtwork = [[SDLArtwork alloc] initWithStaticIcon:SDLStaticIconNameKey];
+ SDLChoiceCell *equalCell = [[SDLChoiceCell alloc] initWithText:@"Text" secondaryText:@"Text 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:testArtwork];
+ SDLChoiceCell *equalCell2 = [[SDLChoiceCell alloc] initWithText:@"Text" secondaryText:@"Text 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:testArtwork];
+ testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:testDelegate choices:@[equalCell, equalCell2]];
+ expect(testChoiceSet).to(beNil());
+ });
+
+ it(@"should return nil when 2 or more cells voice commands are identical", ^{
// Cell `text` cannot be equal
- SDLChoiceCell *equalCell = [[SDLChoiceCell alloc] initWithText:@"Text"];
- SDLChoiceCell *equalCell2 = [[SDLChoiceCell alloc] initWithText:@"Text"];
+ SDLChoiceCell *equalCell = [[SDLChoiceCell alloc] initWithText:@"Text" artwork:nil voiceCommands:@[@"Kit", @"Kat"]];
+ SDLChoiceCell *equalCell2 = [[SDLChoiceCell alloc] initWithText:@"Text 2" artwork:nil voiceCommands:@[@"Kat"]];
testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:testDelegate choices:@[equalCell, equalCell2]];
expect(testChoiceSet).to(beNil());
});
context(@"With bad VR data", ^{
- it(@"should return nil if not all choice set items have voice commands", ^{
- // Cell `voiceCommands` cannot be equal
- SDLChoiceCell *equalCellVR = [[SDLChoiceCell alloc] initWithText:@"Text" artwork:nil voiceCommands:@[@"vr"]];
- SDLChoiceCell *equalCellVR2 = [[SDLChoiceCell alloc] initWithText:@"Text2" artwork:nil voiceCommands:nil];
- testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:testDelegate choices:@[equalCellVR, equalCellVR2]];
- expect(testChoiceSet).to(beNil());
- });
-
it(@"should return nil if there are duplicate voice command strings in the choice set", ^{
// Cell `voiceCommands` cannot be equal
SDLChoiceCell *equalCellVR = [[SDLChoiceCell alloc] initWithText:@"Text" artwork:nil voiceCommands:@[@"Dog"]];
@@ -184,6 +188,81 @@ describe(@"an SDLChoiceSet", ^{
});
});
+ describe(@"setting the default timeout", ^{
+ __block SDLChoiceSet *testChoiceSet = nil;
+
+ beforeEach(^{
+ testChoiceSet = [[SDLChoiceSet alloc] init];
+ });
+
+ it(@"should return the default timeout if the timeout value was not set", ^{
+ int testDefaultTimeout = 6.0;
+ SDLChoiceSet.defaultTimeout = testDefaultTimeout;
+
+ expect(SDLChoiceSet.defaultTimeout).to(equal(testDefaultTimeout));
+ expect(testChoiceSet.timeout).to(equal(testDefaultTimeout));
+ });
+
+ it(@"should return the timeout value even if the default timeout was set", ^{
+ int testTimeout = 7.0;
+ int testDefaultTimeout = 9.0;
+ SDLChoiceSet.defaultTimeout = testDefaultTimeout;
+ testChoiceSet.timeout = testTimeout;
+
+ expect(SDLChoiceSet.defaultTimeout).to(equal(testDefaultTimeout));
+ expect(testChoiceSet.timeout).to(equal(testTimeout));
+ });
+
+ it(@"should return 100 if a value greater than 100 has been set", ^{
+ SDLChoiceSet.defaultTimeout = 155.0;
+
+ expect(SDLChoiceSet.defaultTimeout).to(equal(100.0));
+ expect(testChoiceSet.timeout).to(equal(100.0));
+ });
+
+ it(@"should return 5 if a value less than 5 has been set", ^{
+ SDLChoiceSet.defaultTimeout = -3.0;
+
+ expect(SDLChoiceSet.defaultTimeout).to(equal(5.0));
+ expect(testChoiceSet.timeout).to(equal(5.0));
+ });
+ });
+
+ describe(@"setting the timeout", ^{
+ __block SDLChoiceSet *testChoiceSet = nil;
+ __block NSTimeInterval testDefaultTimeout = 7.0;
+
+ beforeEach(^{
+ testChoiceSet = [[SDLChoiceSet alloc] init];
+ SDLChoiceSet.defaultTimeout = testDefaultTimeout;
+ });
+
+ it(@"should return the default timeout if the timeout was not set", ^{
+ expect(testChoiceSet.timeout).to(equal(testDefaultTimeout));
+ });
+
+ it(@"should return the default timeout if the timeout was set to 0", ^{
+ testChoiceSet.timeout = 0.0;
+ expect(testChoiceSet.timeout).to(equal(testDefaultTimeout));
+ });
+
+ it(@"should return the timeout value if it was set", ^{
+ int testTimeout = 9.0;
+ testChoiceSet.timeout = testTimeout;
+ expect(testChoiceSet.timeout).to(equal(testTimeout));
+ });
+
+ it(@"should return 100 if a value greater than 100 has been set", ^{
+ testChoiceSet.timeout = 214.0;
+ expect(testChoiceSet.timeout).to(equal(100.0));
+ });
+
+ it(@"should return 5 if a value less than 5 has been set", ^{
+ testChoiceSet.timeout = 2.25;
+ expect(testChoiceSet.timeout).to(equal(5.0));
+ });
+ });
+
describe(@"canceling the choice set", ^{
__block BOOL canceledHandlerCalled = NO;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
index af5f443a7..2914597d6 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
@@ -10,6 +10,7 @@
#import "SDLFileManagerConfiguration.h"
#import "SDLFileType.h"
#import "SDLFileWrapper.h"
+#import "SDLGlobals.h"
#import "SDLListFiles.h"
#import "SDLListFilesOperation.h"
#import "SDLListFilesResponse.h"
@@ -121,14 +122,12 @@ describe(@"uploading / deleting single files with the file manager", ^{
startupError = error;
completionHandlerCalled = YES;
}];
-
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should have queued a ListFiles request", ^{
- expect(testFileManager.currentState).to(match(SDLFileManagerStateFetchingInitialList));
- expect(testFileManager.pendingTransactions).to(haveCount(@1));
- expect(testFileManager.pendingTransactions.firstObject).to(beAnInstanceOf([SDLListFilesOperation class]));
+ expect(testFileManager.currentState).toEventually(match(SDLFileManagerStateFetchingInitialList));
+ expect(testFileManager.pendingTransactions).toEventually(haveCount(@1));
+ expect(testFileManager.pendingTransactions.firstObject).toEventually(beAnInstanceOf([SDLListFilesOperation class]));
});
describe(@"after going to the shutdown state and receiving a ListFiles response", ^{
@@ -320,19 +319,20 @@ describe(@"uploading / deleting single files with the file manager", ^{
});
});
- context(@"when allow overwrite is NO", ^{
+ context(@"when allow overwrite is NO and the RPC version is < 4.4.0", ^{
__block NSString *testUploadFileName = nil;
__block Boolean testUploadOverwrite = NO;
beforeEach(^{
testUploadFileName = [testInitialFileNames lastObject];
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:4 minor:3 patch:0];
});
- it(@"should not upload the file if persistance is YES", ^{
- SDLFile *persistantFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:YES];
- persistantFile.overwrite = testUploadOverwrite;
+ it(@"should not upload the file if persistence is YES", ^{
+ SDLFile *persistentFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:YES];
+ persistentFile.overwrite = testUploadOverwrite;
- [testFileManager uploadFile:persistantFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ [testFileManager uploadFile:persistentFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
expect(@(success)).to(beFalse());
expect(@(bytesAvailable)).to(equal(@(testFileManager.bytesAvailable)));
expect(error).to(equal([NSError sdl_fileManager_cannotOverwriteError]));
@@ -341,11 +341,11 @@ describe(@"uploading / deleting single files with the file manager", ^{
expect(testFileManager.pendingTransactions.count).to(equal(0));
});
- it(@"should upload the file if persistance is NO", ^{
- SDLFile *unPersistantFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:NO];
- unPersistantFile.overwrite = testUploadOverwrite;
+ it(@"should upload the file if persistence is NO", ^{
+ SDLFile *unPersistentFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:NO];
+ unPersistentFile.overwrite = testUploadOverwrite;
- [testFileManager uploadFile:unPersistantFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ [testFileManager uploadFile:unPersistentFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
expect(success).to(beTrue());
expect(bytesAvailable).to(equal(newBytesAvailable));
expect(error).to(beNil());
@@ -466,6 +466,70 @@ describe(@"uploading / deleting single files with the file manager", ^{
expect(testFileManager.pendingTransactions.count).to(equal(1));
});
});
+
+ describe(@"checking if files and artworks needs upload", ^{
+ __block UIImage *testUIImage = nil;
+ __block NSString *expectedArtworkName = nil;
+ __block SDLArtwork *artwork = nil;
+
+ context(@"when artwork is nil", ^{
+ beforeEach(^{
+ artwork = nil;
+ });
+
+ it(@"should not allow file to be uploaded", ^{
+ expect(artwork).to(beNil());
+ BOOL testFileNeedsUpload = [testFileManager fileNeedsUpload:artwork];
+ expect(testFileNeedsUpload).to(beFalse());
+ });
+ });
+
+ context(@"when artwork is static", ^{
+ it(@"should not allow file to be uploaded", ^{
+ artwork = [[SDLArtwork alloc] initWithStaticIcon:SDLStaticIconNameKey];
+
+ BOOL testFileNeedsUpload = [testFileManager fileNeedsUpload:artwork];
+ expect(testFileNeedsUpload).to(beFalse());
+ });
+ });
+
+ context(@"when artwork is dynamic", ^{
+ beforeEach(^{
+ testUIImage = [FileManagerSpecHelper imagesForCount:1].firstObject;
+ expectedArtworkName = testInitialFileNames.firstObject;
+ artwork = [SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG];
+ });
+
+ context(@"when uploading artwork for the first time", ^{
+ it(@"should allow file to be uploaded", ^{
+ BOOL testFileNeedsUpload = [testFileManager fileNeedsUpload:artwork];
+ expect(testFileNeedsUpload).to(beTrue());
+ });
+ });
+
+ context(@"when artwork is previously uploaded", ^{
+ beforeEach(^{
+ testFileManager.uploadedEphemeralFileNames = [NSMutableSet setWithArray:testInitialFileNames];
+ testFileManager.mutableRemoteFileNames = [NSMutableSet setWithArray:testInitialFileNames];
+ [testFileManager.stateMachine setToState:SDLFileManagerStateReady fromOldState:SDLFileManagerStateShutdown callEnterTransition:NO];
+ });
+
+ it(@"should not allow file to be uploaded when overwrite is set to false", ^{
+ artwork.overwrite = NO;
+
+ BOOL testFileNeedsUpload = [testFileManager fileNeedsUpload:artwork];
+ expect(testFileNeedsUpload).to(beFalse());
+ });
+
+ it(@"should allow file to be uploaded when overwrite is set to true", ^{
+ artwork.overwrite = YES;
+
+ BOOL testFileNeedsUpload = [testFileManager fileNeedsUpload:artwork];
+ expect(testFileNeedsUpload).to(beTrue());
+ });
+ });
+ });
+ });
});
describe(@"uploading/deleting multiple files in the file manager", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
index 32d2cfcbf..3d2f16faf 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
@@ -43,10 +43,10 @@
#import "SDLTTSChunk.h"
#import "SDLUnregisterAppInterface.h"
#import "SDLUnregisterAppInterfaceResponse.h"
+#import "SDLVehicleType.h"
#import "SDLVersion.h"
#import "SDLVideoStreamingState.h"
-
@interface SDLStreamingMediaManager ()
@property (strong, nonatomic, nullable) SDLSecondaryTransportManager *secondaryTransportManager;
@@ -62,6 +62,18 @@
@property (strong, nonatomic, nullable) SDLSecondaryTransportManager *secondaryTransportManager;
@property (strong, nonatomic) SDLEncryptionLifecycleManager *encryptionLifecycleManager;
@property (strong, nonatomic, nullable) SDLLifecycleProtocolHandler *protocolHandler;
+- (void)didEnterStateConnected;
+@end
+
+@interface SDLLifecycleTestManager : SDLLifecycleManager
+- (void)sendConnectionManagerRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler;
+@property (strong, nonatomic, nullable) __kindof SDLRPCMessage *testRequest;
+@end
+
+@implementation SDLLifecycleTestManager
+- (void)sendConnectionManagerRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+ self.testRequest = request;
+}
@end
@interface SDLGlobals ()
@@ -74,8 +86,8 @@ QuickConfigurationBegin(SendingRPCsConfiguration)
sharedExamples(@"unable to send an RPC", ^(QCKDSLSharedExampleContext exampleContext) {
it(@"cannot publicly send RPCs", ^{
SDLLifecycleManager *testManager = exampleContext()[@"manager"];
- SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil alignment:nil];
-
+ SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil mainField3:nil mainField4:nil alignment:nil statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:nil templateTitle:nil windowID:nil templateConfiguration:nil];
+
[testManager sendRequest:testShow withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
expect(error).to(equal([NSError sdl_lifecycle_notReadyError]));
}];
@@ -88,10 +100,25 @@ QuickConfigurationEnd
QuickSpecBegin(SDLLifecycleManagerSpec)
+describe(@"test lifecycle manager internals", ^{
+ context(@"init and assign version", ^{
+ SDLLifecycleTestManager *manager = [[SDLLifecycleTestManager alloc] init];
+ it(@"expect object to be created", ^{
+ expect(manager).notTo(beNil());
+ });
+ context(@"didEnterStateConnected", ^{
+ [manager didEnterStateConnected];
+ it(@"expect request to be of proper kind", ^{
+ expect([manager.testRequest isKindOfClass:SDLRegisterAppInterface.class]).to(equal(YES));
+ });
+ });
+ });
+});
+
describe(@"a lifecycle manager", ^{
__block SDLLifecycleManager *testManager = nil;
__block SDLConfiguration *testConfig = nil;
- __block id protocolMock = nil;
+ __block SDLProtocol *protocolMock = nil;
__block id sdlManagerDelegateProtocolMock = nil;
__block id lockScreenManagerMock = nil;
__block id fileManagerMock = nil;
@@ -100,6 +127,9 @@ describe(@"a lifecycle manager", ^{
__block id systemCapabilityMock = nil;
__block id secondaryTransportManagerMock = nil;
__block id encryptionManagerMock = nil;
+ SDLVehicleType *vehicleType = [[SDLVehicleType alloc] initWithMake:@"Make" model:@"Model" modelYear:@"Model Year" trim:@"Trim"];
+ NSString *softwareVersion = @"1.1.1.1";
+ NSString *hardwareVersion = @"2.2.2.2";
void (^transitionToState)(SDLState *) = ^(SDLState *state) {
dispatch_sync(testManager.lifecycleQueue, ^{
@@ -253,11 +283,35 @@ describe(@"a lifecycle manager", ^{
beforeEach(^{
// When we connect, we should be creating an sending an RAI
OCMExpect([protocolMock sendRPC:[OCMArg isKindOfClass:[SDLRegisterAppInterface class]]]);
-
- [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
+ });
+
+ context(@"when the protocol system info is set", ^{
+ SDLSystemInfo *testSystemInfo = [[SDLSystemInfo alloc] initWithVehicleType:vehicleType softwareVersion:softwareVersion hardwareVersion:hardwareVersion];
+
+ beforeEach(^{
+ OCMStub(protocolMock.systemInfo).andReturn(testSystemInfo);
+ OCMExpect([sdlManagerDelegateProtocolMock didReceiveSystemInfo:[OCMArg isEqual:testSystemInfo]]).andReturn(YES);
+ [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
+ });
+
+ it(@"should call the delegate handler", ^{
+ OCMVerifyAllWithDelay(sdlManagerDelegateProtocolMock, 1.0);
+ });
+ });
+
+ context(@"when the protocol system info is not set", ^{
+ beforeEach(^{
+ OCMStub(protocolMock.systemInfo).andReturn(nil);
+ [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
+ });
+
+ it(@"should call the delegate handler", ^{
+ OCMReject([sdlManagerDelegateProtocolMock didReceiveSystemInfo:[OCMArg isNil]]);
+ });
});
it(@"should send a register app interface request and be in the connected state", ^{
+ [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
OCMVerifyAllWithDelay(protocolMock, 1.0);
expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateConnected));
});
@@ -266,17 +320,18 @@ describe(@"a lifecycle manager", ^{
describe(@"after receiving a disconnect notification", ^{
beforeEach(^{
+ [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
[testManager.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should be in the started state", ^{
- expect(testManager.lifecycleState).to(equal(SDLLifecycleStateReconnecting));
+ expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateReconnecting));
});
});
describe(@"stopping the manager", ^{
it(@"should simply stop", ^{
+ [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
[testManager stop];
expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateStopped));
@@ -324,115 +379,49 @@ describe(@"a lifecycle manager", ^{
itBehavesLike(@"unable to send an RPC", ^{ return @{ @"manager": testManager }; });
});
-
- describe(@"after receiving a disconnect notification", ^{
- beforeEach(^{
- OCMStub([protocolMock stopWithCompletionHandler:[OCMArg invokeBlock]]);
- OCMStub([secondaryTransportManagerMock stopWithCompletionHandler:[OCMArg invokeBlock]]);
- [testManager.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
- [NSThread sleepForTimeInterval:1.0];
- });
-
- it(@"should enter the started state", ^{
- expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateStarted));
- });
- });
-
- describe(@"stopping the manager", ^{
+
+ context(@"when the protocol system info is not set", ^{
beforeEach(^{
- [testManager stop];
+ testManager.systemInfo = nil;
+ OCMExpect([sdlManagerDelegateProtocolMock didReceiveSystemInfo:[OCMArg isNotNil]]).andReturn(YES);
});
-
- it(@"should enter the stopped state", ^{
- expect(testManager.lifecycleState).to(equal(SDLLifecycleStateStopped));
- });
- });
- });
- describe(@"transitioning to the registered state when the minimum RPC version is in effect", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:1 minor:0 patch:0];
-
- [testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:YES];
- });
-
- it(@"should disconnect", ^{
- expect(testManager.lifecycleState).to(equal(SDLLifecycleStateUnregistering));
- });
- });
-
- describe(@"transitioning to the Setting Up HMI state", ^{
- context(@"before register response is a success", ^{
- it(@"ready handler should not be called yet", ^{
+ it(@"should call the delegate handler", ^{
SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
response.resultCode = SDLResultSuccess;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ response.vehicleType = vehicleType;
+ response.systemSoftwareVersion = softwareVersion;
+#pragma clang diagnostic pop
testManager.registerResponse = response;
-
- setToStateWithEnterTransition(nil, SDLLifecycleStateSettingUpHMI);
+ [testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:YES];
- expect(@(readyHandlerSuccess)).to(equal(@NO));
- expect(readyHandlerError).to(beNil());
+ OCMVerifyAllWithDelay(sdlManagerDelegateProtocolMock, 1.0);
});
});
-
- context(@"assume hmi status is nil", ^{
- it(@"mock notification and ensure state changes to ready", ^{
- __block SDLOnHMIStatus *testHMIStatus = nil;
- __block SDLHMILevel testHMILevel = nil;
- testHMIStatus = [[SDLOnHMIStatus alloc] init];
-
- SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
- response.resultCode = SDLResultSuccess;
- testManager.registerResponse = response;
-
- setToStateWithEnterTransition(nil, SDLLifecycleStateSettingUpHMI);
-
- testHMILevel = SDLHMILevelFull;
- testHMIStatus.hmiLevel = testHMILevel;
-
- [testManager.notificationDispatcher postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:testHMIStatus];
- expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateReady));
- expect(@(readyHandlerSuccess)).toEventually(equal(@YES));
- expect(readyHandlerError).toEventually(beNil());
- });
- });
- });
+ context(@"when the protocol system info is set", ^{
+ SDLSystemInfo *testSystemInfo = [[SDLSystemInfo alloc] initWithVehicleType:vehicleType softwareVersion:softwareVersion hardwareVersion:hardwareVersion];
- describe(@"transitioning to the ready state", ^{
- beforeEach(^{
- [testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:NO];
- });
+ beforeEach(^{
+ testManager.systemInfo = testSystemInfo;
+ });
- context(@"when the register response is a success", ^{
- it(@"should call the ready handler with success", ^{
+ it(@"should call not the delegate handler", ^{
SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
response.resultCode = SDLResultSuccess;
- testManager.registerResponse = response;
-
- setToStateWithEnterTransition(nil, SDLLifecycleStateReady);
-
- expect(@(readyHandlerSuccess)).toEventually(equal(@YES));
- expect(readyHandlerError).toEventually(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ response.vehicleType = vehicleType;
+ response.systemSoftwareVersion = softwareVersion;
+#pragma clang diagnostic pop
+ [testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:YES];
+
+ OCMReject([sdlManagerDelegateProtocolMock didReceiveSystemInfo:[OCMArg isNotNil]]);
});
});
- context(@"when the register response is a warning", ^{
- it(@"should call the ready handler with success but error", ^{
- SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
- response.resultCode = SDLResultWarnings;
- response.info = @"some info";
- testManager.registerResponse = response;
-
- setToStateWithEnterTransition(nil, SDLLifecycleStateReady);
-
- expect(@(readyHandlerSuccess)).toEventually(equal(@YES));
- expect(readyHandlerError).toEventuallyNot(beNil());
- expect(@(readyHandlerError.code)).toEventually(equal(@(SDLManagerErrorRegistrationSuccessWithWarning)));
- expect(readyHandlerError.userInfo[NSLocalizedFailureReasonErrorKey]).toEventually(match(response.info));
- });
- });
-
context(@"when the register response returns different language than the one passed with the lifecycle configuration", ^{
it(@"should should update the configuration when the app supports the head unit language", ^{
SDLRegisterAppInterfaceResponse *registerAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
@@ -500,7 +489,7 @@ describe(@"a lifecycle manager", ^{
SDLLifecycleConfigurationUpdate *update = [[SDLLifecycleConfigurationUpdate alloc] initWithAppName:@"EnGb" shortAppName:@"Gb" ttsName:nil voiceRecognitionCommandNames:nil];
OCMStub([testManager.delegate managerShouldUpdateLifecycleToLanguage:registerAppInterfaceResponse.language hmiLanguage:registerAppInterfaceResponse.hmiDisplayLanguage]).andReturn(update);
- transitionToState(SDLLifecycleStateUpdatingConfiguration);
+ setToStateWithEnterTransition(SDLLifecycleStateRegistered, SDLLifecycleStateUpdatingConfiguration);
OCMExpect([protocolMock sendRPC:[OCMArg checkWithBlock:^BOOL(id value) {
SDLChangeRegistration *changeRegistration = (SDLChangeRegistration *)value;
@@ -522,6 +511,113 @@ describe(@"a lifecycle manager", ^{
expect(testManager.configuration.lifecycleConfig.ttsName).toEventually(beNil());
});
});
+
+ describe(@"after receiving a disconnect notification", ^{
+ beforeEach(^{
+ OCMStub([protocolMock stopWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMStub([secondaryTransportManagerMock stopWithCompletionHandler:[OCMArg invokeBlock]]);
+ [testManager.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
+ });
+
+ it(@"should enter the started state", ^{
+ expect(testManager.lifecycleState).withTimeout(3.0).toEventually(equal(SDLLifecycleStateStarted));
+ });
+ });
+
+ describe(@"stopping the manager", ^{
+ beforeEach(^{
+ [testManager stop];
+ });
+
+ it(@"should enter the stopped state", ^{
+ expect(testManager.lifecycleState).to(equal(SDLLifecycleStateStopped));
+ });
+ });
+ });
+
+ describe(@"transitioning to the registered state when the minimum RPC version is in effect", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:1 minor:0 patch:0];
+
+ [testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:YES];
+ });
+
+ it(@"should disconnect", ^{
+ expect(testManager.lifecycleState).to(equal(SDLLifecycleStateUnregistering));
+ });
+ });
+
+ describe(@"transitioning from setting app icon state to the Setting Up HMI state", ^{
+ context(@"before register response is a success", ^{
+ it(@"ready handler should not be called yet", ^{
+ SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
+ response.resultCode = SDLResultSuccess;
+ testManager.registerResponse = response;
+
+ setToStateWithEnterTransition(nil, SDLLifecycleStateSettingUpHMI);
+
+ expect(@(readyHandlerSuccess)).to(equal(@NO));
+ expect(readyHandlerError).to(beNil());
+ });
+ });
+
+ context(@"assume hmi status is nil", ^{
+ it(@"mock notification and ensure state changes to ready", ^{
+ __block SDLOnHMIStatus *testHMIStatus = nil;
+ __block SDLHMILevel testHMILevel = nil;
+ testHMIStatus = [[SDLOnHMIStatus alloc] init];
+
+ SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
+ response.resultCode = SDLResultSuccess;
+ testManager.registerResponse = response;
+
+ setToStateWithEnterTransition(nil, SDLLifecycleStateSettingUpHMI);
+
+ testHMILevel = SDLHMILevelFull;
+ testHMIStatus.hmiLevel = testHMILevel;
+
+ [testManager.notificationDispatcher postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:testHMIStatus];
+
+ expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateReady));
+ expect(@(readyHandlerSuccess)).toEventually(equal(@YES));
+ expect(readyHandlerError).toEventually(beNil());
+ });
+ });
+ });
+
+ describe(@"transitioning from the registered state to the ready state", ^{
+ beforeEach(^{
+ [testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:NO];
+ });
+
+ context(@"when the register response is a success", ^{
+ it(@"should call the ready handler with success", ^{
+ SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
+ response.resultCode = SDLResultSuccess;
+ testManager.registerResponse = response;
+
+ setToStateWithEnterTransition(nil, SDLLifecycleStateReady);
+
+ expect(@(readyHandlerSuccess)).toEventually(equal(@YES));
+ expect(readyHandlerError).toEventually(beNil());
+ });
+ });
+
+ context(@"when the register response is a warning", ^{
+ it(@"should call the ready handler with success but error", ^{
+ SDLRegisterAppInterfaceResponse *response = [[SDLRegisterAppInterfaceResponse alloc] init];
+ response.resultCode = SDLResultWarnings;
+ response.info = @"some info";
+ testManager.registerResponse = response;
+
+ setToStateWithEnterTransition(nil, SDLLifecycleStateReady);
+
+ expect(@(readyHandlerSuccess)).toEventually(equal(@YES));
+ expect(readyHandlerError).toEventuallyNot(beNil());
+ expect(@(readyHandlerError.code)).toEventually(equal(@(SDLManagerErrorRegistrationSuccessWithWarning)));
+ expect(readyHandlerError.userInfo[NSLocalizedFailureReasonErrorKey]).toEventually(match(response.info));
+ });
+ });
});
describe(@"in the ready state", ^{
@@ -530,7 +626,7 @@ describe(@"a lifecycle manager", ^{
});
it(@"can send an RPC of type Request", ^{
- SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil alignment:nil];
+ SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil mainField3:nil mainField4:nil alignment:nil statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:nil templateTitle:nil windowID:nil templateConfiguration:nil];
OCMExpect([protocolMock sendRPC:testShow]);
[testManager sendRPC:testShow];
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m
index f2ff80c99..505edd4d5 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m
@@ -71,7 +71,7 @@ describe(@"SDLLifecycleMobileHMIStateHandler tests", ^{
describe(@"after the manager is stopped", ^{
beforeEach(^{
- [mockConnectionManager.receivedRequests removeAllObjects];
+ [mockConnectionManager reset];
[testManager stop];
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m
index 681ec9cc5..58e2495e3 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m
@@ -202,7 +202,7 @@ describe(@"SDLLifecycleProtocolHandler tests", ^{
context(@"of a protocol message", ^{
beforeEach(^{
- SDLShow *showRPC = [[SDLShow alloc] initWithMainField1:@"Test1" mainField2:@"Test2" alignment:SDLTextAlignmentLeft];
+ SDLShow *showRPC = [[SDLShow alloc] initWithMainField1:@"Test1" mainField2:@"Test2" mainField3:nil mainField4:nil alignment:SDLTextAlignmentLeft statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:nil templateTitle:nil windowID:nil templateConfiguration:nil];
SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:4];
header.serviceType = SDLServiceTypeRPC;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m
index d606b9fc0..683d3caf1 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m
@@ -123,7 +123,7 @@ describe(@"SDLLifecycleSystemRequestHandler tests", ^{
});
context(@"of type LOCK_SCREEN_URL", ^{
- __block id lockScreenIconObserver = nil;
+ __block XCTNSNotificationExpectation *lockScreenIconExpectation;
beforeEach(^{
receivedSystemRequest.requestType = SDLRequestTypeLockScreenIconURL;
@@ -131,20 +131,19 @@ describe(@"SDLLifecycleSystemRequestHandler tests", ^{
UIImage *testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil];
OCMStub([mockCacheManager retrieveImageForRequest:[OCMArg any] withCompletionHandler:([OCMArg invokeBlockWithArgs:testImage, [NSNull null], nil])]);
- lockScreenIconObserver = OCMObserverMock();
- [[NSNotificationCenter defaultCenter] addMockObserver:lockScreenIconObserver name:SDLDidReceiveLockScreenIcon object:nil];
- [[lockScreenIconObserver expect] notificationWithName:SDLDidReceiveLockScreenIcon object:[OCMArg any] userInfo:[OCMArg any]];
+ lockScreenIconExpectation = [[XCTNSNotificationExpectation alloc] initWithName:SDLDidReceiveLockScreenIcon object:nil];
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
[[NSNotificationCenter defaultCenter] postNotification:notification];
});
it(@"should pass the url to the cache manager and then send a notification", ^{
- OCMVerifyAll(lockScreenIconObserver);
+ XCTWaiterResult waiter = [XCTWaiter waitForExpectations:@[lockScreenIconExpectation] timeout:4];
+ XCTAssertEqual(waiter, XCTWaiterResultCompleted);
});
afterEach(^{
- lockScreenIconObserver = nil;
+ lockScreenIconExpectation = nil;
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m
deleted file mode 100644
index 341e10105..000000000
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-// SDLLockScreenViewControllerSnapshotTests.m
-// SmartDeviceLink-iOS
-//
-// Created by Joel Fischer on 7/27/16.
-// Copyright © 2016 smartdevicelink. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-#import <FBSnapshotTestCase/FBSnapshotTestCase.h>
-
-#import "SDLLockScreenConfiguration.h"
-#import "SDLLockScreenViewController.h"
-
-
-@interface SDLLockScreenViewControllerSnapshotTests : FBSnapshotTestCase
-
-@property (strong, nonatomic) SDLLockScreenViewController *lockScreenViewController;
-
-@end
-
-
-@implementation SDLLockScreenViewControllerSnapshotTests
-
-- (void)setUp {
- [super setUp];
-
- self.lockScreenViewController = [[UIStoryboard storyboardWithName:@"SDLLockScreen" bundle:[NSBundle bundleForClass:[self class]]] instantiateInitialViewController];
- self.lockScreenViewController.view.frame = [[UIScreen mainScreen] bounds];
-
-// self.deviceAgnostic = YES;
-// self.recordMode = YES;
-}
-
-- (void)tearDown {
- // Put teardown code here. This method is called after the invocation of each test method in the class.
- [super tearDown];
-}
-
-- (void)testNoAppNoVehicleIcons {
- self.lockScreenViewController.appIcon = nil;
- self.lockScreenViewController.vehicleIcon = nil;
- self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
-
- FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
-}
-
-- (void)testOnlyAppIcon {
- self.lockScreenViewController.appIcon = [UIImage imageNamed:@"TestLockScreenAppIcon" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
- self.lockScreenViewController.vehicleIcon = nil;
- self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
-
- FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
-}
-
-- (void)testOnlyVehicleIcon {
- self.lockScreenViewController.appIcon = nil;
- self.lockScreenViewController.vehicleIcon = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
- self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
-
- FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
-}
-
-- (void)testAppAndVehicleIcons {
- self.lockScreenViewController.appIcon = [UIImage imageNamed:@"TestLockScreenAppIcon" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];;
- self.lockScreenViewController.vehicleIcon = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
- self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
-
- FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
-}
-
-- (void)testLightBackgroundNoAppNoVehicleIcons {
- self.lockScreenViewController.appIcon = nil;
- self.lockScreenViewController.vehicleIcon = nil;
- self.lockScreenViewController.backgroundColor = [UIColor whiteColor];
-
- FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
-}
-
-@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
index 485b02b6d..fd4349887 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
@@ -10,52 +10,120 @@ describe(@"a menu cell", ^{
__block SDLMenuCell *testCell = nil;
__block SDLMenuCell *testCell2 = nil;
__block SDLMenuLayout testLayout = SDLMenuLayoutList;
+ __block NSString *someTitle = nil;
+ __block NSString *someSecondaryTitle = nil;
+ __block NSString *someTertiaryTitle = nil;
+ __block SDLArtwork *someArtwork = nil;
+ __block SDLArtwork *someSecondaryArtwork = nil;
+
+ beforeEach(^{
+ someTitle = @"Some Title";
+ someSecondaryTitle = @"Some Title 2";
+ someTertiaryTitle = @"Some Title 3";
+ someArtwork = [[SDLArtwork alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"data" options:kNilOptions] name:@"Some artwork" fileExtension:@"png" persistent:NO];
+ someSecondaryArtwork = [[SDLArtwork alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"data" options:kNilOptions] name:@"Some artwork 2" fileExtension:@"png" persistent:NO];
+ });
describe(@"initializing", ^{
- __block NSString *someTitle = nil;
- __block SDLArtwork *someArtwork = nil;
__block NSArray<NSString *> *someVoiceCommands = nil;
__block NSArray<SDLMenuCell *> *someSubcells = nil;
beforeEach(^{
- someTitle = @"Some Title";
- someArtwork = [[SDLArtwork alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"data" options:kNilOptions] name:@"Some artwork" fileExtension:@"png" persistent:NO];
someVoiceCommands = @[@"some command"];
- SDLMenuCell *subcell = [[SDLMenuCell alloc] initWithTitle:@"Hello" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *subcell = [[SDLMenuCell alloc] initWithTitle:@"Hello" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
someSubcells = @[subcell];
});
- it(@"should initialize properly as a menu item", ^{
+ it(@"should set initWithTitle:icon:submenuLayout:subCells: propertly", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork submenuLayout:testLayout subCells:someSubcells];
+#pragma clang diagnostic pop
+
+ expect(testCell.title).to(equal(someTitle));
+ expect(testCell.icon).to(equal(someArtwork));
+ expect(testCell.voiceCommands).to(beNil());
+ expect(testCell.subCells).to(equal(someSubcells));
+ expect(testCell.secondaryText).to(beNil());
+ expect(testCell.tertiaryText).to(beNil());
+ expect(testCell.secondaryArtwork).to(beNil());
+ });
+
+ it(@"should set initWithTitle:icon:voiceCommands:handler: properly", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork voiceCommands:someVoiceCommands handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+#pragma clang diagnostic pop
expect(testCell.title).to(equal(someTitle));
expect(testCell.icon).to(equal(someArtwork));
expect(testCell.voiceCommands).to(equal(someVoiceCommands));
expect(testCell.subCells).to(beNil());
+ expect(testCell.uniqueTitle).to(equal(someTitle));
+ expect(testCell.secondaryText).to(beNil());
+ expect(testCell.tertiaryText).to(beNil());
+ expect(testCell.secondaryArtwork).to(beNil());
});
- it(@"should initialize properly as a submenu item with icon and layout", ^{
- testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork submenuLayout:testLayout subCells:someSubcells];
+ it(@"should set initWithTitle:icon:voiceCommands:secondaryText:tertiaryText:secondaryArtwork:handler: properly", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:someArtwork secondaryArtwork:someSecondaryArtwork voiceCommands:someVoiceCommands handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+
+ expect(testCell.title).to(equal(someTitle));
+ expect(testCell.icon).to(equal(someArtwork));
+ expect(testCell.voiceCommands).to(equal(someVoiceCommands));
+ expect(testCell.subCells).to(beNil());
+ expect(testCell.secondaryText).to(equal(someSecondaryTitle));
+ expect(testCell.tertiaryText).to(equal(someTertiaryTitle));
+ expect(testCell.secondaryArtwork).to(equal(someSecondaryArtwork));
+ });
+
+ it(@"should initWithTitle:icon:submenuLayout:subCells:secondaryText:tertiaryText:secondaryArtwork: initialize", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:someArtwork secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:someSubcells];
expect(testCell.title).to(equal(someTitle));
expect(testCell.icon).to(equal(someArtwork));
expect(testCell.voiceCommands).to(beNil());
expect(testCell.subCells).to(equal(someSubcells));
expect(testCell.submenuLayout).to(equal(testLayout));
+ expect(testCell.uniqueTitle).to(equal(someTitle));
+ expect(testCell.secondaryText).to(equal(someSecondaryTitle));
+ expect(testCell.tertiaryText).to(equal(someTertiaryTitle));
+ expect(testCell.secondaryArtwork).to(equal(someSecondaryArtwork));
});
});
+
describe(@"check cell eqality", ^{
it(@"should compare cells and return true if cells equal", ^{
- testCell = [[SDLMenuCell alloc] initWithTitle:@"Title" icon:nil submenuLayout:testLayout subCells:@[]];
- testCell2 = [[SDLMenuCell alloc] initWithTitle:@"Title" icon:nil submenuLayout:testLayout subCells:@[]];
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:nil secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:@[]];
+ testCell2 = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:nil secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:@[]];
+
+ expect([testCell isEqual:testCell2]).to(equal(true));
+ });
+
+ it(@"should compare cells and return false if not equal ", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:@"True" secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:nil secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:@[]];
+ testCell2 = [[SDLMenuCell alloc] initWithTitle:@"False" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:testLayout subCells:@[]];
+
+ expect([testCell isEqual:testCell2]).to(equal(false));
+ });
+
+ it(@"should compare cells and return true if cells equal", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:nil submenuLayout:testLayout subCells:@[]];
+ testCell2 = [[SDLMenuCell alloc] initWithTitle:someTitle icon:nil submenuLayout:testLayout subCells:@[]];
+#pragma clang diagnostic pop
expect([testCell isEqual:testCell2]).to(equal(true));
});
it(@"should compare cells and return false if not equal ", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCell = [[SDLMenuCell alloc] initWithTitle:@"True" icon:nil submenuLayout:testLayout subCells:@[]];
testCell2 = [[SDLMenuCell alloc] initWithTitle:@"False" icon:nil submenuLayout:testLayout subCells:@[]];
+#pragma clang diagnostic pop
expect([testCell isEqual:testCell2]).to(equal(false));
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
index ff9c4e7bb..c14e177a6 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
@@ -24,17 +24,19 @@
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
-
+@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
@property (assign, nonatomic) BOOL hasQueuedUpdate;
@property (assign, nonatomic) BOOL waitingOnHMIUpdate;
@property (copy, nonatomic) NSArray<SDLMenuCell *> *waitingUpdateMenuCells;
-@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
@property (assign, nonatomic) UInt32 lastMenuId;
@property (copy, nonatomic) NSArray<SDLMenuCell *> *oldMenuCells;
+- (BOOL)sdl_shouldRPCsIncludeImages:(NSArray<SDLMenuCell *> *)cells;
+- (void)sdl_displayCapabilityDidUpdate;
+
@end
QuickSpecBegin(SDLMenuManagerSpec)
@@ -46,24 +48,33 @@ describe(@"menu manager", ^{
__block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
__block SDLArtwork *testArtwork = nil;
__block SDLArtwork *testArtwork2 = nil;
+ __block SDLArtwork *testArtwork3 = nil;
__block SDLMenuCell *textOnlyCell = nil;
__block SDLMenuCell *textOnlyCell2 = nil;
__block SDLMenuCell *textAndImageCell = nil;
+ __block SDLMenuCell *textAndImageCell2 = nil;
__block SDLMenuCell *submenuCell = nil;
+ __block SDLMenuCell *submenuCell2 = nil;
__block SDLMenuCell *submenuImageCell = nil;
__block SDLMenuConfiguration *testMenuConfiguration = nil;
+ __block SDLVersion *menuUniquenessActiveVersion = nil;
+
beforeEach(^{
testArtwork = [[SDLArtwork alloc] initWithData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
testArtwork2 = [[SDLArtwork alloc] initWithData:[@"Test data 2" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name 2" fileExtension:@"png" persistent:NO];
+ testArtwork3 = [[SDLArtwork alloc] initWithData:[@"Test data 3" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
+ testArtwork3.overwrite = YES;
- textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" icon:testArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" icon:nil submenuLayout:nil subCells:@[textOnlyCell, textAndImageCell]];
- submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 4" icon:testArtwork2 submenuLayout:SDLMenuLayoutTiles subCells:@[textOnlyCell]];
- textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ textAndImageCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork2 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textOnlyCell, textAndImageCell]];
+ submenuCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textAndImageCell, textAndImageCell2]];
+ submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 4" secondaryText:nil tertiaryText:nil icon:testArtwork2 secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:@[textOnlyCell]];
+ textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
testMenuConfiguration = [[SDLMenuConfiguration alloc] initWithMainMenuLayout:SDLMenuLayoutTiles defaultSubmenuLayout:SDLMenuLayoutList];
@@ -75,12 +86,17 @@ describe(@"menu manager", ^{
SDLImageField *commandIconField = [[SDLImageField alloc] init];
commandIconField.name = SDLImageFieldNameCommandIcon;
+ SDLImageField *subMenuSecondaryArtworkField = [[SDLImageField alloc] init];
+ subMenuSecondaryArtworkField.name = SDLImageFieldNameMenuSubMenuSecondaryImage;
+ SDLImageField *commandSecondaryArtworkField = [[SDLImageField alloc] init];
+ commandSecondaryArtworkField.name = SDLImageFieldNameMenuCommandSecondaryImage;
SDLWindowCapability *windowCapability = [[SDLWindowCapability alloc] init];
windowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
- windowCapability.imageFields = @[commandIconField];
+ windowCapability.imageFields = @[commandIconField, subMenuSecondaryArtworkField, commandSecondaryArtworkField];
windowCapability.imageTypeSupported = @[SDLImageTypeDynamic, SDLImageTypeStatic];
windowCapability.menuLayoutsAvailable = @[SDLMenuLayoutList, SDLMenuLayoutTiles];
testManager.windowCapability = windowCapability;
+ menuUniquenessActiveVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
});
it(@"should instantiate correctly", ^{
@@ -157,22 +173,104 @@ describe(@"menu manager", ^{
});
});
+ describe(@"display capability updates", ^{
+ beforeEach(^{
+ testManager.currentHMILevel = SDLHMILevelFull;
+ testManager.currentSystemContext = SDLSystemContextMain;
+ });
+
+ it(@"should save the new window capability", ^{
+ SDLWindowCapability *testWindowCapability = [[SDLWindowCapability alloc] init];
+ testWindowCapability.textFields = @[[[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1]];
+ OCMStub([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
+
+ expect(testManager.windowCapability).to(equal(testWindowCapability));
+ });
+ });
+
describe(@"updating menu cells", ^{
beforeEach(^{
testManager.currentHMILevel = SDLHMILevelFull;
testManager.currentSystemContext = SDLSystemContextMain;
});
- context(@"duplicate titles", ^{
- it(@"should fail with a duplicate title", ^{
- testManager.menuCells = @[textOnlyCell, textOnlyCell];
+ context(@"duplicate titles version >= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = menuUniquenessActiveVersion;
+ });
+
+ it(@"should not update the cells' unique title", ^{
+ testManager.menuCells = @[textAndImageCell, textAndImageCell2];
+ expect(testManager.menuCells).toNot(beEmpty());
+ expect(testManager.menuCells.firstObject.uniqueTitle).to(equal("Test 2"));
+ expect(testManager.menuCells.lastObject.uniqueTitle).to(equal("Test 2"));
+ });
+
+ it(@"should not update subcells' unique title", ^{
+ testManager.menuCells = @[submenuCell2];
+ expect(testManager.menuCells).toNot(beEmpty());
+ expect(testManager.menuCells.firstObject.subCells.firstObject.uniqueTitle).to(equal("Test 2"));
+ expect(testManager.menuCells.firstObject.subCells.lastObject.uniqueTitle).to(equal("Test 2"));
+ });
+ });
+
+ context(@"duplicate titles version <= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [[SDLVersion alloc] initWithMajor:7 minor:0 patch:0];
+ });
+
+ it(@"append a number to the unique text for main menu cells", ^{
+ testManager.menuCells = @[textAndImageCell, textAndImageCell2];
+ expect(testManager.menuCells).toNot(beEmpty());
+ expect(testManager.menuCells.firstObject.uniqueTitle).to(equal("Test 2"));
+ expect(testManager.menuCells.lastObject.uniqueTitle).to(equal("Test 2 (2)"));
+ });
+
+ it(@"should append a number to the unique text for subcells", ^{
+ testManager.menuCells = @[submenuCell2];
+ expect(testManager.menuCells).toNot(beEmpty());
+ expect(testManager.menuCells.firstObject.subCells.firstObject.uniqueTitle).to(equal("Test 2"));
+ expect(testManager.menuCells.firstObject.subCells.lastObject.uniqueTitle).to(equal("Test 2 (2)"));
+ });
+ });
+
+ context(@"when the cells contain duplicates", ^{
+ SDLMenuCell *textCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"no", @"yes"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *textCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"no", @"yes"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+
+ it(@"should fail with duplicate cells", ^{
+ testManager.menuCells = @[textCell, textCell2];
+ expect(testManager.menuCells).to(beEmpty());
+ });
+ });
+
+ context(@"when cells contain duplicate subcells", ^{
+ SDLMenuCell *subCell1 = [[SDLMenuCell alloc] initWithTitle:@"subCell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *subCell2 = [[SDLMenuCell alloc] initWithTitle:@"subCell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *textCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[subCell1, subCell2]];
+
+ it(@"should fail with duplicate cells", ^{
+ testManager.menuCells = @[textCell];
expect(testManager.menuCells).to(beEmpty());
});
});
context(@"duplicate VR commands", ^{
- __block SDLMenuCell *textAndVRCell1 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" icon:nil voiceCommands:@[@"Cat", @"Turtle"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- __block SDLMenuCell *textAndVRCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" icon:nil voiceCommands:@[@"Cat", @"Dog"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ __block SDLMenuCell *textAndVRCell1 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Turtle"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ __block SDLMenuCell *textAndVRCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Dog"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+
+ it(@"should fail when menu items have duplicate vr commands", ^{
+ testManager.menuCells = @[textAndVRCell1, textAndVRCell2];
+ expect(testManager.menuCells).to(beEmpty());
+ });
+ });
+
+ context(@"when there are duplicate VR commands in subCells", ^{
+ SDLMenuCell *textAndVRSubCell1 = [[SDLMenuCell alloc] initWithTitle:@"subCell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *textAndVRSubCell2 = [[SDLMenuCell alloc] initWithTitle:@"subCell 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *textAndVRCell1 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Turtle"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *textAndVRCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textAndVRSubCell1, textAndVRSubCell2]];
it(@"should fail when menu items have duplicate vr commands", ^{
testManager.menuCells = @[textAndVRCell1, textAndVRCell2];
@@ -180,6 +278,20 @@ describe(@"menu manager", ^{
});
});
+ it(@"should check if all artworks are uploaded and return NO", ^{
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:testArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ testManager.menuCells = @[textAndImageCell, textOnlyCell];
+ OCMVerify([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]);
+ expect([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]).to(beFalse());
+ });
+
+ it(@"should check if all artworks are uploaded and return NO", ^{
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork3 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ testManager.menuCells = @[textAndImageCell, textOnlyCell];
+ OCMVerify([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]);
+ expect([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]).to(beFalse());
+ });
+
it(@"should properly update a text cell", ^{
testManager.menuCells = @[textOnlyCell];
@@ -213,6 +325,13 @@ describe(@"menu manager", ^{
OCMStub([mockFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
});
+ it(@"should check if all artworks are uploaded", ^{
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork3 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ testManager.menuCells = @[textAndImageCell, textOnlyCell];
+ OCMVerify([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]);
+ expect([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]).to(beTrue());
+ });
+
it(@"should properly update an image cell", ^{
testManager.menuCells = @[textAndImageCell, submenuImageCell];
@@ -228,6 +347,14 @@ describe(@"menu manager", ^{
expect(submenu).to(haveCount(1));
expect(sentCommand.cmdIcon.value).to(equal(testArtwork.name));
expect(sentSubmenu.menuIcon.value).to(equal(testArtwork2.name));
+ OCMReject([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
+ });
+
+ it(@"should properly overwrite an image cell", ^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork3 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ testManager.menuCells = @[textAndImageCell, submenuImageCell];
+ OCMVerify([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
});
});
@@ -511,7 +638,7 @@ describe(@"menu manager", ^{
context(@"on a main menu cell", ^{
beforeEach(^{
- cellWithHandler = [[SDLMenuCell alloc] initWithTitle:@"Hello" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ cellWithHandler = [[SDLMenuCell alloc] initWithTitle:@"Hello" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
cellCalled = YES;
testTriggerSource = triggerSource;
}];
@@ -534,12 +661,12 @@ describe(@"menu manager", ^{
context(@"on a submenu menu cell", ^{
beforeEach(^{
- cellWithHandler = [[SDLMenuCell alloc] initWithTitle:@"Hello" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ cellWithHandler = [[SDLMenuCell alloc] initWithTitle:@"Hello" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
cellCalled = YES;
testTriggerSource = triggerSource;
}];
- SDLMenuCell *submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Submenu" icon:nil submenuLayout:SDLMenuLayoutTiles subCells:@[cellWithHandler]];
+ SDLMenuCell *submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Submenu" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:@[cellWithHandler]];
testManager.menuCells = @[submenuCell];
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
index c36e574fe..646189519 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
@@ -25,6 +25,7 @@ describe(@"a preload choices operation", ^{
__block NSString *testDisplayName = @"SDL_GENERIC";
__block NSData *cellArtData = [@"testart" dataUsingEncoding:NSUTF8StringEncoding];
+ __block NSData *cellArtData2 = [@"testart2" dataUsingEncoding:NSUTF8StringEncoding];
__block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
@@ -53,13 +54,15 @@ describe(@"a preload choices operation", ^{
windowCapability.textFields = @[primaryTextField];
OCMStub([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
});
context(@"with artworks", ^{
- __block NSSet<SDLChoiceCell *> *cellsWithArtwork = nil;
- __block NSSet<SDLChoiceCell *> *cellsWithStaticIcon = nil;
+ __block NSOrderedSet<SDLChoiceCell *> *cellsWithArtwork = nil;
+ __block NSOrderedSet<SDLChoiceCell *> *cellsWithStaticIcon = nil;
__block NSString *art1Name = @"Art1Name";
__block NSString *art2Name = @"Art2Name";
+ __block SDLArtwork *cell1Art2 = [[SDLArtwork alloc] initWithData:cellArtData2 name:art1Name fileExtension:@"png" persistent:NO];
beforeEach(^{
SDLArtwork *cell1Art = [[SDLArtwork alloc] initWithData:cellArtData name:art1Name fileExtension:@"png" persistent:NO];
@@ -71,8 +74,8 @@ describe(@"a preload choices operation", ^{
SDLArtwork *staticIconArt = [SDLArtwork artworkWithStaticIcon:SDLStaticIconNameDate];
SDLChoiceCell *cellWithStaticIcon = [[SDLChoiceCell alloc] initWithText:@"Static Icon" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:staticIconArt secondaryArtwork:nil];
- cellsWithArtwork = [NSSet setWithArray:@[cell1WithArt, cell2WithArtAndSecondary]];
- cellsWithStaticIcon = [NSSet setWithArray:@[cellWithStaticIcon]];
+ cellsWithArtwork = [[NSOrderedSet alloc] initWithArray:@[cell1WithArt, cell2WithArtAndSecondary]];
+ cellsWithStaticIcon = [[NSOrderedSet alloc] initWithArray:@[cellWithStaticIcon]];
});
context(@"if the menuName is not set", ^{
@@ -145,6 +148,25 @@ describe(@"a preload choices operation", ^{
}] completionHandler:[OCMArg any]]);
expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
});
+
+ it(@"should properly overwrite artwork", ^{
+ cell1Art2.overwrite = YES;
+ SDLChoiceCell *cell1WithArt = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:cell1Art2 voiceCommands:nil];
+
+ SDLArtwork *cell2Art = [[SDLArtwork alloc] initWithData:cellArtData name:art2Name fileExtension:@"png" persistent:NO];
+ SDLChoiceCell *cell2WithArtAndSecondary = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:cell2Art secondaryArtwork:cell2Art];
+
+ SDLArtwork *staticIconArt = [SDLArtwork artworkWithStaticIcon:SDLStaticIconNameDate];
+ SDLChoiceCell *cellWithStaticIcon = [[SDLChoiceCell alloc] initWithText:@"Static Icon" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:staticIconArt secondaryArtwork:nil];
+
+ cellsWithArtwork = [[NSOrderedSet alloc] initWithArray:@[cell1WithArt, cell2WithArtAndSecondary]];
+ cellsWithStaticIcon = [[NSOrderedSet alloc] initWithArray:@[cellWithStaticIcon]];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork];
+ [testOp start];
+
+ OCMExpect([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
+ OCMVerify([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
+ });
});
context(@"when artworks are static icons", ^{
@@ -178,12 +200,12 @@ describe(@"a preload choices operation", ^{
});
context(@"without artworks", ^{
- __block NSSet<SDLChoiceCell *> *cellsWithoutArtwork = nil;
+ __block NSOrderedSet<SDLChoiceCell *> *cellsWithoutArtwork = nil;
beforeEach(^{
SDLChoiceCell *cellBasic = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:nil voiceCommands:nil];
SDLChoiceCell *cellWithVR = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:@[@"Cell2"] artwork:nil secondaryArtwork:nil];
SDLChoiceCell *cellWithAllText = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:@"Cell2" tertiaryText:@"Cell2" voiceCommands:nil artwork:nil secondaryArtwork:nil];
- cellsWithoutArtwork = [NSSet setWithArray:@[cellBasic, cellWithVR, cellWithAllText]];
+ cellsWithoutArtwork = [[NSOrderedSet alloc] initWithArray:@[cellBasic, cellWithVR, cellWithAllText]];
});
it(@"should skip to preloading cells", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
index 7ca891608..f918c6909 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
@@ -46,6 +46,7 @@ describe(@"present choice operation", ^{
__block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
+ __block SDLWindowCapability *windowCapability = nil;
beforeEach(^{
resultError = nil;
@@ -58,9 +59,10 @@ describe(@"present choice operation", ^{
testChoices = @[cell1];
testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:@"Test Title" delegate:testChoiceDelegate layout:SDLChoiceSetLayoutTiles timeout:13 initialPromptString:@"Test initial prompt" timeoutPromptString:@"Test timeout prompt" helpPromptString:@"Test help prompt" vrHelpList:nil choices:testChoices];
+ windowCapability = [[SDLWindowCapability alloc] init];
testKeyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
OCMStub([testKeyboardDelegate customKeyboardConfiguration]).andReturn(nil);
- testKeyboardProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa layout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteText:nil autoCompleteList:nil];
+ testKeyboardProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
});
it(@"should have a priority of 'normal'", ^{
@@ -71,7 +73,7 @@ describe(@"present choice operation", ^{
describe(@"running a non-searchable choice set operation", ^{
beforeEach(^{
- testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID];
+ testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
@@ -125,7 +127,7 @@ describe(@"present choice operation", ^{
__block SDLPresentChoiceSetOperation *testCancelOp = nil;
beforeEach(^{
- testCancelOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID];
+ testCancelOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID windowCapability:windowCapability];
testCancelOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
@@ -313,7 +315,7 @@ describe(@"present choice operation", ^{
describe(@"running a searchable choice set operation", ^{
beforeEach(^{
- testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID];
+ testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
@@ -414,6 +416,25 @@ describe(@"present choice operation", ^{
}]]);
});
+ it(@"should respond to enabled keyboard event", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventInputKeyMaskEnabled;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testKeyboardDelegate keyboardDidUpdateInputMask:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }]]);
+ });
+
it(@"should respond to cancellation notifications", ^{
SDLRPCNotificationNotification *notification = nil;
@@ -460,7 +481,10 @@ describe(@"present choice operation", ^{
expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
SDLSetGlobalProperties *setProperties = testConnectionManager.receivedRequests.lastObject;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(setProperties.keyboardProperties.autoCompleteText).to(equal(inputData));
+#pragma clang diagnostic pop
});
it(@"should respond to text input notification with character set", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m
index 08424949d..389e0367d 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m
@@ -33,6 +33,7 @@ describe(@"present keyboard operation", ^{
__block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
+ __block SDLWindowCapability *windowCapability = nil;
beforeEach(^{
testOp = nil;
@@ -43,7 +44,17 @@ describe(@"present keyboard operation", ^{
testDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
OCMStub([testDelegate customKeyboardConfiguration]).andReturn(nil);
- testInitialProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa layout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteText:nil autoCompleteList:nil];
+ windowCapability = [[SDLWindowCapability alloc] init];
+ testInitialProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
+ });
+
+ afterEach(^{
+ if (testOp) {
+ // rationale: every test run creates a new operation to test, the old operation from a previous test
+ // stays 'undead' undefined time and can receive notifications causing a test fail at random
+ [[NSNotificationCenter defaultCenter] removeObserver:testOp];
+ testOp = nil;
+ }
});
it(@"should have a priority of 'normal'", ^{
@@ -54,7 +65,7 @@ describe(@"present keyboard operation", ^{
describe(@"running the operation", ^{
beforeEach(^{
- testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID];
+ testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
@@ -148,6 +159,25 @@ describe(@"present keyboard operation", ^{
}]]);
});
+ it(@"should respond to enabled keyboard event", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventInputKeyMaskEnabled;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testDelegate keyboardDidUpdateInputMask:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }]]);
+ });
+
it(@"should respond to cancellation notifications", ^{
SDLRPCNotificationNotification *notification = nil;
@@ -194,7 +224,10 @@ describe(@"present keyboard operation", ^{
expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
SDLSetGlobalProperties *setProperties = testConnectionManager.receivedRequests.lastObject;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(setProperties.keyboardProperties.autoCompleteText).to(equal(inputData));
+#pragma clang diagnostic pop
});
it(@"should respond to text input notification with character set", ^{
@@ -257,7 +290,7 @@ describe(@"present keyboard operation", ^{
describe(@"Canceling the keyboard", ^{
beforeEach(^{
- testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID];
+ testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSequentialRPCRequestOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSequentialRPCRequestOperationSpec.m
index 9f3f5cc93..ab7001ae0 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLSequentialRPCRequestOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSequentialRPCRequestOperationSpec.m
@@ -51,20 +51,19 @@ describe(@"Sending sequential requests", ^{
testOperation = [[SDLSequentialRPCRequestOperation alloc] initWithConnectionManager:testConnectionManager requests:sendRequests.copy progressHandler:^BOOL(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
TestRequestProgressResponse *progressResponse = testProgressResponses[request.correlationID];
- expect(progressResponse.percentComplete).toEventually(beCloseTo(percentComplete));
- expect(response).toEventuallyNot(beNil());
- expect(error).toEventually(beNil());
+ expect(progressResponse.percentComplete).to(beCloseTo(percentComplete));
+ expect(response).toNot(beNil());
+ expect(error).to(beNil());
[resultResponses addObject:response];
return YES;
} completionHandler:^(BOOL success) {
expect(resultResponses).to(haveCount(3));
- expect(success).to(beTruthy());
+ expect(success).to(beTrue());
}];
[testOperationQueue addOperation:testOperation];
- [NSThread sleepForTimeInterval:0.5];
});
});
@@ -82,11 +81,10 @@ describe(@"Sending sequential requests", ^{
return NO;
} completionHandler:^(BOOL success) {
expect(resultResponses).to(haveCount(1));
- expect(success).to(beFalsy());
+ expect(success).to(beFalse());
}];
[testOperationQueue addOperation:testOperation];
- [NSThread sleepForTimeInterval:0.5];
});
});
});
@@ -124,11 +122,10 @@ describe(@"Sending sequential requests", ^{
return YES;
} completionHandler:^(BOOL success) {
expect(resultResponses).to(haveCount(3));
- expect(success).to(beFalsy());
+ expect(success).to(beFalse());
}];
[testOperationQueue addOperation:testOperation];
- [NSThread sleepForTimeInterval:0.5];
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
index 4f708087b..437789ee0 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
@@ -46,7 +46,7 @@
@property (strong, nonatomic) NSMutableArray<SDLAsynchronousOperation *> *batchQueue;
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification;
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability;
+- (void)sdl_displayCapabilityDidUpdate;
@end
@@ -76,6 +76,8 @@ describe(@"a soft button manager", ^{
__block SDLArtwork *object2State1Art = [[SDLArtwork alloc] initWithData:[@"TestData" dataUsingEncoding:NSUTF8StringEncoding] name:object2State1ArtworkName fileExtension:@"png" persistent:YES];
__block SDLSoftButtonState *object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State1Art];
+ __block SDLWindowCapability *testWindowCapability = nil;
+
beforeEach(^{
testFileManager = OCMClassMock([SDLFileManager class]);
testSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
@@ -84,76 +86,108 @@ describe(@"a soft button manager", ^{
testManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager systemCapabilityManager:testSystemCapabilityManager];
[testManager start];
- SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
- status.hmiLevel = SDLHMILevelFull;
- [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
-
SDLSoftButtonCapabilities *softButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
softButtonCapabilities.imageSupported = @YES;
softButtonCapabilities.textSupported = @YES;
softButtonCapabilities.longPressAvailable = @YES;
softButtonCapabilities.shortPressAvailable = @YES;
- SDLWindowCapability *windowCapability = [[SDLWindowCapability alloc] init];
- windowCapability.softButtonCapabilities = @[softButtonCapabilities];
- SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"TEST" windowCapabilities:@[windowCapability] windowTypeSupported:nil];
- [testManager sdl_displayCapabilityDidUpdate:[[SDLSystemCapability alloc] initWithDisplayCapabilities:@[displayCapability]]];
+ testWindowCapability = [[SDLWindowCapability alloc] init];
+ testWindowCapability.softButtonCapabilities = @[softButtonCapabilities];
});
it(@"should instantiate correctly", ^{
expect(testManager.connectionManager).to(equal(testConnectionManager));
expect(testManager.fileManager).to(equal(testFileManager));
-
expect(testManager.softButtonObjects).to(beEmpty());
expect(testManager.currentMainField1).to(beNil());
expect(testManager.transactionQueue).toNot(beNil());
- expect(testManager.transactionQueue.isSuspended).to(beFalse());
- expect(testManager.softButtonCapabilities).toNot(beNil());
- expect(testManager.currentLevel).to(equal(SDLHMILevelFull));
-
- // These are set up earlier for future tests and therefore won't be nil
-// expect(testManager.windowCapability).to(beNil());
-// expect(testManager.currentLevel).to(beNil());
+ expect(testManager.transactionQueue.isSuspended).to(beTrue());
+ expect(testManager.softButtonCapabilities).to(beNil());
+ expect(testManager.currentLevel).to(beNil());
});
- context(@"when in HMI NONE", ^{
+ describe(@"the SDL app has not been opened", ^{
beforeEach(^{
- SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
- status.hmiLevel = SDLHMILevelNone;
- [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
-
testObject1 = [[SDLSoftButtonObject alloc] initWithName:@"name1" states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
testObject2 = [[SDLSoftButtonObject alloc] initWithName:@"name2" state:object2State1 handler:nil];
-
testManager.softButtonObjects = @[testObject1, testObject2];
});
- it(@"should set the soft buttons, but not update", ^{
- expect(testManager.softButtonObjects).toNot(beEmpty());
- expect(testManager.transactionQueue.suspended).to(beTrue());
+ context(@"when the HMI level notification has not been received", ^{
+ it(@"should set the soft buttons, but not update", ^{
+ expect(testManager.currentLevel).to(beNil());
+ expect(testManager.softButtonObjects).toNot(beEmpty());
+ expect(testManager.transactionQueue.suspended).to(beTrue());
+ });
+ });
+
+ context(@"when the HMI level is NONE", ^{
+ beforeEach(^{
+ SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
+ status.hmiLevel = SDLHMILevelNone;
+ [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
+ });
+
+ it(@"should set the soft buttons, but not update", ^{
+ expect(testManager.currentLevel).to(equal(SDLHMILevelNone));
+ expect(testManager.softButtonObjects).toNot(beEmpty());
+ expect(testManager.transactionQueue.suspended).to(beTrue());
+ });
});
});
- context(@"when there are no soft button capabilities", ^{
+ describe(@"the SDL app has been opened", ^{
beforeEach(^{
- SDLWindowCapability *windowCapability = [[SDLWindowCapability alloc] init];
- SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"TEST" windowCapabilities:@[windowCapability] windowTypeSupported:nil];
- [testManager sdl_displayCapabilityDidUpdate:[[SDLSystemCapability alloc] initWithDisplayCapabilities:@[displayCapability]]];
+ testObject1 = [[SDLSoftButtonObject alloc] initWithName:@"name1" states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
+ testObject2 = [[SDLSoftButtonObject alloc] initWithName:@"name2" state:object2State1 handler:nil];
+ testManager.softButtonObjects = @[testObject1, testObject2];
+
+ SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
+ status.hmiLevel = SDLHMILevelFull;
+ [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
+ });
+
+ context(@"when the soft button capabilities notification has not been received", ^{
+ beforeEach(^{
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(nil);
+ [testManager sdl_displayCapabilityDidUpdate];
+ });
+
+ it(@"should set the buttons but have the queue suspended", ^{
+ expect(testManager.softButtonObjects).toNot(beNil());
+ expect(testManager.transactionQueue.isSuspended).to(beTrue());
+ });
});
- it(@"should set the buttons but have the queue suspended", ^{
- expect(testManager.softButtonObjects).toNot(beNil());
- expect(testManager.transactionQueue.isSuspended).to(beTrue());
+ context(@"when the soft button capabilities notification has been received", ^{
+ beforeEach(^{
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
+ });
+
+ it(@"should set the buttons and unsuspend the queue", ^{
+ expect(testManager.softButtonObjects).toNot(beNil());
+ expect(testManager.transactionQueue.isSuspended).to(beFalse());
+ });
});
});
- context(@"when button objects have the same name", ^{
+ describe(@"invalid button objects (button objects have same names)", ^{
beforeEach(^{
+ SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
+ status.hmiLevel = SDLHMILevelFull;
+ [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
+
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
+
NSString *sameName = @"Same name";
testObject1 = [[SDLSoftButtonObject alloc] initWithName:sameName states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
testObject2 = [[SDLSoftButtonObject alloc] initWithName:sameName state:object2State1 handler:nil];
- testManager.softButtonObjects = @[testObject1, testObject2];
+ expectAction((^{ testManager.softButtonObjects = @[testObject1, testObject2];
+ })).to(raiseException().named(@"InvalidSoftButtonsInitialization"));
});
it(@"should fail to set the buttons", ^{
@@ -161,33 +195,44 @@ describe(@"a soft button manager", ^{
});
});
- context(@"when button objects have different names", ^{
+ // valid button objects (button objects have different names)
+ describe(@"valid button objects (button objects have different names)", ^{
beforeEach(^{
+ SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
+ status.hmiLevel = SDLHMILevelFull;
+ [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
+
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
+
testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:nil];
testManager.softButtonObjects = @[testObject1, testObject2];
- [NSThread sleepForTimeInterval:0.1];
});
+ // should set soft buttons correctly
it(@"should set soft buttons correctly", ^{
- expect(testManager.softButtonObjects).toNot(beNil());
- expect(testObject1.buttonId).to(equal(0));
- expect(testObject2.buttonId).to(equal(100));
- expect(testObject1.manager).to(equal(testManager));
- expect(testObject2.manager).to(equal(testManager));
+ expect(testManager.softButtonObjects).toEventuallyNot(beNil());
+ expect(testObject1.buttonId).toEventually(equal(1));
+ expect(testObject2.buttonId).toEventually(equal(2));
+ expect(testObject1.manager).toEventually(equal(testManager));
+ expect(testObject2.manager).toEventually(equal(testManager));
// One replace operation
- expect(testManager.transactionQueue.operationCount).to(equal(1));
+ expect(testManager.transactionQueue.operationCount).toEventually(equal(1));
});
+ // should replace earlier operations when a replace operation is entered
it(@"should replace earlier operations when a replace operation is entered", ^{
[testObject1 transitionToNextState];
testManager.softButtonObjects = @[testObject1];
- expect(testManager.transactionQueue.operationCount).to(equal(3));
- expect(testManager.transactionQueue.operations[0].isCancelled).to(beTrue());
- expect(testManager.transactionQueue.operations[1].isCancelled).to(beTrue());
- expect(testManager.transactionQueue.operations[2].isCancelled).to(beFalse());
+ [NSThread sleepForTimeInterval:0.5]; // Necessary to not get range exceptions with toEventually?
+
+ expect(testManager.transactionQueue.operationCount).withTimeout(3.0).toEventually(equal(3));
+ expect(testManager.transactionQueue.operations[0].isCancelled).withTimeout(3.0).toEventually(beTrue());
+ expect(testManager.transactionQueue.operations[1].isCancelled).withTimeout(3.0).toEventually(beTrue());
+ expect(testManager.transactionQueue.operations[2].isCancelled).withTimeout(3.0).toEventually(beFalse());
});
it(@"should retrieve soft buttons correctly", ^{
@@ -227,6 +272,13 @@ describe(@"a soft button manager", ^{
describe(@"transitioning soft button states", ^{
beforeEach(^{
+ SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
+ status.hmiLevel = SDLHMILevelFull;
+ [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
+
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
+
testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:nil];
@@ -265,6 +317,17 @@ describe(@"a soft button manager", ^{
context(@"On disconnects", ^{
beforeEach(^{
+ SDLOnHMIStatus *status = [[SDLOnHMIStatus alloc] init];
+ status.hmiLevel = SDLHMILevelFull;
+ [testManager sdl_hmiStatusNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:status]];
+
+ OCMStub([testSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
+
+ testObject1 = [[SDLSoftButtonObject alloc] initWithName:@"name1" states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil];
+ testObject2 = [[SDLSoftButtonObject alloc] initWithName:@"name2" state:object2State1 handler:nil];
+ testManager.softButtonObjects = @[testObject1, testObject2];
+
[testManager stop];
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
index 4a39a0676..cca65997b 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
@@ -27,7 +27,6 @@
@interface SDLStreamingAudioLifecycleManager()
@property (weak, nonatomic) SDLProtocol *protocol;
-@property (copy, nonatomic, nullable) NSString *connectedVehicleMake;
@property (nonatomic, strong, readwrite) SDLAudioStreamManager *audioTranscodingManager;
@end
@@ -98,32 +97,11 @@ describe(@"the streaming audio manager", ^{
expect(streamingLifecycleManager.currentAudioStreamState).to(match(SDLAudioStreamManagerStateStopped));
});
- describe(@"after receiving a register app interface response", ^{
- __block SDLRegisterAppInterfaceResponse *someRegisterAppInterfaceResponse = nil;
- __block SDLVehicleType *testVehicleType = nil;
-
- beforeEach(^{
- someRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
- testVehicleType = [[SDLVehicleType alloc] init];
- testVehicleType.make = @"TestVehicleType";
- someRegisterAppInterfaceResponse.vehicleType = testVehicleType;
-
- SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
- });
-
- it(@"should should save the connected vehicle make", ^{
- expect(streamingLifecycleManager.connectedVehicleMake).toEventually(equal(testVehicleType.make));
- });
- });
-
describe(@"if the app state is active", ^{
__block id streamStub = nil;
beforeEach(^{
streamStub = OCMPartialMock(streamingLifecycleManager);
-
OCMStub([streamStub isStreamingSupported]).andReturn(YES);
[streamingLifecycleManager.appStateMachine setToState:SDLAppStateActive fromOldState:nil callEnterTransition:NO];
@@ -395,7 +373,6 @@ describe(@"the streaming audio manager", ^{
[streamingLifecycleManager endAudioServiceWithCompletionHandler:^ {
handlerCalled = YES;
}];
- streamingLifecycleManager.connectedVehicleMake = @"OEM_make_2";
});
context(@"when the manager is READY", ^{
@@ -409,7 +386,6 @@ describe(@"the streaming audio manager", ^{
expect(streamingLifecycleManager.protocol).to(beNil());
expect(streamingLifecycleManager.hmiLevel).to(equal(SDLHMILevelNone));
- expect(streamingLifecycleManager.connectedVehicleMake).to(beNil());
OCMVerify([mockAudioStreamManager stop]);
expect(handlerCalled).to(beTrue());
});
@@ -426,7 +402,6 @@ describe(@"the streaming audio manager", ^{
expect(streamingLifecycleManager.protocol).to(beNil());
expect(streamingLifecycleManager.hmiLevel).to(equal(SDLHMILevelNone));
- expect(streamingLifecycleManager.connectedVehicleMake).to(beNil());
OCMReject([mockAudioStreamManager stop]);
expect(handlerCalled).to(beFalse());
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingMediaConfigurationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingMediaConfigurationSpec.m
index 5132e0551..c1dd911b4 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingMediaConfigurationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingMediaConfigurationSpec.m
@@ -1,11 +1,14 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
#import <VideoToolbox/VideoToolbox.h>
#import "SDLStreamingMediaConfiguration.h"
#import "SDLFakeSecurityManager.h"
#import "SDLFakeStreamingManagerDataSource.h"
+#import "SDLImageResolution.h"
+#import "SDLVideoStreamingRange.h"
QuickSpecBegin(SDLStreamingMediaConfigurationSpec)
@@ -15,21 +18,45 @@ describe(@"a streaming media configuration", ^{
__block UIViewController *testViewController = nil;
__block SDLStreamingEncryptionFlag testEncryptionFlag = SDLStreamingEncryptionFlagNone;
__block SDLFakeStreamingManagerDataSource *testDataSource = nil;
+ __block id<SDLStreamingVideoDelegate> testDelegate = nil;
__block NSDictionary<NSString *, id> *testVideoEncoderSettings = nil;
+ __block SDLVideoStreamingRange *testLandscapeRange = nil;
+ __block SDLVideoStreamingRange *testPortraitRange = nil;
beforeEach(^{
testFakeSecurityManager = [[SDLFakeSecurityManager alloc] init];
testDataSource = [[SDLFakeStreamingManagerDataSource alloc] init];
+ testDelegate = OCMProtocolMock(@protocol(SDLStreamingVideoDelegate));
testVideoEncoderSettings = @{
(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate : @1
};
testViewController = [[UIViewController alloc] init];
testEncryptionFlag = SDLStreamingEncryptionFlagAuthenticateAndEncrypt;
+ testLandscapeRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:[[SDLImageResolution alloc] initWithWidth:100 height:100] maximumResolution:[[SDLImageResolution alloc] initWithWidth:200 height:200]];
+ testPortraitRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:[[SDLImageResolution alloc] initWithWidth:50 height:50] maximumResolution:[[SDLImageResolution alloc] initWithWidth:150 height:150]];
});
context(@"That is created without the default secure/insecure settings", ^{
+ it(@"should properly set all properties with initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:", ^{
+ testConfig = [[SDLStreamingMediaConfiguration alloc] initWithEncryptionFlag:testEncryptionFlag videoSettings:testVideoEncoderSettings supportedLandscapeRange:testLandscapeRange supportedPortraitRange:testPortraitRange dataSource:testDataSource delegate:testDelegate rootViewController:testViewController];
+
+ expect(@(testConfig.maximumDesiredEncryption)).to(equal(@(testEncryptionFlag)));
+ expect(testConfig.customVideoEncoderSettings).to(equal(testVideoEncoderSettings));
+ expect(testConfig.allowMultipleViewControllerOrientations).to(equal(NO));
+ expect(testConfig.dataSource).to(equal(testDataSource));
+ expect(testConfig.rootViewController).to(equal(testViewController));
+ expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
+ expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(equal(testDelegate));
+ expect(testConfig.supportedPortraitStreamingRange).to(equal(testPortraitRange));
+ expect(testConfig.supportedLandscapeStreamingRange).to(equal(testLandscapeRange));
+ });
+
it(@"should have properly set all properties with initWithEncryptionFlag:videoSettings:dataSource:rootViewController:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
testConfig = [[SDLStreamingMediaConfiguration alloc] initWithEncryptionFlag:testEncryptionFlag videoSettings:testVideoEncoderSettings dataSource:testDataSource rootViewController:testViewController];
+#pragma clang diagnostic pop
expect(@(testConfig.maximumDesiredEncryption)).to(equal(@(testEncryptionFlag)));
expect(testConfig.customVideoEncoderSettings).to(equal(testVideoEncoderSettings));
@@ -38,6 +65,9 @@ describe(@"a streaming media configuration", ^{
expect(testConfig.rootViewController).to(equal(testViewController));
expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(beNil());
+ expect(testConfig.supportedPortraitStreamingRange).to(beNil());
+ expect(testConfig.supportedLandscapeStreamingRange).to(beNil());
});
it(@"should have properly set and insecure configuration with init", ^{
@@ -50,6 +80,9 @@ describe(@"a streaming media configuration", ^{
expect(testConfig.rootViewController).to(beNil());
expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(beNil());
+ expect(testConfig.supportedPortraitStreamingRange).to(beNil());
+ expect(testConfig.supportedLandscapeStreamingRange).to(beNil());
});
});
@@ -64,6 +97,9 @@ describe(@"a streaming media configuration", ^{
expect(testConfig.rootViewController).to(beNil());
expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(beNil());
+ expect(testConfig.supportedPortraitStreamingRange).to(beNil());
+ expect(testConfig.supportedLandscapeStreamingRange).to(beNil());
});
it(@"should have properly set properties with autostreamingInsecureConfigurationWithInitialViewController", ^{
@@ -76,6 +112,9 @@ describe(@"a streaming media configuration", ^{
expect(testConfig.rootViewController).to(equal(testViewController));
expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(beNil());
+ expect(testConfig.supportedPortraitStreamingRange).to(beNil());
+ expect(testConfig.supportedLandscapeStreamingRange).to(beNil());
});
});
@@ -90,6 +129,9 @@ describe(@"a streaming media configuration", ^{
expect(testConfig.rootViewController).to(beNil());
expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(beNil());
+ expect(testConfig.supportedPortraitStreamingRange).to(beNil());
+ expect(testConfig.supportedLandscapeStreamingRange).to(beNil());
});
it(@"should have properly set properties with autostreamingSecureConfigurationWithInitialViewController:", ^{
@@ -102,15 +144,18 @@ describe(@"a streaming media configuration", ^{
expect(testConfig.rootViewController).to(equal(testViewController));
expect(@(testConfig.carWindowRenderingType)).to(equal(@(SDLCarWindowRenderingTypeLayer)));
expect(testConfig.enableForcedFramerateSync).to(beTrue());
+ expect(testConfig.delegate).to(beNil());
+ expect(testConfig.supportedPortraitStreamingRange).to(beNil());
+ expect(testConfig.supportedLandscapeStreamingRange).to(beNil());
});
});
- context(@"copying a filter", ^{
+ context(@"copying a configuration", ^{
__block SDLStreamingMediaConfiguration *testStreamingMediaConfiguration = nil;
__block SDLStreamingMediaConfiguration *testCopiedStreamingMediaConfiguration = nil;
beforeEach(^{
- testStreamingMediaConfiguration = [[SDLStreamingMediaConfiguration alloc] initWithEncryptionFlag:testEncryptionFlag videoSettings:testVideoEncoderSettings dataSource:testDataSource rootViewController:testViewController];
+ testStreamingMediaConfiguration = [[SDLStreamingMediaConfiguration alloc] initWithEncryptionFlag:testEncryptionFlag videoSettings:testVideoEncoderSettings supportedLandscapeRange:testLandscapeRange supportedPortraitRange:testPortraitRange dataSource:testDataSource delegate:testDelegate rootViewController:testViewController];
testCopiedStreamingMediaConfiguration = [testStreamingMediaConfiguration copy];
});
@@ -123,6 +168,9 @@ describe(@"a streaming media configuration", ^{
expect(@(testCopiedStreamingMediaConfiguration.carWindowRenderingType)).to(equal(testStreamingMediaConfiguration.carWindowRenderingType));
expect(testCopiedStreamingMediaConfiguration.enableForcedFramerateSync).to(equal(testStreamingMediaConfiguration.enableForcedFramerateSync));
expect(testCopiedStreamingMediaConfiguration.allowMultipleViewControllerOrientations).to(equal(testStreamingMediaConfiguration.allowMultipleViewControllerOrientations));
+ expect(testCopiedStreamingMediaConfiguration.delegate).to(equal(testStreamingMediaConfiguration.delegate));
+ expect(testCopiedStreamingMediaConfiguration.supportedPortraitStreamingRange).to(equal(testStreamingMediaConfiguration.supportedPortraitStreamingRange));
+ expect(testCopiedStreamingMediaConfiguration.supportedLandscapeStreamingRange).to(equal(testStreamingMediaConfiguration.supportedLandscapeStreamingRange));
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
index c42e10961..6b7902b5a 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
@@ -17,10 +17,12 @@
#import "SDLGetSystemCapabilityResponse.h"
#import "SDLGenericResponse.h"
#import "SDLGlobals.h"
+#import "SDLH264VideoEncoder.h"
#import "SDLHMICapabilities.h"
#import "SDLHMILevel.h"
#import "SDLImageResolution.h"
#import "SDLLifecycleConfiguration.h"
+#import "SDLLogMacros.h"
#import "SDLLockScreenConfiguration.h"
#import "SDLLogConfiguration.h"
#import "SDLOnHMIStatus.h"
@@ -33,103 +35,413 @@
#import "SDLStreamingMediaConfiguration.h"
#import "SDLStreamingVideoLifecycleManager.h"
#import "SDLStreamingVideoScaleManager.h"
+#import "SDLVideoStreamingRange.h"
#import "SDLSystemCapability.h"
#import "SDLSystemCapabilityManager.h"
#import "SDLV2ProtocolHeader.h"
#import "SDLV2ProtocolMessage.h"
#import "SDLVehicleType.h"
+#import "SDLVersion.h"
#import "SDLVideoStreamingCapability.h"
#import "SDLVideoStreamingState.h"
#import "SDLVehicleType.h"
#import "TestConnectionManager.h"
+#import "TestSmartConnectionManager.h"
+#import "TestStreamingMediaDelegate.h"
-
-@interface SDLStreamingVideoLifecycleManager ()
+// expose private methods to the test suite
+@interface SDLStreamingVideoLifecycleManager (test)
@property (weak, nonatomic) SDLProtocol *protocol;
@property (copy, nonatomic, readonly) NSString *appName;
@property (copy, nonatomic, readonly) NSString *videoStreamBackgroundString;
-@property (copy, nonatomic, nullable) NSString *connectedVehicleMake;
+@property (strong, nonatomic, nullable) SDLVideoStreamingRange *supportedLandscapeStreamingRange;
+@property (strong, nonatomic, nullable) SDLVideoStreamingRange *supportedPortraitStreamingRange;
+@property (weak, nonatomic, nullable) id<SDLStreamingVideoDelegate> delegate;
+@property (assign, nonatomic) BOOL shouldAutoResume;
+@property (strong, nonatomic, nullable) SDLVideoStreamingCapability *videoStreamingCapability;
+@property (strong, nonatomic, nullable) SDLVideoStreamingCapability *videoStreamingCapabilityUpdated;
+@property (strong, nonatomic, nullable) CADisplayLink *displayLink;
+@property (strong, nonatomic) NSMutableDictionary *videoEncoderSettings;
+@property (copy, nonatomic) NSDictionary<NSString *, id> *customEncoderSettings;
+
+- (void)sdl_shutDown;
+- (NSArray<SDLVideoStreamingCapability *>* __nullable)matchVideoCapability:(SDLVideoStreamingCapability *)videoStreamingCapability;
+- (void)sdl_suspendVideo;
+- (void)didEnterStateVideoStreamStopped;
+- (void)didEnterStateVideoStreamStarting;
+- (void)didEnterStateVideoStreamReady;
+- (void)didEnterStateVideoStreamSuspended;
+- (void)sdl_videoStreamingCapabilityDidUpdate:(SDLSystemCapability *)systemCapability;
+- (void)sdl_applyVideoCapability:(SDLVideoStreamingCapability *)capability;
+
+@end
+@interface SDLStreamingVideoLifecycleTestManager : SDLStreamingVideoLifecycleManager
+@property (assign) BOOL didStopVideoSession;
+@property (strong, nullable) id testVideoCapabilityUpdatedWhileStarting;
+@property (strong, nullable) id testVideoCapabilityUpdatedWhenStreaming;
@end
-QuickSpecBegin(SDLStreamingVideoLifecycleManagerSpec)
+@implementation SDLStreamingVideoLifecycleTestManager
+
+- (BOOL)isVideoConnected {
+ return NO;
+}
+
+- (void)sdl_stopVideoSession {
+ self.didStopVideoSession = YES;
+}
+
+- (void)sdl_applyVideoCapabilityWhileStarting:(SDLVideoStreamingCapability *)videoCapabilityUpdated {
+ self.testVideoCapabilityUpdatedWhileStarting = videoCapabilityUpdated;
+}
+
+- (void)sdl_applyVideoCapabilityWhenStreaming:(nullable SDLVideoStreamingCapability *)videoCapability {
+ self.testVideoCapabilityUpdatedWhenStreaming = videoCapability;
+}
+
+- (BOOL)isAppStateVideoStreamCapable {
+ return YES;
+}
+
+- (SDLVideoStreamingFormat *)videoFormat {
+ return [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRAW];
+}
+
+- (SDLH264VideoEncoder *)videoEncoder {
+ return OCMClassMock([SDLH264VideoEncoder class]);
+}
+
+- (BOOL)useDisplayLink {
+ return YES;
+}
+
+@end
+
+
+// expose private methods to the test suite
+@interface SDLVideoStreamingCapability (test)
+- (NSArray <SDLVideoStreamingCapability *> *)allVideoStreamingCapabilities;
+- (instancetype)shortCopy;
+@end
+
+// video streaming capabilities values for testing, used in SDLGetSystemCapabilityResponse
+static const float testVSCScale = 1.25;
+static const int32_t testVSCMaxBitrate = 12345;
+static const uint16_t testVSCResolutionWidth = 42;
+static const uint16_t testVSCResolutionHeight = 69;
+NSString *const testAppName = @"Test App";
+
+static void postRAINotification(void);
+static void sendNotificationForHMILevel(SDLHMILevel hmiLevel, SDLVideoStreamingState streamState);
+static SDLGetSystemCapabilityResponse *createSystemCapabilityResponse(void);
+
+#pragma mark - test Init
-describe(@"the streaming video manager", ^{
+QuickSpecBegin(SDLStreamingVideoLifecycleManagerSpec_Init)
+
+describe(@"init tests", ^{
__block SDLStreamingVideoLifecycleManager *streamingLifecycleManager = nil;
- __block SDLStreamingMediaConfiguration *testConfiguration = [SDLStreamingMediaConfiguration insecureConfiguration];
- __block SDLCarWindowViewController *testViewController = [[SDLCarWindowViewController alloc] init];
- __block SDLFakeStreamingManagerDataSource *testDataSource = [[SDLFakeStreamingManagerDataSource alloc] init];
- __block TestConnectionManager *testConnectionManager = nil;
- __block NSString *testAppName = @"Test App";
- __block SDLLifecycleConfiguration *testLifecycleConfiguration = [SDLLifecycleConfiguration defaultConfigurationWithAppName:testAppName fullAppId:@""];
__block SDLSystemCapabilityManager *testSystemCapabilityManager = nil;
+ SDLStreamingMediaConfiguration *testConfiguration = [SDLStreamingMediaConfiguration insecureConfiguration];
+ SDLCarWindowViewController *testViewController = [[SDLCarWindowViewController alloc] init];
+ SDLFakeStreamingManagerDataSource *testDataSource = [[SDLFakeStreamingManagerDataSource alloc] init];
+ SDLLifecycleConfiguration *testLifecycleConfiguration = [SDLLifecycleConfiguration defaultConfigurationWithAppName:testAppName fullAppId:@""];
__block SDLConfiguration *testConfig = nil;
-
- __block void (^sendNotificationForHMILevel)(SDLHMILevel hmiLevel, SDLVideoStreamingState streamState) = ^(SDLHMILevel hmiLevel, SDLVideoStreamingState streamState) {
- SDLOnHMIStatus *hmiStatus = [[SDLOnHMIStatus alloc] init];
- hmiStatus.hmiLevel = hmiLevel;
- hmiStatus.videoStreamingState = streamState;
- SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:self rpcNotification:hmiStatus];
- [[NSNotificationCenter defaultCenter] postNotification:notification];
- };
+ SDLSystemInfo *testSystemInfo = [[SDLSystemInfo alloc] initWithMake:@"Livio" model:@"Model" trim:@"Trim" modelYear:@"2021" softwareVersion:@"1.1.1.1" hardwareVersion:@"2.2.2.2"];
+ __block TestSmartConnectionManager *testConnectionManager = nil;
+ SDLVersion *version600 = [SDLVersion versionWithMajor:6 minor:0 patch:0];
beforeEach(^{
- testConfiguration.customVideoEncoderSettings = @{
- (__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate : @1
- };
+ // set up proper version
+ [SDLGlobals sharedGlobals].rpcVersion = version600;
+ [SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = version600;
+
+ testConfiguration.customVideoEncoderSettings = @{(id)kVTCompressionPropertyKey_ExpectedFrameRate : @1};
testConfiguration.dataSource = testDataSource;
testConfiguration.rootViewController = testViewController;
- testConnectionManager = [[TestConnectionManager alloc] init];
+ testConnectionManager = [[TestSmartConnectionManager alloc] init];
+ testConnectionManager.systemInfo = testSystemInfo;
+
+ // load connection manager with fake data
+ TestSmartConnection *connectionModel = [[TestSmartConnection alloc] init];
+ SDLGetSystemCapability *getRequest = [[SDLGetSystemCapability alloc] initWithType:SDLSystemCapabilityTypeVideoStreaming];
+ connectionModel.request = getRequest;
+ connectionModel.response = createSystemCapabilityResponse();
+ [testConnectionManager addConnectionModel:connectionModel];
testLifecycleConfiguration.appType = SDLAppHMITypeNavigation;
testConfig = [[SDLConfiguration alloc] initWithLifecycle:testLifecycleConfiguration lockScreen:[SDLLockScreenConfiguration enabledConfiguration] logging:[SDLLogConfiguration debugConfiguration] streamingMedia:testConfiguration fileManager:[SDLFileManagerConfiguration defaultConfiguration] encryption:nil];
+ });
- testSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
- streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfig systemCapabilityManager:testSystemCapabilityManager];
+ it(@"should return true by default if the system capability manager is nil", ^{
+ SDLStreamingVideoLifecycleManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfig systemCapabilityManager:nil];
+ expect(streamingLifecycleManager.isStreamingSupported).to(beTrue());
+ });
+
+ context(@"having inited", ^{
+ beforeEach(^{
+ testSystemCapabilityManager = [[SDLSystemCapabilityManager alloc] initWithConnectionManager:testConnectionManager];
+ streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfig systemCapabilityManager:testSystemCapabilityManager];
+ testConnectionManager.lastRequestBlock = ^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ SDLLogD(@"testConnectionManager.lastRequestBlock:\n\trequest:{%@};\n\tresponse:{%@}\n\terror:{%@};", request, response, error);
+ };
+ });
+
+ afterEach(^{
+ if (streamingLifecycleManager) {
+ // sdl_shutDown: unsubscribe from notifications, otherwise the zombie managers will still receive all notifications
+ [streamingLifecycleManager sdl_shutDown];
+ streamingLifecycleManager = nil;
+ }
+ });
+
+ it(@"expect post RAI change streaming inner state", ^{
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
+ postRAINotification();
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@YES));
+ });
+
+ it(@"should get the value from the system capability manager", ^{
+ expect([testSystemCapabilityManager isCapabilitySupported:SDLSystemCapabilityTypeVideoStreaming]).to(equal(NO));
+ postRAINotification();
+ expect([testSystemCapabilityManager isCapabilitySupported:SDLSystemCapabilityTypeVideoStreaming]).to(equal(YES));
+ });
+
+ it(@"expect all properties to be inited properly", ^{
+ postRAINotification();
+ expect(streamingLifecycleManager.videoScaleManager.scale).to(equal([[SDLStreamingVideoScaleManager alloc] init].scale));
+ expect(streamingLifecycleManager.touchManager).toNot(beNil());
+ expect(streamingLifecycleManager.focusableItemManager).toNot(beNil());
+ expect(streamingLifecycleManager.isStreamingSupported).to(equal(YES));
+ expect(@(streamingLifecycleManager.isVideoConnected)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isVideoEncrypted)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isVideoStreamingPaused)).to(equal(@YES));
+ expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeZero))).to(equal(@YES));
+ expect(@(streamingLifecycleManager.pixelBufferPool == NULL)).to(equal(@YES));
+ expect(@(streamingLifecycleManager.requestedEncryptionType)).to(equal(@(SDLStreamingEncryptionFlagNone)));
+ expect(@(streamingLifecycleManager.showVideoBackgroundDisplay)).to(equal(@YES));
+ expect(streamingLifecycleManager.currentAppState).to(equal(SDLAppStateActive));
+ expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
+ expect(streamingLifecycleManager.videoFormat).to(beNil());
+ expect(streamingLifecycleManager.dataSource).to(equal(testDataSource));
+ expect(streamingLifecycleManager.supportedFormats).to(haveCount(2));
+ expect(streamingLifecycleManager.preferredFormats).to(beNil());
+ expect(streamingLifecycleManager.preferredResolutions).to(beNil());
+ expect(streamingLifecycleManager.preferredFormatIndex).to(equal(0));
+ expect(streamingLifecycleManager.preferredResolutionIndex).to(equal(0));
+ });
});
+});
- it(@"should initialize properties", ^{
- expect(streamingLifecycleManager.videoScaleManager.scale).to(equal([[SDLStreamingVideoScaleManager alloc] init].scale));
- expect(streamingLifecycleManager.touchManager).toNot(beNil());
- expect(streamingLifecycleManager.focusableItemManager).toNot(beNil());
- expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isVideoConnected)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isVideoEncrypted)).to(equal(@NO));
- expect(@(streamingLifecycleManager.isVideoStreamingPaused)).to(equal(@YES));
- expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeZero))).to(equal(@YES));
- expect(@(streamingLifecycleManager.pixelBufferPool == NULL)).to(equal(@YES));
- expect(@(streamingLifecycleManager.requestedEncryptionType)).to(equal(@(SDLStreamingEncryptionFlagNone)));
- expect(@(streamingLifecycleManager.showVideoBackgroundDisplay)).to(equal(@YES));
- expect(streamingLifecycleManager.currentAppState).to(equal(SDLAppStateActive));
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
- expect(streamingLifecycleManager.videoFormat).to(beNil());
- expect(streamingLifecycleManager.dataSource).to(equal(testDataSource));
- expect(streamingLifecycleManager.supportedFormats).to(haveCount(2));
- expect(streamingLifecycleManager.preferredFormats).to(beNil());
- expect(streamingLifecycleManager.preferredResolutions).to(beNil());
- expect(streamingLifecycleManager.preferredFormatIndex).to(equal(0));
- expect(streamingLifecycleManager.preferredResolutionIndex).to(equal(0));
+QuickSpecEnd
+
+#pragma mark - test Runtime
+
+QuickSpecBegin(SDLStreamingVideoLifecycleManagerSpec_Runtime)
+
+describe(@"test internals", ^{
+ context(@"init extended manager", ^{
+ id<SDLConnectionManagerType> mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ SDLConfiguration *configuration = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleTestManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleTestManager alloc] initWithConnectionManager:mockConnectionManager configuration:configuration systemCapabilityManager:nil];
+ SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
+ it(@"suspendVideo with and without a protocol", ^{
+ expect(streamingLifecycleManager.didStopVideoSession).to(equal(NO));
+ [streamingLifecycleManager sdl_suspendVideo];
+ expect(streamingLifecycleManager.didStopVideoSession).to(equal(NO));
+ streamingLifecycleManager.protocol = protocolMock;
+ [streamingLifecycleManager sdl_suspendVideo];
+ expect(streamingLifecycleManager.didStopVideoSession).to(equal(YES));
+ });
});
- describe(@"Getting isStreamingSupported", ^{
- it(@"should get the value from the system capability manager", ^{
- [streamingLifecycleManager isStreamingSupported];
- OCMVerify([testSystemCapabilityManager isCapabilitySupported:SDLSystemCapabilityTypeVideoStreaming]);
+ context(@"init extended manager", ^{
+ id<SDLConnectionManagerType> mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ SDLConfiguration *configuration = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleTestManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleTestManager alloc] initWithConnectionManager:mockConnectionManager configuration:configuration systemCapabilityManager:nil];
+
+ context(@"test didEnterStateVideoStreamStopped", ^{
+ it(@"state before and after", ^{
+ streamingLifecycleManager.shouldAutoResume = YES;
+ SDLState *stateBefore = streamingLifecycleManager.videoStreamStateMachine.currentState;
+ expect([stateBefore isEqualToString:SDLVideoStreamManagerStateStopped]).to(equal(YES));
+
+ [streamingLifecycleManager didEnterStateVideoStreamStopped];
+
+ SDLState *stateAfter = streamingLifecycleManager.videoStreamStateMachine.currentState;
+ expect([stateAfter isEqualToString:SDLVideoStreamManagerStateStarting]).to(equal(YES));
+ });
+ });
+ });
+
+ context(@"init extended manager", ^{
+ id<SDLConnectionManagerType> mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ SDLConfiguration *configuration = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleTestManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleTestManager alloc] initWithConnectionManager:mockConnectionManager configuration:configuration systemCapabilityManager:nil];
+
+ context(@"test videoStreamingCapabilityUpdated", ^{
+ SDLVideoStreamingCapability *videoStreamingCapabilityUpdated = OCMClassMock([SDLVideoStreamingCapability class]);
+ streamingLifecycleManager.videoStreamingCapabilityUpdated = videoStreamingCapabilityUpdated;
+ it(@"expect correct state", ^{
+ streamingLifecycleManager.shouldAutoResume = YES;
+ expect(streamingLifecycleManager.videoStreamingCapabilityUpdated).notTo(beNil());
+ expect(streamingLifecycleManager.videoStreamingCapabilityUpdated).to(equal(videoStreamingCapabilityUpdated));
+
+ [streamingLifecycleManager didEnterStateVideoStreamStarting];
+
+ expect(streamingLifecycleManager.videoStreamingCapabilityUpdated).to(beNil());
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhileStarting).to(equal(videoStreamingCapabilityUpdated));
+ });
});
+ });
+
+ context(@"init extended manager", ^{
+ id<SDLConnectionManagerType> mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ SDLConfiguration *configuration = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleTestManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleTestManager alloc] initWithConnectionManager:mockConnectionManager configuration:configuration systemCapabilityManager:nil];
- it(@"should return true by default if the system capability manager is nil", ^{
- streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfig systemCapabilityManager:nil];
- expect(streamingLifecycleManager.isStreamingSupported).to(beTrue());
+ context(@"test didEnterStateVideoStreamReady", ^{
+ it(@"expect displayLink update properly", ^{
+ expect(streamingLifecycleManager.displayLink).to(beNil());
+ [streamingLifecycleManager didEnterStateVideoStreamReady];
+ expect([streamingLifecycleManager.displayLink isKindOfClass:[CADisplayLink class]]).toEventually(beTrue());
+ });
+ });
+
+ context(@"test didEnterStateVideoStreamSuspended", ^{
+ SDLVideoStreamingCapability *videoStreamingCapabilityUpdated = OCMClassMock([SDLVideoStreamingCapability class]);
+ streamingLifecycleManager.videoStreamingCapabilityUpdated = videoStreamingCapabilityUpdated;
+ it(@"expect properties to update properly", ^{
+ streamingLifecycleManager.shouldAutoResume = YES;
+
+ expect(streamingLifecycleManager.shouldAutoResume).to(equal(YES));
+ expect(streamingLifecycleManager.videoStreamingCapabilityUpdated).notTo(beNil());
+ expect(streamingLifecycleManager.videoStreamingCapabilityUpdated).to(equal(videoStreamingCapabilityUpdated));
+
+ [streamingLifecycleManager didEnterStateVideoStreamSuspended];
+
+ expect(streamingLifecycleManager.shouldAutoResume).to(equal(NO));
+ expect(streamingLifecycleManager.videoStreamingCapability).toEventually(equal(videoStreamingCapabilityUpdated));
+ expect(streamingLifecycleManager.shouldAutoResume).toEventually(equal(NO));
+
+ [streamingLifecycleManager.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStarting];
+ SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
+ SDLProtocolMessage *startServiceNAK = OCMClassMock([SDLProtocolMessage class]);
+ SDLState *stateBefore = streamingLifecycleManager.videoStreamStateMachine.currentState;
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceNAK:startServiceNAK];
+ SDLState *stateAfter = streamingLifecycleManager.videoStreamStateMachine.currentState;
+
+ expect(stateBefore).to(equal(SDLVideoStreamManagerStateStarting));
+ expect(stateAfter).to(equal(SDLVideoStreamManagerStateStarting));
+ });
});
});
+ context(@"init extended manager", ^{
+ id<SDLConnectionManagerType> mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ SDLConfiguration *configuration = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleTestManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleTestManager alloc] initWithConnectionManager:mockConnectionManager configuration:configuration systemCapabilityManager:nil];
+
+ context(@"test sdl_videoStreamingCapabilityDidUpdate", ^{
+ streamingLifecycleManager.shouldAutoResume = YES;
+ SDLVideoStreamingCapability *videoStreamingCapabilityUpdated = OCMClassMock([SDLVideoStreamingCapability class]);
+ streamingLifecycleManager.videoStreamingCapabilityUpdated = videoStreamingCapabilityUpdated;
+ it(@"expect correct state", ^{
+ SDLSystemCapability *systemCapability = nil;
+ [streamingLifecycleManager.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStarting];
+ SDLState *stateBefore = streamingLifecycleManager.videoStreamStateMachine.currentState;
+ [streamingLifecycleManager sdl_videoStreamingCapabilityDidUpdate:systemCapability];
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhileStarting).to(beNil());
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhenStreaming).to(beNil());
+ SDLState *stateAfter = streamingLifecycleManager.videoStreamStateMachine.currentState;
+
+ expect(stateBefore).to(equal(SDLVideoStreamManagerStateStarting));
+ expect(stateAfter).to(equal(SDLVideoStreamManagerStateStarting));
+
+ systemCapability = [[SDLSystemCapability alloc] init];
+ systemCapability.videoStreamingCapability = OCMClassMock([SDLVideoStreamingCapability class]);
+
+ stateBefore = streamingLifecycleManager.videoStreamStateMachine.currentState;
+ [streamingLifecycleManager sdl_videoStreamingCapabilityDidUpdate:systemCapability];
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhileStarting).to(equal(systemCapability.videoStreamingCapability));
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhenStreaming).to(beNil());
+ stateAfter = streamingLifecycleManager.videoStreamStateMachine.currentState;
+
+ expect(stateBefore).to(equal(SDLVideoStreamManagerStateStarting));
+ expect(stateAfter).to(equal(SDLVideoStreamManagerStateStarting));
+
+ // state ready
+ streamingLifecycleManager.testVideoCapabilityUpdatedWhileStarting = nil;
+ streamingLifecycleManager.testVideoCapabilityUpdatedWhenStreaming = nil;
+
+ [streamingLifecycleManager.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateReady];
+ stateBefore = streamingLifecycleManager.videoStreamStateMachine.currentState;
+ [streamingLifecycleManager sdl_videoStreamingCapabilityDidUpdate:systemCapability];
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhileStarting).to(beNil());
+ expect(streamingLifecycleManager.testVideoCapabilityUpdatedWhenStreaming).to(equal(systemCapability.videoStreamingCapability));
+ stateAfter = streamingLifecycleManager.videoStreamStateMachine.currentState;
+
+ expect(stateBefore).to(equal(SDLVideoStreamManagerStateReady));
+ expect(stateAfter).to(equal(SDLVideoStreamManagerStateReady));
+ });
+ });
+ });
+
+});
+
+describe(@"runtime tests", ^{
+ __block SDLStreamingVideoLifecycleManager *streamingLifecycleManager = nil;
+ SDLStreamingMediaConfiguration *testConfiguration = [SDLStreamingMediaConfiguration insecureConfiguration];
+ SDLCarWindowViewController *testViewController = [[SDLCarWindowViewController alloc] init];
+ SDLFakeStreamingManagerDataSource *testDataSource = [[SDLFakeStreamingManagerDataSource alloc] init];
+ NSString *testAppName = @"Test App";
+ SDLLifecycleConfiguration *testLifecycleConfiguration = [SDLLifecycleConfiguration defaultConfigurationWithAppName:testAppName fullAppId:@""];
+ SDLVersion *version600 = [SDLVersion versionWithMajor:6 minor:0 patch:0];
+
+ // set proper version up
+ [SDLGlobals sharedGlobals].rpcVersion = version600;
+ [SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = version600;
+
+ testConfiguration.customVideoEncoderSettings = @{(id)kVTCompressionPropertyKey_ExpectedFrameRate : @1};
+ testConfiguration.dataSource = testDataSource;
+ testConfiguration.rootViewController = testViewController;
+
+ // load connection manager with fake data
+ TestSmartConnectionManager *testConnectionManager = [[TestSmartConnectionManager alloc] init];
+ TestSmartConnection *connectionModel = [[TestSmartConnection alloc] init];
+ SDLGetSystemCapability *getRequest = [[SDLGetSystemCapability alloc] initWithType:SDLSystemCapabilityTypeVideoStreaming];
+ connectionModel.request = getRequest;
+ connectionModel.response = createSystemCapabilityResponse();
+ [testConnectionManager addConnectionModel:connectionModel];
+
+ testLifecycleConfiguration.appType = SDLAppHMITypeNavigation;
+
+ SDLConfiguration *testConfig = [[SDLConfiguration alloc] initWithLifecycle:testLifecycleConfiguration lockScreen:[SDLLockScreenConfiguration enabledConfiguration] logging:[SDLLogConfiguration debugConfiguration] streamingMedia:testConfiguration fileManager:[SDLFileManagerConfiguration defaultConfiguration] encryption:nil];
+
+ SDLSystemCapabilityManager *testSystemCapabilityManager = [[SDLSystemCapabilityManager alloc] initWithConnectionManager:testConnectionManager];
+
+ beforeEach(^{
+ streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfig systemCapabilityManager:testSystemCapabilityManager];
+ testConnectionManager.lastRequestBlock = ^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ SDLLogD(@"testConnectionManager.lastRequestBlock:\n\trequest:{%@};\n\tresponse:{%@}\n\terror:{%@};", request, response, error);
+ };
+ });
+
+ afterEach(^{
+ if (streamingLifecycleManager) {
+ // sdl_shutDown: unsubscribe from notifications, otherwise the zombie managers will still receive all notifications
+ [streamingLifecycleManager sdl_shutDown];
+ streamingLifecycleManager = nil;
+ }
+ });
+
describe(@"when started", ^{
__block BOOL readyHandlerSuccess = NO;
__block NSError *readyHandlerError = nil;
-
- __block SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
+ SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
beforeEach(^{
readyHandlerSuccess = NO;
@@ -139,7 +451,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should be ready to stream", ^{
- expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@NO));
+ expect(@(streamingLifecycleManager.isStreamingSupported)).to(equal(@YES));
expect(@(streamingLifecycleManager.isVideoConnected)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoEncrypted)).to(equal(@NO));
expect(@(streamingLifecycleManager.isVideoStreamingPaused)).to(equal(@YES));
@@ -151,7 +463,10 @@ describe(@"the streaming video manager", ^{
describe(@"after receiving a register app interface response", ^{
__block SDLRegisterAppInterfaceResponse *someRegisterAppInterfaceResponse = nil;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
__block SDLDisplayCapabilities *someDisplayCapabilities = nil;
+#pragma clang diagnostic pop
__block SDLScreenParams *someScreenParams = nil;
__block SDLImageResolution *someImageResolution = nil;
__block SDLHMICapabilities *someHMICapabilities = nil;
@@ -176,7 +491,11 @@ describe(@"the streaming video manager", ^{
someRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
someRegisterAppInterfaceResponse.hmiCapabilities = someHMICapabilities;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
someRegisterAppInterfaceResponse.vehicleType = testVehicleType;
+#pragma clang diagnostic pop
+ someRegisterAppInterfaceResponse.success = @YES;
SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
@@ -185,7 +504,6 @@ describe(@"the streaming video manager", ^{
it(@"should save the connected vehicle make but not the screen size", ^{
expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeZero))).toEventually(equal(@YES));
- expect(streamingLifecycleManager.connectedVehicleMake).toEventually(equal(testVehicleType.make));
});
});
@@ -194,7 +512,10 @@ describe(@"the streaming video manager", ^{
someHMICapabilities = [[SDLHMICapabilities alloc] init];
someHMICapabilities.videoStreaming = @YES;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
someDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic pop
someDisplayCapabilities.screenParams = someScreenParams;
someRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
@@ -203,9 +524,8 @@ describe(@"the streaming video manager", ^{
#pragma clang diagnostic ignored "-Wdeprecated"
someRegisterAppInterfaceResponse.displayCapabilities = someDisplayCapabilities;
#pragma clang diagnostic pop
- someRegisterAppInterfaceResponse.vehicleType = testVehicleType;
- someRegisterAppInterfaceResponse.vehicleType = testVehicleType;
+ someRegisterAppInterfaceResponse.success = @YES;
SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
@@ -214,7 +534,6 @@ describe(@"the streaming video manager", ^{
it(@"should save the connected vehicle make and the screen size", ^{
expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeMake(600, 100)))).toEventually(equal(@YES));
- expect(streamingLifecycleManager.connectedVehicleMake).toEventually(equal(testVehicleType.make));
});
});
});
@@ -386,6 +705,8 @@ describe(@"the streaming video manager", ^{
context(@"and both streams are closed", ^{
beforeEach(^{
[streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStopped fromOldState:nil callEnterTransition:NO];
+
+ postRAINotification();
});
context(@"and the hmi state is none", ^{
@@ -447,96 +768,19 @@ describe(@"the streaming video manager", ^{
});
describe(@"sending a video capabilities request", ^{
- __block SDLImageResolution *resolution = [[SDLImageResolution alloc] initWithWidth:42 height:69];
- __block int32_t maxBitrate = 12345;
- __block NSArray<SDLVideoStreamingFormat *> *testFormats = @[[[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH265 protocol:SDLVideoStreamingProtocolRTMP], [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP]];
- __block BOOL testHapticsSupported = YES;
-
beforeEach(^{
[streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:YES];
});
- it(@"should send out a video capabilities request", ^{
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLGetSystemCapability class]));
-
- SDLGetSystemCapability *getCapability = (SDLGetSystemCapability *)testConnectionManager.receivedRequests.lastObject;
- expect(getCapability.systemCapabilityType).to(equal(SDLSystemCapabilityTypeVideoStreaming));
- });
-
- describe(@"after sending GetSystemCapabilities", ^{
- context(@"and receiving an error response", ^{
- // This happens if the HU doesn't understand GetSystemCapabilities
- beforeEach(^{
- SDLGenericResponse *genericResponse = [[SDLGenericResponse alloc] init];
- genericResponse.resultCode = SDLResultInvalidData;
-
- [testConnectionManager respondToLastRequestWithResponse:genericResponse];
- });
-
- it(@"should have correct format and resolution", ^{
- expect(streamingLifecycleManager.preferredFormats).to(haveCount(1));
- expect(streamingLifecycleManager.preferredFormats.firstObject.codec).to(equal(SDLVideoStreamingCodecH264));
- expect(streamingLifecycleManager.preferredFormats.firstObject.protocol).to(equal(SDLVideoStreamingProtocolRAW));
-
- expect(streamingLifecycleManager.preferredResolutions).to(haveCount(1));
- expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionWidth).to(equal(0));
- expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionHeight).to(equal(0));
- });
-
- context(@"and receiving a response", ^{
- __block SDLVideoStreamingCapability *testVideoStreamingCapability = nil;
-
- beforeEach(^{
- SDLGetSystemCapabilityResponse *response = [[SDLGetSystemCapabilityResponse alloc] init];
- response.success = @YES;
- response.systemCapability = [[SDLSystemCapability alloc] init];
- response.systemCapability.systemCapabilityType = SDLSystemCapabilityTypeVideoStreaming;
-
- testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:maxBitrate supportedFormats:testFormats hapticDataSupported:testHapticsSupported diagonalScreenSize:8.5 pixelPerInch:117 scale:1.25];
- response.systemCapability.videoStreamingCapability = testVideoStreamingCapability;
- [testConnectionManager respondToLastRequestWithResponse:response];
- });
-
- it(@"should have correct data from the data source", ^{
- // Correct formats should be retrieved from the data source
- expect(streamingLifecycleManager.preferredResolutions).to(haveCount(1));
- expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionWidth).to(equal(resolution.resolutionWidth));
- expect(streamingLifecycleManager.preferredResolutions.firstObject.resolutionHeight).to(equal(resolution.resolutionHeight));
-
- expect(streamingLifecycleManager.preferredFormats).to(haveCount(streamingLifecycleManager.supportedFormats.count + 1));
- expect(streamingLifecycleManager.preferredFormats.firstObject.codec).to(equal(testDataSource.extraFormat.codec));
- expect(streamingLifecycleManager.preferredFormats.firstObject.protocol).to(equal(testDataSource.extraFormat.protocol));
-
- // The haptic manager should be enabled
- expect(streamingLifecycleManager.focusableItemManager.enableHapticDataRequests).to(equal(YES));
- });
-
- it(@"should have decided upon the correct preferred format and resolution", ^{
- SDLVideoStreamingFormat *preferredFormat = streamingLifecycleManager.preferredFormats[streamingLifecycleManager.preferredFormatIndex];
- expect(preferredFormat.codec).to(equal(SDLVideoStreamingCodecH264));
- expect(preferredFormat.protocol).to(equal(SDLVideoStreamingProtocolRTP));
-
- SDLImageResolution *preferredResolution = streamingLifecycleManager.preferredResolutions[streamingLifecycleManager.preferredResolutionIndex];
- expect(preferredResolution.resolutionHeight).to(equal(@69));
- expect(preferredResolution.resolutionWidth).to(equal(@42));
- });
-
- it(@"should set the correct scale value", ^{
- expect(streamingLifecycleManager.videoScaleManager.scale).to(equal(testVideoStreamingCapability.scale));
- });
- });
- });
- });
-
describe(@"after receiving a Video Start ACK", ^{
__block SDLProtocolHeader *testVideoHeader = nil;
__block SDLProtocolMessage *testVideoMessage = nil;
__block SDLControlFramePayloadVideoStartServiceAck *testVideoStartServicePayload = nil;
- __block int64_t testMTU = 789456;
- __block int32_t testVideoHeight = 42;
- __block int32_t testVideoWidth = 32;
- __block SDLVideoStreamingCodec testVideoCodec = SDLVideoStreamingCodecH264;
- __block SDLVideoStreamingProtocol testVideoProtocol = SDLVideoStreamingProtocolRTP;
+ const int64_t testMTU = 789456;
+ const int32_t testVideoHeight = 42;
+ const int32_t testVideoWidth = 32;
+ SDLVideoStreamingCodec testVideoCodec = SDLVideoStreamingCodecH264;
+ SDLVideoStreamingProtocol testVideoProtocol = SDLVideoStreamingProtocolRTP;
beforeEach(^{
[streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
@@ -550,6 +794,7 @@ describe(@"the streaming video manager", ^{
context(@"with data", ^{
beforeEach(^{
+ streamingLifecycleManager.videoScaleManager.scale = 1.0f;
testVideoStartServicePayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:testVideoHeight width:testVideoWidth protocol:testVideoProtocol codec:testVideoCodec];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartServicePayload.data];
[streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testVideoMessage];
@@ -560,11 +805,18 @@ describe(@"the streaming video manager", ^{
expect(streamingLifecycleManager.videoEncrypted).to(equal(YES));
expect(streamingLifecycleManager.videoFormat).to(equal([[SDLVideoStreamingFormat alloc] initWithCodec:testVideoCodec protocol:testVideoProtocol]));
expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+
+ const CGSize displayViewportResolution = streamingLifecycleManager.videoScaleManager.displayViewportResolution;
+ const CGSize testSize = CGSizeMake(testVideoWidth, testVideoHeight);
+ if (!CGSizeEqualToSize(displayViewportResolution, testSize)) {
+ failWithMessage(([NSString stringWithFormat:@"wrong displayViewportResolution: %@, expected: %@", NSStringFromCGSize(displayViewportResolution), NSStringFromCGSize(testSize)]));
+ }
});
});
context(@"with missing data", ^{
beforeEach(^{
+ streamingLifecycleManager.videoScaleManager.scale = 1.0f;
testVideoStartServicePayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:testVideoHeight width:testVideoWidth protocol:nil codec:nil];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartServicePayload.data];
[streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testVideoMessage];
@@ -579,6 +831,7 @@ describe(@"the streaming video manager", ^{
context(@"with missing screen height and screen width values", ^{
beforeEach(^{
+ postRAINotification();
streamingLifecycleManager.preferredResolutions = @[];
testVideoStartServicePayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:SDLControlFrameInt32NotFound width:SDLControlFrameInt32NotFound protocol:nil codec:nil];
@@ -639,11 +892,13 @@ describe(@"the streaming video manager", ^{
SDLVideoStreamingFormat *testVideoFormat2 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
testPreferredFormats = @[testVideoFormat, testVideoFormat2];
streamingLifecycleManager.preferredFormats = testPreferredFormats;
+ streamingLifecycleManager.preferredFormatIndex = 0;
SDLImageResolution *testImageResolution = [[SDLImageResolution alloc] initWithWidth:400 height:200];
SDLImageResolution *testImageResolution2 = [[SDLImageResolution alloc] initWithWidth:500 height:800];
testPreferredResolutions = @[testImageResolution, testImageResolution2];
streamingLifecycleManager.preferredResolutions = testPreferredResolutions;
+ streamingLifecycleManager.preferredResolutionIndex = 0;
testVideoStartNakPayload = [[SDLControlFramePayloadNak alloc] initWithRejectedParams:@[[NSString stringWithUTF8String:SDLControlFrameHeightKey], [NSString stringWithUTF8String:SDLControlFrameVideoCodecKey]] reason:@"failed"];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartNakPayload.data];
@@ -662,10 +917,12 @@ describe(@"the streaming video manager", ^{
SDLVideoStreamingFormat *testVideoFormat2 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
testPreferredFormats = @[testVideoFormat, testVideoFormat2];
streamingLifecycleManager.preferredFormats = testPreferredFormats;
+ streamingLifecycleManager.preferredFormatIndex = 0;
SDLImageResolution *testImageResolution = [[SDLImageResolution alloc] initWithWidth:400 height:200];
testPreferredResolutions = @[testImageResolution];
streamingLifecycleManager.preferredResolutions = testPreferredResolutions;
+ streamingLifecycleManager.preferredResolutionIndex = 0;
testVideoStartNakPayload = [[SDLControlFramePayloadNak alloc] initWithRejectedParams:@[[NSString stringWithUTF8String:SDLControlFrameVideoCodecKey]] reason:@"failed"];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartNakPayload.data];
@@ -715,19 +972,16 @@ describe(@"the streaming video manager", ^{
});
describe(@"after receiving a video end ACK", ^{
- __block SDLProtocolHeader *testVideoHeader = nil;
- __block SDLProtocolMessage *testVideoMessage = nil;
-
beforeEach(^{
[streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
- testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ SDLProtocolHeader *testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
testVideoHeader.frameData = SDLFrameInfoEndServiceACK;
testVideoHeader.encrypted = NO;
testVideoHeader.serviceType = SDLServiceTypeVideo;
- testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
+ SDLProtocolMessage *testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
[streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testVideoMessage];
});
@@ -737,23 +991,20 @@ describe(@"the streaming video manager", ^{
});
describe(@"after receiving a video end NAK", ^{
- __block SDLProtocolHeader *testVideoHeader = nil;
- __block SDLProtocolMessage *testVideoMessage = nil;
-
beforeEach(^{
[streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
- testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ SDLProtocolHeader *testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
testVideoHeader.frameData = SDLFrameInfoEndServiceNACK;
testVideoHeader.encrypted = NO;
testVideoHeader.serviceType = SDLServiceTypeVideo;
- testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
+ SDLProtocolMessage *testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
[streamingLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testVideoMessage];
});
- it(@"should have set all the right properties", ^{
+ it(@"expect video stream is stopped", ^{
expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
});
});
@@ -768,7 +1019,6 @@ describe(@"the streaming video manager", ^{
[streamingLifecycleManager endVideoServiceWithCompletionHandler:^ {
handlerCalled = YES;
}];
- streamingLifecycleManager.connectedVehicleMake = @"OEM_make_2";
});
context(@"when the manager is not stopped", ^{
@@ -780,7 +1030,6 @@ describe(@"the streaming video manager", ^{
it(@"should transition to the stopped state", ^{
expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
expect(streamingLifecycleManager.protocol).to(beNil());
- expect(streamingLifecycleManager.connectedVehicleMake).to(beNil());
expect(streamingLifecycleManager.hmiLevel).to(equal(SDLHMILevelNone));
expect(streamingLifecycleManager.videoStreamingState).to(equal(SDLVideoStreamingStateNotStreamable));
expect(streamingLifecycleManager.preferredFormatIndex).to(equal(0));
@@ -798,7 +1047,6 @@ describe(@"the streaming video manager", ^{
it(@"should stay in the stopped state", ^{
expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
expect(streamingLifecycleManager.protocol).to(beNil());
- expect(streamingLifecycleManager.connectedVehicleMake).to(beNil());
expect(streamingLifecycleManager.hmiLevel).to(equal(SDLHMILevelNone));
expect(streamingLifecycleManager.videoStreamingState).to(equal(SDLVideoStreamingStateNotStreamable));
expect(streamingLifecycleManager.preferredFormatIndex).to(equal(0));
@@ -809,7 +1057,7 @@ describe(@"the streaming video manager", ^{
});
describe(@"starting the manager", ^{
- __block SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
+ SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
beforeEach(^{
[streamingLifecycleManager startWithProtocol:protocolMock];
@@ -825,16 +1073,13 @@ describe(@"the streaming video manager", ^{
});
context(@"when the end video service ACKs", ^{
- __block SDLProtocolHeader *testVideoHeader = nil;
- __block SDLProtocolMessage *testVideoMessage = nil;
-
beforeEach(^{
- testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ SDLProtocolHeader *testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
testVideoHeader.frameData = SDLFrameInfoEndServiceACK;
testVideoHeader.encrypted = NO;
testVideoHeader.serviceType = SDLServiceTypeVideo;
- testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
+ SDLProtocolMessage *testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
[streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testVideoMessage];
});
@@ -845,16 +1090,13 @@ describe(@"the streaming video manager", ^{
});
context(@"when the end audio service NAKs", ^{
- __block SDLProtocolHeader *testVideoHeader = nil;
- __block SDLProtocolMessage *testVideoMessage = nil;
-
beforeEach(^{
- testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ SDLProtocolHeader *testVideoHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
testVideoHeader.frameType = SDLFrameTypeSingle;
testVideoHeader.frameData = SDLFrameInfoEndServiceNACK;
testVideoHeader.encrypted = NO;
testVideoHeader.serviceType = SDLServiceTypeVideo;
- testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
+ SDLProtocolMessage *testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
[streamingLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testVideoMessage];
});
@@ -867,12 +1109,545 @@ describe(@"the streaming video manager", ^{
});
describe(@"Creating a background video stream string", ^{
- __block NSString *expectedVideoStreamBackgroundString = [NSString stringWithFormat:@"When it is safe to do so, open %@ on your phone", testAppName];
+ NSString *expectedVideoStreamBackgroundString = [NSString stringWithFormat:@"When it is safe to do so, open %@ on your phone", testAppName];
it(@"Should return the correct video stream background string for the screen size", ^{
expect(streamingLifecycleManager.videoStreamBackgroundString).to(match(expectedVideoStreamBackgroundString));
});
});
+
+ describe(@"Getting notifications of VideoStreamingCapability updates", ^{
+ beforeEach(^{
+ streamingLifecycleManager.delegate = nil;
+ streamingLifecycleManager.dataSource = nil;
+ streamingLifecycleManager.customEncoderSettings = nil;
+ [streamingLifecycleManager.videoStreamStateMachine setToState:SDLVideoStreamManagerStateStarting fromOldState:nil callEnterTransition:NO];
+ });
+
+ context(@"the module does not support the GetSystemCapabilities request", ^{
+ __block SDLSystemCapability *testNilVideoStreamingCapability = nil;
+
+ beforeEach(^{
+ testNilVideoStreamingCapability = [[SDLSystemCapability alloc] init];
+ testNilVideoStreamingCapability.videoStreamingCapability = nil;
+
+ [streamingLifecycleManager sdl_videoStreamingCapabilityDidUpdate:testNilVideoStreamingCapability];
+ });
+
+ it(@"should use the library's default values", ^{
+ expect(streamingLifecycleManager.videoStreamingCapability.maxBitrate).to(beNil());
+ expect(streamingLifecycleManager.videoStreamingCapability.preferredFPS).to(beNil());
+
+ expect(streamingLifecycleManager.preferredFormats).to(haveCount(1));
+ expect(streamingLifecycleManager.preferredFormats[0].codec).to(equal(SDLVideoStreamingCodecH264));
+ expect(streamingLifecycleManager.preferredFormats[0].protocol).to(equal(SDLVideoStreamingProtocolRAW));
+
+ expect(streamingLifecycleManager.preferredResolutions).to(haveCount(1));
+ expect(streamingLifecycleManager.preferredResolutions[0].resolutionWidth).to(equal(streamingLifecycleManager.videoScaleManager.displayViewportResolution.width));
+ expect(streamingLifecycleManager.preferredResolutions[0].resolutionHeight).to(equal(streamingLifecycleManager.videoScaleManager.displayViewportResolution.height));
+
+
+ expect(streamingLifecycleManager.focusableItemManager.enableHapticDataRequests).to(beFalse());
+ expect(streamingLifecycleManager.videoScaleManager.scale).to(equal(streamingLifecycleManager.videoScaleManager.scale));
+ });
+ });
+
+ context(@"the module supports the GetSystemCapabilities request", ^{
+ __block SDLSystemCapability *testSystemCapability = nil;
+ __block SDLVideoStreamingCapability *testVideoStreamingCapability = nil;
+
+ context(@"the module does not support VideoStreamingCapability.additionalVideoStreamingCapabilities", ^{
+ beforeEach(^{
+ SDLImageResolution *resolution = [[SDLImageResolution alloc] initWithWidth:44 height:99];
+ SDLVideoStreamingFormat *format1 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH265 protocol:SDLVideoStreamingProtocolRTMP];
+ SDLVideoStreamingFormat *format2 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
+ NSArray<SDLVideoStreamingFormat *> *testFormats = @[format1, format2];
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:@(333) supportedFormats:testFormats hapticSpatialDataSupported:@YES diagonalScreenSize:@(8.5) pixelPerInch:@(117) scale:@(1) preferredFPS:@(222)];
+
+ testSystemCapability = [[SDLSystemCapability alloc] init];
+ testSystemCapability.videoStreamingCapability = testVideoStreamingCapability;
+
+ [streamingLifecycleManager sdl_videoStreamingCapabilityDidUpdate:testSystemCapability];
+ });
+
+ it(@"should use the data from the VideoStreamingCapability", ^{
+ expect(streamingLifecycleManager.videoStreamingCapability.maxBitrate).to(equal(testVideoStreamingCapability.maxBitrate));
+ expect(streamingLifecycleManager.videoStreamingCapability.preferredFPS).to(equal(testVideoStreamingCapability.preferredFPS));
+
+ expect(streamingLifecycleManager.preferredResolutions).to(haveCount(1));
+ expect(streamingLifecycleManager.preferredResolutions[0].resolutionWidth).to(equal(testVideoStreamingCapability.preferredResolution.resolutionWidth));
+ expect(streamingLifecycleManager.preferredResolutions[0].resolutionHeight).to(equal(testVideoStreamingCapability.preferredResolution.resolutionHeight));
+
+ expect(streamingLifecycleManager.preferredFormats).to(haveCount(2));
+ expect(streamingLifecycleManager.preferredFormats[0].codec).to(equal(testVideoStreamingCapability.supportedFormats[0].codec));
+ expect(streamingLifecycleManager.preferredFormats[0].protocol).to(equal(testVideoStreamingCapability.supportedFormats[0].protocol));
+ expect(streamingLifecycleManager.preferredFormats[1].codec).to(equal(testVideoStreamingCapability.supportedFormats[1].codec));
+ expect(streamingLifecycleManager.preferredFormats[1].protocol).to(equal(testVideoStreamingCapability.supportedFormats[1].protocol));
+
+ expect(streamingLifecycleManager.focusableItemManager.enableHapticDataRequests).to(equal(YES));
+ expect(streamingLifecycleManager.videoScaleManager.scale).to(equal(testVideoStreamingCapability.scale));
+ });
+ });
+
+ context(@"the module supports VideoStreamingCapability.additionalVideoStreamingCapabilities", ^{
+ __block SDLVideoStreamingCapability *testAdditionalVideoStreamingCapability = nil;
+
+ beforeEach(^{
+ SDLImageResolution *resolution = [[SDLImageResolution alloc] initWithWidth:44 height:99];
+ SDLVideoStreamingFormat *format1 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH265 protocol:SDLVideoStreamingProtocolRTMP];
+ SDLVideoStreamingFormat *format2 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
+ NSArray<SDLVideoStreamingFormat *> *testFormats = @[format1, format2];
+
+ testAdditionalVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testAdditionalVideoStreamingCapability.preferredResolution = [[SDLImageResolution alloc] initWithWidth:500 height:100];
+ testAdditionalVideoStreamingCapability.hapticSpatialDataSupported = @YES;
+ testAdditionalVideoStreamingCapability.diagonalScreenSize = @8;
+ testAdditionalVideoStreamingCapability.scale = @1;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:@(333) supportedFormats:testFormats hapticSpatialDataSupported:@YES diagonalScreenSize:@(8.5) pixelPerInch:@(117) scale:@(1) preferredFPS:@(222)];
+ testVideoStreamingCapability.additionalVideoStreamingCapabilities = @[testAdditionalVideoStreamingCapability];
+
+ testSystemCapability = [[SDLSystemCapability alloc] init];
+ testSystemCapability.videoStreamingCapability = testVideoStreamingCapability;
+
+ [streamingLifecycleManager sdl_videoStreamingCapabilityDidUpdate:testSystemCapability];
+ });
+
+ it(@"should use the data from the VideoStreamingCapability and additionalVideoStreamingCapabilities", ^{
+ expect(streamingLifecycleManager.videoStreamingCapability.maxBitrate).to(equal(testVideoStreamingCapability.maxBitrate));
+ expect(streamingLifecycleManager.videoStreamingCapability.preferredFPS).to(equal(testVideoStreamingCapability.preferredFPS));
+
+ expect(streamingLifecycleManager.preferredResolutions).to(haveCount(2));
+ expect(streamingLifecycleManager.preferredResolutions[0].resolutionWidth).to(equal(testVideoStreamingCapability.preferredResolution.resolutionWidth));
+ expect(streamingLifecycleManager.preferredResolutions[0].resolutionHeight).to(equal(testVideoStreamingCapability.preferredResolution.resolutionHeight));
+ expect(streamingLifecycleManager.preferredResolutions[1].resolutionWidth).to(equal(testVideoStreamingCapability.additionalVideoStreamingCapabilities[0].preferredResolution.resolutionWidth));
+ expect(streamingLifecycleManager.preferredResolutions[1].resolutionHeight).to(equal(testVideoStreamingCapability.additionalVideoStreamingCapabilities[0].preferredResolution.resolutionHeight));
+
+ expect(streamingLifecycleManager.preferredFormats).to(haveCount(2));
+ expect(streamingLifecycleManager.preferredFormats[0].codec).to(equal(testVideoStreamingCapability.supportedFormats[0].codec));
+ expect(streamingLifecycleManager.preferredFormats[0].protocol).to(equal(testVideoStreamingCapability.supportedFormats[0].protocol));
+ expect(streamingLifecycleManager.preferredFormats[1].codec).to(equal(testVideoStreamingCapability.supportedFormats[1].codec));
+ expect(streamingLifecycleManager.preferredFormats[1].protocol).to(equal(testVideoStreamingCapability.supportedFormats[1].protocol));
+
+ expect(streamingLifecycleManager.focusableItemManager.enableHapticDataRequests).to(equal(YES));
+ expect(streamingLifecycleManager.videoScaleManager.scale).to(equal(testVideoStreamingCapability.scale));
+ });
+ });
+ });
+ });
+
+ describe(@"setting the video encoder properties", ^{
+ __block SDLVideoStreamingCapability *testVideoStreamingCapability = nil;
+
+ beforeEach(^{
+ testVideoStreamingCapability = nil;
+ });
+
+ describe(@"setting the bitrate", ^{
+ context(@"the VideoStreamingCapability returns a maxBitrate", ^{
+ it(@"should use the custom averageBitRate set by the developer when it is less than the VideoStreamingCapability's maxBitrate", ^{
+ int testVideoStreamingCapabilityMaxBitrate = 99999;
+ float testCustomBitRate = 88;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.maxBitrate = @(testVideoStreamingCapabilityMaxBitrate);
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(111), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(testCustomBitRate)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate]).to(equal(@(testCustomBitRate)));
+ });
+
+ it(@"should use the the module's VideoStreamingCapability's maxBitrate if it is less than the averageBitRate set by the developer ", ^{
+ int testVideoStreamingCapabilityMaxBitrate = 88;
+ int testCustomBitRate = 99999;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.maxBitrate = @(testVideoStreamingCapabilityMaxBitrate);
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(111), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(testCustomBitRate)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ int expectedCustomBitRate = testVideoStreamingCapabilityMaxBitrate * 1000; //convert from video streaming capability bitrate unit of kbps to video encoder units of bps
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate]).to(equal(@(expectedCustomBitRate)));
+ });
+
+ it(@"should use the the module's VideoStreamingCapability's maxBitrate if no averageBitRate was set by the developer ", ^{
+ int testVideoStreamingCapabilityMaxBitrate = 7889;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.maxBitrate = @(testVideoStreamingCapabilityMaxBitrate);
+
+ streamingLifecycleManager.customEncoderSettings = nil;
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ int expectedCustomBitRate = testVideoStreamingCapabilityMaxBitrate * 1000; //convert from video streaming capability bitrate unit of kbps to video encoder units of bps
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate]).to(equal(@(expectedCustomBitRate)));
+ });
+ });
+
+ context(@"the VideoStreamingCapability returns a nil maxBitrate", ^{
+ it(@"should use the custom averageBitRate set by the developer even if it is larger than the default averageBitRate", ^{
+ int testCustomBitRate = 9900000; // larger than the default of @600000
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.maxBitrate = nil;
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(111), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(testCustomBitRate)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate]).to(equal(@(testCustomBitRate)));
+ });
+
+ it(@"should use the custom averageBitRate set by the developer even if it is smaller than the default averageBitRate", ^{
+ int testCustomBitRate = 2; // less than the default of @600000
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.maxBitrate = nil;
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(111), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(testCustomBitRate)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate]).to(equal(@(testCustomBitRate)));
+ });
+
+ it(@"should use the default averageBitRate if a custom averageBitRate was not set by the developer", ^{
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.maxBitrate = nil;
+
+ streamingLifecycleManager.customEncoderSettings = nil;
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate]).to(equal(@(600000)));
+ });
+ });
+ });
+
+ describe(@"setting the framerate", ^{
+ context(@"the VideoStreamingCapability returns a preferredFPS", ^{
+ it(@"should use the custom expectedFrameRate set by the developer when it is less than the VideoStreamingCapability's preferredFPS", ^{
+ int testVideoStreamingCapabilityPreferredFPS = 1001;
+ float testCustomExpectedFrameRate = 66;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.preferredFPS = @(testVideoStreamingCapabilityPreferredFPS);
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(testCustomExpectedFrameRate), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(22)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).to(equal(@(testCustomExpectedFrameRate)));
+ });
+
+ it(@"should use the the module's VideoStreamingCapability's preferredFPS if it is less than the expectedFrameRate set by the developer ", ^{
+ int testVideoStreamingCapabilityPreferredFPS = 66;
+ int testCustomExpectedFrameRate = 1001;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.preferredFPS = @(testVideoStreamingCapabilityPreferredFPS);
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(testCustomExpectedFrameRate), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(22)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).to(equal(@(testVideoStreamingCapabilityPreferredFPS)));
+ });
+
+ it(@"should use the the module's VideoStreamingCapability's preferredFPS if no expectedFrameRate was set by the developer ", ^{
+ int testVideoStreamingCapabilityPreferredFPS = 66;
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.preferredFPS = @(testVideoStreamingCapabilityPreferredFPS);
+
+ streamingLifecycleManager.customEncoderSettings = nil;
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).to(equal(@(testVideoStreamingCapabilityPreferredFPS)));
+ });
+ });
+
+ context(@"the VideoStreamingCapability returns a nil preferredFPS", ^{
+ it(@"should use the custom expectedFrameRate set by the developer even if it is larger than the default expectedFrameRate", ^{
+ int testCustomExpectedFrameRate = 990; // larger than the default of @15
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.preferredFPS = nil;
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(testCustomExpectedFrameRate), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(22)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).to(equal(@(testCustomExpectedFrameRate)));
+ });
+
+ it(@"should use the custom expectedFrameRate set by the developer even if it is smaller than the default expectedFrameRate", ^{
+ int testCustomExpectedFrameRate = 2; // less than the default of @15
+
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.preferredFPS = nil;
+
+ streamingLifecycleManager.customEncoderSettings = @{(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate:@(testCustomExpectedFrameRate), (__bridge NSString *)kVTCompressionPropertyKey_AverageBitRate:@(22)};
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).to(equal(@(testCustomExpectedFrameRate)));
+ });
+
+ it(@"should use the default expectedFrameRate if a custom expectedFrameRate was not set by the developer", ^{
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ testVideoStreamingCapability.preferredFPS = nil;
+
+ streamingLifecycleManager.customEncoderSettings = nil;
+
+ [streamingLifecycleManager sdl_applyVideoCapability:testVideoStreamingCapability];
+
+ expect(streamingLifecycleManager.videoEncoderSettings[(__bridge NSString *)kVTCompressionPropertyKey_ExpectedFrameRate]).to(equal(@(15)));
+ });
+ });
+ });
+ });
});
QuickSpecEnd
+
+#pragma mark - test Capabilities Filtering Logic
+
+QuickSpecBegin(SDLStreamingVideoLifecycleManagerSpec_CapabilitiesFiltering)
+// declare and init constants that do not change during test lifecycle
+SDLImageResolution *resolution1 = [[SDLImageResolution alloc] initWithWidth:800 height:380];
+SDLImageResolution *resolution2 = [[SDLImageResolution alloc] initWithWidth:320 height:200];
+SDLImageResolution *resolution3 = [[SDLImageResolution alloc] initWithWidth:480 height:320];
+SDLImageResolution *resolution4 = [[SDLImageResolution alloc] initWithWidth:400 height:380];
+SDLImageResolution *resolution5 = [[SDLImageResolution alloc] initWithWidth:800 height:240];
+SDLImageResolution *resolution6 = [[SDLImageResolution alloc] initWithWidth:200 height:400]; // portrait small
+SDLImageResolution *resolution7 = [[SDLImageResolution alloc] initWithWidth:2000 height:4000]; // portrait large
+SDLImageResolution *resolution8 = [[SDLImageResolution alloc] initWithWidth:200 height:200];
+
+SDLVideoStreamingCapability *capability1 = [[SDLVideoStreamingCapability alloc] init];
+capability1.preferredResolution = resolution1;
+capability1.hapticSpatialDataSupported = @YES;
+capability1.diagonalScreenSize = @8;
+capability1.scale = @1;
+
+SDLVideoStreamingCapability *capability2 = [[SDLVideoStreamingCapability alloc] init];
+capability2.preferredResolution = resolution2;
+capability2.hapticSpatialDataSupported = @NO;
+capability2.diagonalScreenSize = @3;
+
+SDLVideoStreamingCapability *capability3 = [[SDLVideoStreamingCapability alloc] init];
+capability3.preferredResolution = resolution3;
+capability3.hapticSpatialDataSupported = @YES;
+capability3.diagonalScreenSize = @5;
+
+SDLVideoStreamingCapability *capability4 = [[SDLVideoStreamingCapability alloc] init];
+capability4.preferredResolution = resolution4;
+capability4.hapticSpatialDataSupported = @YES;
+capability4.diagonalScreenSize = @4;
+
+SDLVideoStreamingCapability *capability5 = [[SDLVideoStreamingCapability alloc] init];
+capability5.preferredResolution = resolution5;
+capability5.hapticSpatialDataSupported = @YES;
+capability5.diagonalScreenSize = @4;
+
+SDLVideoStreamingCapability *capability6 = [[SDLVideoStreamingCapability alloc] init];
+capability6.preferredResolution = resolution1;
+capability6.hapticSpatialDataSupported = @YES;
+capability6.diagonalScreenSize = @5;
+capability6.scale = @1.5;
+
+SDLVideoStreamingCapability *capability7 = [[SDLVideoStreamingCapability alloc] init];
+capability7.preferredResolution = resolution1;
+capability7.hapticSpatialDataSupported = @YES;
+capability7.diagonalScreenSize = @4;
+capability7.scale = @2;
+
+SDLVideoStreamingCapability *capability8 = [[SDLVideoStreamingCapability alloc] init]; // portrait small
+capability8.preferredResolution = resolution6;
+capability8.hapticSpatialDataSupported = @YES;
+capability8.diagonalScreenSize = @4;
+
+SDLVideoStreamingCapability *capability9 = [[SDLVideoStreamingCapability alloc] init]; // portrait large
+capability9.preferredResolution = resolution7;
+capability9.hapticSpatialDataSupported = @YES;
+capability9.diagonalScreenSize = @4;
+
+SDLVideoStreamingCapability *capability10 = [[SDLVideoStreamingCapability alloc] init]; // square
+capability10.preferredResolution = resolution8;
+capability10.hapticSpatialDataSupported = @YES;
+capability10.diagonalScreenSize = @2;
+capability10.scale = @1;
+
+SDLVideoStreamingFormat *vsFormat1 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRAW];
+SDLVideoStreamingFormat *vsFormat2 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
+SDLVideoStreamingFormat *vsFormat3 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecTheora protocol:SDLVideoStreamingProtocolRTSP];
+SDLVideoStreamingFormat *vsFormat4 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecVP8 protocol:SDLVideoStreamingProtocolRTMP];
+SDLVideoStreamingFormat *vsFormat5 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecVP9 protocol:SDLVideoStreamingProtocolWebM];
+
+SDLVideoStreamingCapability *capability0 = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution1 maxBitrate:@(400000) supportedFormats:@[vsFormat1, vsFormat2, vsFormat3, vsFormat4, vsFormat5] hapticSpatialDataSupported:@YES diagonalScreenSize:@(8) pixelPerInch:@(96) scale:@(1) preferredFPS:nil];
+capability0.additionalVideoStreamingCapabilities = @[capability1, capability2, capability3, capability4, capability5, capability6, capability7, capability8, capability9, capability10];
+
+describe(@"supported video capabilities and formats", ^{
+ TestSmartConnectionManager *testConnectionManager = [[TestSmartConnectionManager alloc] init];
+ SDLConfiguration *testConfig = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfig systemCapabilityManager:nil];
+
+ context(@"neither landscape nor portrait constraint set", ^{
+ NSArray <SDLVideoStreamingCapability*>* allCapabilities = [capability0 allVideoStreamingCapabilities];
+
+ it(@"should let all capabilities in (nothing filtered out)", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = nil;
+ streamingLifecycleManager.supportedPortraitStreamingRange = nil;
+ NSArray *filteredCapabilities = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(filteredCapabilities).to(equal(allCapabilities));
+ });
+ });
+
+ context(@"landscape restricted and any portrait", ^{
+ SDLImageResolution *resMin = [[SDLImageResolution alloc] initWithWidth:320 height:200];
+ SDLImageResolution *resMax = [[SDLImageResolution alloc] initWithWidth:350 height:220];
+ SDLVideoStreamingRange *landRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:resMin maximumResolution:resMax];
+
+ it(@"should filter 320x200 and small and large portrait", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = landRange;
+ streamingLifecycleManager.supportedPortraitStreamingRange = nil;
+
+ expect(streamingLifecycleManager.supportedLandscapeStreamingRange).to(equal(landRange));
+ expect(streamingLifecycleManager.supportedPortraitStreamingRange).to(beNil());
+ // 320x200 & portrait small & large & square are expected
+ NSArray *expectedArray = @[capability2, capability8, capability9, capability10];
+ NSArray *matchArray = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(matchArray).to(equal(expectedArray));
+ });
+ });
+
+ context(@"portrait restricted and wrong landscape", ^{
+ SDLImageResolution *resMinP = [[SDLImageResolution alloc] initWithWidth:200 height:320];
+ SDLImageResolution *resMaxP = [[SDLImageResolution alloc] initWithWidth:300 height:420];
+ SDLVideoStreamingRange *portRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:resMinP maximumResolution:resMaxP];
+
+ // wrong range: max < min, nothing will pass in landscape
+ SDLImageResolution *resMaxL = [[SDLImageResolution alloc] initWithWidth:320 height:200];
+ SDLImageResolution *resMinL = [[SDLImageResolution alloc] initWithWidth:350 height:220];
+ SDLVideoStreamingRange *landRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:resMinL maximumResolution:resMaxL];
+
+ it(@"should filter portrait small", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = landRange;
+ streamingLifecycleManager.supportedPortraitStreamingRange = portRange;
+
+ expect(streamingLifecycleManager.supportedLandscapeStreamingRange).to(equal(landRange));
+ expect(streamingLifecycleManager.supportedPortraitStreamingRange).to(equal(portRange));
+ NSArray *expectedArray = @[capability8];
+ NSArray *matchArray = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(matchArray).to(equal(expectedArray));
+ });
+ });
+
+ context(@"both landscape and portrait restricted", ^{
+ SDLImageResolution *resMinP = [[SDLImageResolution alloc] initWithWidth:200 height:320];
+ SDLImageResolution *resMaxP = [[SDLImageResolution alloc] initWithWidth:300 height:420];
+ SDLVideoStreamingRange *portRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:resMinP maximumResolution:resMaxP];
+
+ SDLImageResolution *resMinL = [[SDLImageResolution alloc] initWithWidth:320 height:200];
+ SDLImageResolution *resMaxL = [[SDLImageResolution alloc] initWithWidth:350 height:220];
+ SDLVideoStreamingRange *landRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:resMinL maximumResolution:resMaxL];
+
+ it(@"should filter 320x200 and portrait small", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = landRange;
+ streamingLifecycleManager.supportedPortraitStreamingRange = portRange;
+
+ expect(streamingLifecycleManager.supportedLandscapeStreamingRange).to(equal(landRange));
+ expect(streamingLifecycleManager.supportedPortraitStreamingRange).to(equal(portRange));
+ NSArray *expectedArray = @[capability2, capability8];
+ NSArray *matchArray = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(matchArray).to(equal(expectedArray));
+ });
+ });
+
+ context(@"square", ^{
+ SDLImageResolution *resMin = [[SDLImageResolution alloc] initWithWidth:100 height:100];
+ SDLImageResolution *resMax = [[SDLImageResolution alloc] initWithWidth:200 height:200];
+ SDLVideoStreamingRange *range = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:resMin maximumResolution:resMax];
+ range.minimumAspectRatio = 1.0;
+ range.maximumAspectRatio = 1.0;
+ range.minimumDiagonal = 1;
+
+ it(@"expect all portraits and square", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = range;
+ streamingLifecycleManager.supportedPortraitStreamingRange = nil;
+
+ expect(streamingLifecycleManager.supportedLandscapeStreamingRange).to(equal(range));
+ expect(streamingLifecycleManager.supportedPortraitStreamingRange).to(beNil());
+
+ // no portrait restriction therefore all portrait & square
+ NSArray *expectedArray = @[capability8, capability9, capability10];
+ NSArray *matchArray = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(matchArray).to(equal(expectedArray));
+ });
+
+ it(@"expect all landscapes and square", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = nil;
+ streamingLifecycleManager.supportedPortraitStreamingRange = range;
+
+ expect(streamingLifecycleManager.supportedLandscapeStreamingRange).to(beNil());
+ expect(streamingLifecycleManager.supportedPortraitStreamingRange).to(equal(range));
+
+ NSArray *expectedArray = @[capability0, capability1, capability2, capability3, capability4, capability5, capability6, capability7, capability10];
+ NSArray *matchArray = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(matchArray).to(equal(expectedArray));
+ });
+
+ it(@"expect square alone", ^{
+ streamingLifecycleManager.supportedLandscapeStreamingRange = range;
+ streamingLifecycleManager.supportedPortraitStreamingRange = range;
+
+ expect(streamingLifecycleManager.supportedLandscapeStreamingRange).to(equal(range));
+ expect(streamingLifecycleManager.supportedPortraitStreamingRange).to(equal(range));
+
+ NSArray *expectedArray = @[capability10];
+ NSArray *matchArray = [streamingLifecycleManager matchVideoCapability:capability0];
+ expect(matchArray).to(equal(expectedArray));
+ });
+ });
+});
+
+QuickSpecEnd
+
+#pragma mark - helper functions
+
+static void postRAINotification() {
+ SDLRegisterAppInterfaceResponse *rai = [[SDLRegisterAppInterfaceResponse alloc] init];
+ rai.hmiCapabilities = [[SDLHMICapabilities alloc] initWithNavigation:@YES phoneCall:@YES videoStreaming:@YES remoteControl:@YES appServices:@YES displays:@YES seatLocation:@YES driverDistraction:@YES];
+ rai.success = @YES;
+ SDLRPCResponseNotification *note = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:nil rpcResponse:rai];
+ [[NSNotificationCenter defaultCenter] postNotification:note];
+}
+
+static void sendNotificationForHMILevel(SDLHMILevel hmiLevel, SDLVideoStreamingState streamState) {
+ SDLOnHMIStatus *hmiStatus = [[SDLOnHMIStatus alloc] init];
+ hmiStatus.hmiLevel = hmiLevel;
+ hmiStatus.videoStreamingState = streamState;
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:hmiStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+};
+
+static SDLGetSystemCapabilityResponse* createSystemCapabilityResponse() {
+ SDLImageResolution *resolution = [[SDLImageResolution alloc] initWithWidth:testVSCResolutionWidth height:testVSCResolutionHeight];
+ SDLVideoStreamingFormat *format1 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH265 protocol:SDLVideoStreamingProtocolRTMP];
+ SDLVideoStreamingFormat *format2 = [[SDLVideoStreamingFormat alloc] initWithCodec:SDLVideoStreamingCodecH264 protocol:SDLVideoStreamingProtocolRTP];
+ NSArray<SDLVideoStreamingFormat *> *testFormats = @[format1, format2];
+
+ SDLVideoStreamingCapability *videoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:@(testVSCMaxBitrate) supportedFormats:testFormats hapticSpatialDataSupported:@YES diagonalScreenSize:@(8.5) pixelPerInch:@(117) scale:@(testVSCScale) preferredFPS:nil];
+ SDLGetSystemCapabilityResponse *response = [[SDLGetSystemCapabilityResponse alloc] init];
+ response.success = @YES;
+ response.systemCapability = [[SDLSystemCapability alloc] initWithVideoStreamingCapability:videoStreamingCapability];
+
+ return response;
+}
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSystemInfoSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSystemInfoSpec.m
new file mode 100644
index 000000000..a1be29973
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSystemInfoSpec.m
@@ -0,0 +1,83 @@
+//
+// SDLSystemInfoSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 2/24/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLSystemInfo.h"
+#import "SDLVehicleType.h"
+
+QuickSpecBegin(SDLSystemInfoSpec)
+
+NSString *hardVersion = @"1.2.3";
+NSString *softVersion = @"9.8.7";
+NSString *make = @"Make";
+NSString *model = @"model";
+NSString *trim = @"trim";
+NSString *modelYear = @"2021";
+SDLVehicleType *vehicleType = [[SDLVehicleType alloc] initWithMake:make model:model modelYear:modelYear trim:trim];
+
+describe(@"system info", ^{
+ __block SDLSystemInfo *systemInfo = nil;
+
+ context(@"init", ^{
+ beforeEach(^{
+ systemInfo = [[SDLSystemInfo alloc] init];
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(systemInfo).notTo(beNil());
+ expect(systemInfo.vehicleType).to(beNil());
+ expect(systemInfo.systemSoftwareVersion).to(beNil());
+ expect(systemInfo.systemHardwareVersion).to(beNil());
+ });
+ });
+
+ context(@"initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:", ^{
+ beforeEach(^{
+ systemInfo = [[SDLSystemInfo alloc] initWithMake:make model:model trim:trim modelYear:modelYear softwareVersion:softVersion hardwareVersion:hardVersion];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(systemInfo).notTo(beNil());
+ expect(systemInfo.vehicleType.make).to(equal(make));
+ expect(systemInfo.vehicleType.model).to(equal(model));
+ expect(systemInfo.vehicleType.trim).to(equal(trim));
+ expect(systemInfo.vehicleType.modelYear).to(equal(modelYear));
+ expect(systemInfo.systemSoftwareVersion).to(equal(softVersion));
+ expect(systemInfo.systemHardwareVersion).to(equal(hardVersion));
+ });
+ });
+
+ context(@"initWithVehicleType:systemSoftwareVersion:systemHardwareVersion:", ^{
+ beforeEach(^{
+ systemInfo = [[SDLSystemInfo alloc] initWithVehicleType:vehicleType softwareVersion:softVersion hardwareVersion:hardVersion];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(systemInfo).notTo(beNil());
+ expect(systemInfo.vehicleType).to(equal(vehicleType));
+ expect(systemInfo.systemSoftwareVersion).to(equal(softVersion));
+ expect(systemInfo.systemHardwareVersion).to(equal(hardVersion));
+ });
+ });
+
+ context(@"alloc and init", ^{
+ beforeEach(^{
+ systemInfo = [SDLSystemInfo alloc];
+ });
+
+ it(@"expect test object to be inited", ^{
+ expect(systemInfo.vehicleType).to(beNil());
+ expect(systemInfo.systemHardwareVersion).to(beNil());
+ expect(systemInfo.systemSoftwareVersion).to(beNil());
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
index 41ff4ba56..ea230248c 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
@@ -42,7 +42,7 @@
@property (assign, nonatomic) BOOL isDirty;
-- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability;
+- (void)sdl_displayCapabilityDidUpdate;
@end
@@ -489,11 +489,11 @@ describe(@"text and graphic manager", ^{
beforeEach(^{
testHMIStatus = [[SDLOnHMIStatus alloc] init];
- testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil];
+ testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
testDisplayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"Test display" windowCapabilities:@[testWindowCapability] windowTypeSupported:nil];
- testSystemCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:@[testDisplayCapability]];
- [testManager sdl_displayCapabilityDidUpdate:testSystemCapability];
+ OCMStub([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
});
// with a non-default window
@@ -554,13 +554,14 @@ describe(@"text and graphic manager", ^{
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testHMIStatus];
[[NSNotificationCenter defaultCenter] postNotification:notification];
- testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil];
+ testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
testDisplayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"Test display" windowCapabilities:@[testWindowCapability] windowTypeSupported:nil];
testSystemCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:@[testDisplayCapability]];
});
it(@"should start the transaction queue and not send a transaction", ^{
- [testManager sdl_displayCapabilityDidUpdate:testSystemCapability];
+ OCMStub([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
expect(testManager.transactionQueue.isSuspended).to(beFalse());
expect(testManager.transactionQueue.operationCount).to(equal(0));
@@ -569,7 +570,8 @@ describe(@"text and graphic manager", ^{
context(@"if there's data", ^{
beforeEach(^{
testManager.textField1 = @"test";
- [testManager sdl_displayCapabilityDidUpdate:testSystemCapability];
+ OCMStub([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testManager sdl_displayCapabilityDidUpdate];
});
it(@"should send an update and not supersede the previous update", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m
index 77760bb07..b03252c25 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m
@@ -820,18 +820,37 @@ describe(@"the text and graphic operation", ^{
updatedState.textField1 = field1String;
updatedState.primaryGraphic = testArtwork;
updatedState.secondaryGraphic = testArtwork2;
+ });
+ it(@"should send a show and not upload any artworks", ^{
testOp = [[SDLTextAndGraphicUpdateOperation alloc] initWithConnectionManager:testConnectionManager fileManager:mockFileManager currentCapabilities:windowCapability currentScreenData:emptyCurrentData newState:updatedState currentScreenDataUpdatedHandler:^(SDLTextAndGraphicState * _Nullable newScreenData, NSError * _Nullable error) {} updateCompletionHandler:nil];
[testOp start];
- });
- it(@"should send a show and not upload any artworks", ^{
expect(testConnectionManager.receivedRequests).to(haveCount(1));
SDLShow *firstSentRequest = testConnectionManager.receivedRequests[0];
expect(firstSentRequest.mainField1).to(equal(field1String));
expect(firstSentRequest.mainField2).to(beEmpty());
expect(firstSentRequest.graphic).toNot(beNil());
expect(firstSentRequest.secondaryGraphic).to(beNil());
+ OCMReject([mockFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+ });
+
+ it(@"should properly overwrite artwork", ^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
+ SDLArtwork *testArtwork3 = [[SDLArtwork alloc] initWithData:[@"Test data 3" dataUsingEncoding:NSUTF8StringEncoding] name:testArtworkName fileExtension:@"png" persistent:NO];
+ testArtwork3.overwrite = YES;
+
+ SDLTextAndGraphicState *updatedState2 = [[SDLTextAndGraphicState alloc] init];
+ updatedState2.textField1 = field1String;
+ updatedState2.primaryGraphic = testArtwork3;
+ updatedState2.secondaryGraphic = testArtwork2;
+
+ SDLTextAndGraphicUpdateOperation *testOp2 = [[SDLTextAndGraphicUpdateOperation alloc] initWithConnectionManager:testConnectionManager fileManager:mockFileManager currentCapabilities:windowCapability currentScreenData:updatedState newState:updatedState2 currentScreenDataUpdatedHandler:^(SDLTextAndGraphicState * _Nullable newScreenData, NSError * _Nullable error) {} updateCompletionHandler:nil];
+ [testOp2 start];
+
+ [testConnectionManager respondToLastRequestWithResponse:successShowResponse];
+
+ OCMVerify([mockFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
});
});
@@ -868,6 +887,7 @@ describe(@"the text and graphic operation", ^{
// when there is text to update as well
context(@"when there is text to update as well", ^{
beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
updatedState = [[SDLTextAndGraphicState alloc] init];
updatedState.textField1 = field1String;
updatedState.primaryGraphic = testArtwork;
@@ -943,6 +963,7 @@ describe(@"the text and graphic operation", ^{
// when there is no text to update
context(@"when there is no text to update", ^{
beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
updatedState = [[SDLTextAndGraphicState alloc] init];
updatedState.primaryGraphic = testArtwork;
@@ -972,6 +993,7 @@ describe(@"the text and graphic operation", ^{
// when the image is a static icon
context(@"when the image is a static icon", ^{
beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(NO);
updatedState = [[SDLTextAndGraphicState alloc] init];
updatedState.primaryGraphic = testStaticIcon;
@@ -998,6 +1020,7 @@ describe(@"the text and graphic operation", ^{
context(@"if the images for the primary and secondary graphics fail the upload process", ^{
beforeEach(^{
OCMStub([mockFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
NSArray<NSString *> *testSuccessfulArtworks = @[];
NSError *testError = [NSError errorWithDomain:@"errorDomain"
code:9
@@ -1030,6 +1053,7 @@ describe(@"the text and graphic operation", ^{
NSArray<NSString *> *testSuccessfulArtworks = @[testArtwork.name];
NSError *testError = [NSError errorWithDomain:@"errorDomain" code:9 userInfo:@{testArtwork2.name:@"error 2"}];
OCMStub([mockFileManager uploadArtworks:[OCMArg isNotNil] progressHandler:[OCMArg isNotNil] completionHandler:([OCMArg invokeBlockWithArgs:testSuccessfulArtworks, testError, nil])]);
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
updatedState = [[SDLTextAndGraphicState alloc] init];
updatedState.textField1 = field1String;
updatedState.primaryGraphic = testArtwork;
@@ -1058,6 +1082,7 @@ describe(@"the text and graphic operation", ^{
NSArray<NSString *> *testSuccessfulArtworks = @[testArtwork2.name];
NSError *testError = [NSError errorWithDomain:@"errorDomain" code:9 userInfo:@{testArtwork.name:@"error 2"}];
OCMStub([mockFileManager uploadArtworks:[OCMArg isNotNil] progressHandler:[OCMArg isNotNil] completionHandler:([OCMArg invokeBlockWithArgs:testSuccessfulArtworks, testError, nil])]);
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
updatedState = [[SDLTextAndGraphicState alloc] init];
updatedState.textField1 = field1String;
updatedState.primaryGraphic = testArtwork;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
index 570d2bd9e..e18bda43f 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
@@ -5,6 +5,7 @@
#import "SDLFile.h"
#import "SDLFileWrapper.h"
#import "SDLGlobals.h"
+#import "SDLProtocolHeader.h"
#import "SDLPutFile.h"
#import "SDLPutFileResponse.h"
#import "SDLUploadFileOperation.h"
@@ -14,22 +15,26 @@
@interface UploadFileOperationSpecHelpers : NSObject
-+ (void)testPutFiles:(NSArray<SDLPutFile *> *)putFiles data:(NSData *)testFileData file:(SDLFile *)testFile;
++ (void)testPutFiles:(NSArray<SDLPutFile *> *)putFiles testFile:(SDLFile *)testFile mtuSize:(NSUInteger)mtuSize;
@end
@implementation UploadFileOperationSpecHelpers
-+ (void)testPutFiles:(NSArray<SDLPutFile *> *)putFiles data:(NSData *)testFileData file:(SDLFile *)testFile {
+/// Checks each of the PutFiles generated by the SDLUploadFileOperation to make sure all the properties (i.e. bulk data, offset, file name, etc.) were set correctly.
+/// @param putFiles The PutFiles generated by the SDLUploadFileOperation
+/// @param testFile The file used to generate the PutFiles
+/// @param mtuSize The max allowed size for the packet generated for the PutFile
++ (void)testPutFiles:(NSArray<SDLPutFile *> *)putFiles testFile:(SDLFile *)testFile mtuSize:(NSUInteger)mtuSize {
// Test all packets for offset, length, and data
for (NSUInteger index = 0; index < putFiles.count; index++) {
SDLPutFile *putFile = putFiles[index];
- NSUInteger mtuSize = [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeBulkData];
- NSData *testBulkFileData = [testFileData subdataWithRange:NSMakeRange((index * mtuSize), MIN(putFile.length.unsignedIntegerValue, mtuSize))];
+ NSUInteger maxBulkDataSize = [self.class testMaxBulkDataSizeForFile:testFile mtuSize:mtuSize];
+ NSData *testBulkFileData = [testFile.data subdataWithRange:NSMakeRange((index * maxBulkDataSize), MIN(putFile.length.unsignedIntegerValue, maxBulkDataSize))];
unsigned long testBulkFileDataCrc = crc32(0, testBulkFileData.bytes, (uInt)testBulkFileData.length);
- expect(putFile.offset).to(equal(@(index * mtuSize)));
+ expect(putFile.offset).to(equal(@(index * maxBulkDataSize)));
expect(putFile.persistentFile).to(equal(@NO));
expect(putFile.sdlFileName).to(equal(testFile.name));
expect(putFile.bulkData).to(equal(testBulkFileData));
@@ -41,14 +46,39 @@
expect(putFile.length).to(equal(@([testFile fileSize])));
} else if (index == putFiles.count - 1) {
// The last pufile contains the remaining data size
- expect(putFile.length).to(equal(@([testFile fileSize] - (index * mtuSize))));
+ expect(putFile.length).to(equal(@([testFile fileSize] - (index * maxBulkDataSize))));
} else {
// All other putfiles contain the max data size for a putfile packet
- expect(putFile.length).to(equal(@(mtuSize)));
+ expect(putFile.length).to(equal(@(maxBulkDataSize)));
}
}
}
+/// Calculates the number of PutFiles that should be generated by the SDLUploadFileOperation for the file's data.
+/// @param file The file to be uploaded
+/// @param mtuSize The max allowed size of packet generated for the PutFile
+/// @return The number of PutFiles that should be created
++ (NSUInteger)testNumberOfPutFiles:(SDLFile *)file mtuSize:(NSUInteger)mtuSize {
+ NSUInteger maxBulkDataSize = [self.class testMaxBulkDataSizeForFile:file mtuSize:mtuSize];
+ return (((file.fileSize - 1) / maxBulkDataSize) + 1);
+}
+
+/// Calculates the max size of the data that can be set in the bulk data field for a PutFile. The size of the binary header, JSON, and frame header must be taken into account in order to make sure the packet size does not exceed the max MTU size allowed by SDL Core.
+/// @param file The file to be uploaded
+/// @param mtuSize The max allowed size of packet generated for the SDLPutFile
+/// @return The size of the bulk data that can be set in the PutFiles
++ (NSUInteger)testMaxBulkDataSizeForFile:(SDLFile *)file mtuSize:(NSUInteger)mtuSize {
+ NSUInteger frameHeaderSize = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major].size;
+ NSUInteger binaryHeaderSize = 12;
+
+ SDLPutFile *putFile = [[SDLPutFile alloc] initWithFileName:file.name fileType:file.fileType persistentFile:file.persistent systemFile:NO offset:(UInt32)file.fileSize length:(UInt32)file.fileSize bulkData:file.data];
+ putFile.crc = @(UINT32_MAX);
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[putFile serializeAsDictionary:(Byte)[SDLGlobals sharedGlobals].protocolVersion.major] options:kNilOptions error:nil];
+ NSUInteger maxJSONSize = jsonData.length;
+
+ return mtuSize - (binaryHeaderSize + maxJSONSize + frameHeaderSize);
+}
+
@end
QuickSpecBegin(SDLUploadFileOperationSpec)
@@ -58,7 +88,7 @@ describe(@"Streaming upload of data", ^{
__block NSData *testFileData = nil;
__block SDLFile *testFile = nil;
__block SDLFileWrapper *testFileWrapper = nil;
- __block NSUInteger numberOfPutFiles = 0;
+ __block NSUInteger expectedNumberOfPutFiles = 0;
__block TestConnectionManager *testConnectionManager = nil;
__block SDLUploadFileOperation *testOperation = nil;
@@ -67,14 +97,18 @@ describe(@"Streaming upload of data", ^{
__block NSUInteger bytesAvailableResult = NO;
__block NSError *errorResult = nil;
+ __block int testMTUSize = 1024;
+
beforeEach(^{
[SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = [SDLVersion versionWithString:@"2.0.0"];
+ // Since SDLGlobals is a singleton, the MTU size can be set by other test classes (i.e. the value returned can vary based on when these tests are run in relation to all the tests). Set the MTU size for this test suite to ensure the retrieved MTU size is the same every time this set of tests is run.
+ [[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)testMTUSize forServiceType:SDLServiceTypeRPC];
testFileName = nil;
testFileData = nil;
testFile = nil;
testFileWrapper = nil;
- numberOfPutFiles = 0;
+ expectedNumberOfPutFiles = 0;
testOperation = nil;
testConnectionManager = [[TestConnectionManager alloc] init];
@@ -85,12 +119,18 @@ describe(@"Streaming upload of data", ^{
});
describe(@"When uploading data", ^{
+ __block NSInteger spaceLeft = 0;
+ __block SDLPutFileResponse *successResponse = nil;
+
+ beforeEach(^{
+ spaceLeft = 11212512;
+ });
+
context(@"data should be split into smaller packets if too large to send all at once", ^{
it(@"should split the data from a short chunk of text in memory correctly", ^{
testFileName = @"TestSmallMemory";
testFileData = [@"test1234" dataUsingEncoding:NSUTF8StringEncoding];
testFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
- __block NSInteger spaceLeft = 11212512;
testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
expect(success).to(beTrue());
@@ -98,24 +138,22 @@ describe(@"Streaming upload of data", ^{
expect(error).to(beNil());
}];
- numberOfPutFiles = ((([testFile fileSize] - 1) / [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeBulkData]) + 1);
+ expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
[testOperation start];
- NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
- expect(@(putFiles.count)).to(equal(@(numberOfPutFiles)));
- [UploadFileOperationSpecHelpers testPutFiles:putFiles data:testFileData file:testFile];
-
- __block SDLPutFileResponse *goodResponse = nil;
-
- // We must do some cleanup here otherwise the unit test cases will crash
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
- goodResponse = [[SDLPutFileResponse alloc] init];
- goodResponse.success = @YES;
- goodResponse.spaceAvailable = @(spaceLeft);
- [testConnectionManager respondToRequestWithResponse:goodResponse requestNumber:i error:nil];
+ NSArray<SDLPutFile *> *testPutFiles = testConnectionManager.receivedRequests;
+ expect(@(testPutFiles.count)).to(equal(@(expectedNumberOfPutFiles)));
+
+ [UploadFileOperationSpecHelpers testPutFiles:testPutFiles testFile:testFile mtuSize:testMTUSize];
+
+ // Respond to each PutFile request
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ successResponse = [[SDLPutFileResponse alloc] init];
+ successResponse.success = @YES;
+ successResponse.spaceAvailable = @(spaceLeft -= 1024);
+ [testConnectionManager respondToRequestWithResponse:successResponse requestNumber:i error:nil];
}
expect(testOperation.finished).toEventually(beTrue());
@@ -127,7 +165,6 @@ describe(@"Streaming upload of data", ^{
UIImage *testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
testFileData = UIImageJPEGRepresentation(testImage, 1.0);
testFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
- __block NSInteger spaceLeft = 11212512;
testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
expect(success).to(beTrue());
@@ -135,24 +172,21 @@ describe(@"Streaming upload of data", ^{
expect(error).to(beNil());
}];
- numberOfPutFiles = ((([testFile fileSize] - 1) / [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeBulkData]) + 1);
+ expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
[testOperation start];
NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
- expect(@(putFiles.count)).to(equal(@(numberOfPutFiles)));
- [UploadFileOperationSpecHelpers testPutFiles:putFiles data:testFileData file:testFile];
-
- __block SDLPutFileResponse *goodResponse = nil;
-
- // We must do some cleanup here otherwise the unit test cases will crash
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
- goodResponse = [[SDLPutFileResponse alloc] init];
- goodResponse.success = @YES;
- goodResponse.spaceAvailable = @(spaceLeft);
- [testConnectionManager respondToRequestWithResponse:goodResponse requestNumber:i error:nil];
+ expect(@(putFiles.count)).to(equal(@(expectedNumberOfPutFiles)));
+ [UploadFileOperationSpecHelpers testPutFiles:putFiles testFile:testFile mtuSize:testMTUSize];
+
+ // Respond to each PutFile request
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ successResponse = [[SDLPutFileResponse alloc] init];
+ successResponse.success = @YES;
+ successResponse.spaceAvailable = @(spaceLeft -= 1024);
+ [testConnectionManager respondToRequestWithResponse:successResponse requestNumber:i error:nil];
}
expect(testOperation.finished).toEventually(beTrue());
@@ -160,13 +194,11 @@ describe(@"Streaming upload of data", ^{
});
it(@"should split the data from a small text file correctly", ^{
- NSString *fileName = @"testFileJSON";
- testFileName = fileName;
- NSString *textFilePath = [[NSBundle bundleForClass:[self class]] pathForResource:fileName ofType:@"json"];
+ testFileName = @"testFileJSON";
+ NSString *textFilePath = [[NSBundle bundleForClass:[self class]] pathForResource:testFileName ofType:@"json"];
NSURL *textFileURL = [[NSURL alloc] initFileURLWithPath:textFilePath];
- testFile = [SDLFile fileAtFileURL:textFileURL name:fileName];
+ testFile = [SDLFile fileAtFileURL:textFileURL name:testFileName];
testFileData = [[NSData alloc] initWithContentsOfURL:textFileURL];
- __block NSInteger spaceLeft = 11212512;
testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
expect(success).to(beTrue());
@@ -174,24 +206,21 @@ describe(@"Streaming upload of data", ^{
expect(error).to(beNil());
}];
- numberOfPutFiles = ((([testFile fileSize] - 1) / [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeBulkData]) + 1);
+ expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
[testOperation start];
NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
- expect(@(putFiles.count)).to(equal(@(numberOfPutFiles)));
- [UploadFileOperationSpecHelpers testPutFiles:putFiles data:testFileData file:testFile];
-
- __block SDLPutFileResponse *goodResponse = nil;
-
- // We must do some cleanup here otherwise the unit test cases will crash
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
- goodResponse = [[SDLPutFileResponse alloc] init];
- goodResponse.success = @YES;
- goodResponse.spaceAvailable = @(spaceLeft);
- [testConnectionManager respondToRequestWithResponse:goodResponse requestNumber:i error:nil];
+ expect(@(putFiles.count)).to(equal(@(expectedNumberOfPutFiles)));
+ [UploadFileOperationSpecHelpers testPutFiles:putFiles testFile:testFile mtuSize:testMTUSize];
+
+ // Respond to each PutFile request
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ successResponse = [[SDLPutFileResponse alloc] init];
+ successResponse.success = @YES;
+ successResponse.spaceAvailable = @(spaceLeft -= 1024);
+ [testConnectionManager respondToRequestWithResponse:successResponse requestNumber:i error:nil];
}
expect(testOperation.finished).toEventually(beTrue());
@@ -204,9 +233,6 @@ describe(@"Streaming upload of data", ^{
NSString *imageFilePath = [[NSBundle bundleForClass:[self class]] pathForResource:fileName ofType:@"png"];
NSURL *imageFileURL = [[NSURL alloc] initFileURLWithPath:imageFilePath];
testFile = [SDLFile fileAtFileURL:imageFileURL name:fileName];
- __block NSInteger spaceLeft = 11212512;
-
- // For testing: get data to check if data chunks are being created correctly
testFileData = [[NSData alloc] initWithContentsOfURL:imageFileURL];
testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
@@ -215,24 +241,21 @@ describe(@"Streaming upload of data", ^{
expect(error).to(beNil());
}];
- numberOfPutFiles = ((([testFile fileSize] - 1) / [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeBulkData]) + 1);
+ expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
[testOperation start];
NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
- expect(@(putFiles.count)).to(equal(@(numberOfPutFiles)));
- [UploadFileOperationSpecHelpers testPutFiles:putFiles data:testFileData file:testFile];
-
- __block SDLPutFileResponse *goodResponse = nil;
-
- // We must do some cleanup here otherwise the unit test cases will crash
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
- goodResponse = [[SDLPutFileResponse alloc] init];
- goodResponse.success = @YES;
- goodResponse.spaceAvailable = @(spaceLeft);
- [testConnectionManager respondToRequestWithResponse:goodResponse requestNumber:i error:nil];
+ expect(@(putFiles.count)).to(equal(@(expectedNumberOfPutFiles)));
+ [UploadFileOperationSpecHelpers testPutFiles:putFiles testFile:testFile mtuSize:testMTUSize];
+
+ // Respond to each PutFile request
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ successResponse = [[SDLPutFileResponse alloc] init];
+ successResponse.success = @YES;
+ successResponse.spaceAvailable = @(spaceLeft -= 1024);
+ [testConnectionManager respondToRequestWithResponse:successResponse requestNumber:i error:nil];
}
expect(testOperation.finished).toEventually(beTrue());
@@ -253,9 +276,7 @@ describe(@"Streaming upload of data", ^{
errorResult = error;
}];
- NSUInteger mtuSize = [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeBulkData];
-
- numberOfPutFiles = ((([testFile fileSize] - 1) / mtuSize) + 1);
+ expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
testConnectionManager = [[TestConnectionManager alloc] init];
testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
@@ -263,21 +284,19 @@ describe(@"Streaming upload of data", ^{
});
context(@"If data was sent successfully", ^{
- __block SDLPutFileResponse *goodResponse = nil;
__block NSInteger spaceLeft = 0;
+ __block SDLPutFileResponse *successResponse = nil;
beforeEach(^{
- goodResponse = nil;
spaceLeft = 11212512;
});
it(@"should have called the completion handler with success only if all packets were sent successfully", ^{
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
- goodResponse = [[SDLPutFileResponse alloc] init];
- goodResponse.success = @YES;
- goodResponse.spaceAvailable = @(spaceLeft);
- [testConnectionManager respondToRequestWithResponse:goodResponse requestNumber:i error:nil];
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ successResponse = [[SDLPutFileResponse alloc] init];
+ successResponse.success = @YES;
+ successResponse.spaceAvailable = @(spaceLeft -= 1024);
+ [testConnectionManager respondToRequestWithResponse:successResponse requestNumber:i error:nil];
}
expect(successResult).toEventually(beTrue());
@@ -293,21 +312,19 @@ describe(@"Streaming upload of data", ^{
__block SDLPutFileResponse *response = nil;
__block NSString *responseErrorDescription = nil;
__block NSString *responseErrorReason = nil;
+ __block NSError *error = nil;
__block NSInteger spaceLeft = 0;
beforeEach(^{
- response = nil;
responseErrorDescription = nil;
responseErrorReason = nil;
spaceLeft = 11212512;
});
it(@"should have called the completion handler with error if the first packet was not sent successfully", ^{
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
response = [[SDLPutFileResponse alloc] init];
- response.spaceAvailable = @(spaceLeft);
- NSError *error = nil;
+ response.spaceAvailable = @(spaceLeft -= 1024);
if (i == 0) {
// Only the first packet is sent unsuccessfully
@@ -317,6 +334,7 @@ describe(@"Streaming upload of data", ^{
error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason];
} else {
response.success = @YES;
+ error = nil;
}
[testConnectionManager respondToRequestWithResponse:response requestNumber:i error:error];
@@ -328,13 +346,11 @@ describe(@"Streaming upload of data", ^{
});
it(@"should have called the completion handler with error if the last packet was not sent successfully", ^{
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
response = [[SDLPutFileResponse alloc] init];
- response.spaceAvailable = @(spaceLeft);
- NSError *error = nil;
+ response.spaceAvailable = @(spaceLeft -= 1024);
- if (i == (numberOfPutFiles - 1)) {
+ if (i == (expectedNumberOfPutFiles - 1)) {
// Only the last packet is sent unsuccessfully
response.success = @NO;
responseErrorDescription = @"some description";
@@ -342,6 +358,7 @@ describe(@"Streaming upload of data", ^{
error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason];
} else {
response.success = @YES;
+ error = nil;
}
[testConnectionManager respondToRequestWithResponse:response requestNumber:i error:error];
@@ -353,11 +370,10 @@ describe(@"Streaming upload of data", ^{
});
it(@"should have called the completion handler with error if all packets were not sent successfully", ^{
- for (int i = 0; i < numberOfPutFiles; i++) {
- spaceLeft -= 1024;
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
response = [[SDLPutFileResponse alloc] init];
response.success = @NO;
- response.spaceAvailable = @(spaceLeft);
+ response.spaceAvailable = @(spaceLeft -= 1024);
responseErrorDescription = @"some description";
responseErrorReason = @"some reason";
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandManagerSpec.m
index c5e275843..3fed04f1c 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandManagerSpec.m
@@ -7,10 +7,20 @@
#import "SDLDeleteCommand.h"
#import "SDLFileManager.h"
#import "SDLHMILevel.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLPredefinedWindows.h"
+#import "SDLRPCNotificationNotification.h"
#import "SDLVoiceCommand.h"
#import "SDLVoiceCommandManager.h"
+#import "SDLVoiceCommandUpdateOperation.h"
#import "TestConnectionManager.h"
+@interface SDLVoiceCommandUpdateOperation ()
+
+@property (strong, nonatomic) NSMutableArray<SDLVoiceCommand *> *currentVoiceCommands;
+
+@end
+
@interface SDLVoiceCommand()
@property (assign, nonatomic) UInt32 commandId;
@@ -21,14 +31,11 @@
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
-@property (assign, nonatomic) BOOL waitingOnHMIUpdate;
-@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
-
-@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
-@property (assign, nonatomic) BOOL hasQueuedUpdate;
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (copy, nonatomic, nullable) SDLHMILevel currentLevel;
@property (assign, nonatomic) UInt32 lastVoiceCommandId;
-@property (copy, nonatomic) NSArray<SDLVoiceCommand *> *oldVoiceCommands;
+@property (copy, nonatomic) NSArray<SDLVoiceCommand *> *currentVoiceCommands;
@end
@@ -42,104 +49,126 @@ describe(@"voice command manager", ^{
__block SDLVoiceCommand *testVoiceCommand = [[SDLVoiceCommand alloc] initWithVoiceCommands:@[@"Test 1"] handler:^{}];
__block SDLVoiceCommand *testVoiceCommand2 = [[SDLVoiceCommand alloc] initWithVoiceCommands:@[@"Test 2"] handler:^{}];
+ __block SDLOnHMIStatus *newHMIStatus = [[SDLOnHMIStatus alloc] init];
+ __block NSArray<SDLVoiceCommand *> *testVCArray = nil;
beforeEach(^{
+ testVCArray = @[testVoiceCommand];
mockConnectionManager = [[TestConnectionManager alloc] init];
testManager = [[SDLVoiceCommandManager alloc] initWithConnectionManager:mockConnectionManager];
});
+ // should instantiate correctly
it(@"should instantiate correctly", ^{
expect(testManager.connectionManager).to(equal(mockConnectionManager));
-
+ expect(testManager.currentLevel).to(beNil());
expect(testManager.voiceCommands).to(beEmpty());
- expect(testManager.connectionManager).to(equal(mockConnectionManager));
- expect(testManager.currentHMILevel).to(beNil());
- expect(testManager.inProgressUpdate).to(beNil());
- expect(testManager.hasQueuedUpdate).to(beFalse());
- expect(testManager.waitingOnHMIUpdate).to(beFalse());
expect(testManager.lastVoiceCommandId).to(equal(VoiceCommandIdMin));
- expect(testManager.oldVoiceCommands).to(beEmpty());
+ expect(testManager.currentVoiceCommands).to(beEmpty());
+ expect(testManager.transactionQueue).toNot(beNil());
});
+ // updating voice commands before HMI is ready
describe(@"updating voice commands before HMI is ready", ^{
+
+ // when in HMI NONE
context(@"when in HMI NONE", ^{
beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelNone;
+ newHMIStatus.hmiLevel = SDLHMILevelNone;
+ newHMIStatus.windowID = @(SDLPredefinedWindowsDefaultWindow);
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:newHMIStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
});
it(@"should not update", ^{
testManager.voiceCommands = @[testVoiceCommand];
- expect(testManager.inProgressUpdate).to(beNil());
+ expect(testManager.transactionQueue.isSuspended).to(beTrue());
+ expect(testManager.transactionQueue.operationCount).to(equal(1));
});
});
+ // when no HMI level has been received
context(@"when no HMI level has been received", ^{
- beforeEach(^{
- testManager.currentHMILevel = nil;
- });
-
it(@"should not update", ^{
testManager.voiceCommands = @[testVoiceCommand];
- expect(testManager.inProgressUpdate).to(beNil());
+ expect(testManager.transactionQueue.isSuspended).to(beTrue());
+ expect(testManager.transactionQueue.operationCount).to(equal(1));
});
});
});
- describe(@"updating voice commands", ^{
+ // updating voice commands
+ describe(@"when voice commands are set", ^{
beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelFull;
+ newHMIStatus.hmiLevel = SDLHMILevelFull;
+ newHMIStatus.windowID = @(SDLPredefinedWindowsDefaultWindow);
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:newHMIStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ testManager.voiceCommands = testVCArray;
});
+ // should properly update a command
it(@"should properly update a command", ^{
- testManager.voiceCommands = @[testVoiceCommand];
+ expect(testManager.voiceCommands.firstObject.commandId).to(equal(VoiceCommandIdMin));
+ expect(testManager.transactionQueue.isSuspended).to(beFalse());
+ expect(testManager.transactionQueue.operations).to(haveCount(1));
+ });
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
- expect(deletes).to(beEmpty());
+ // when new voice commands is identical to the existing ones
+ describe(@"when new voice commands is identical to the existing ones", ^{
+ beforeEach(^{
+ testManager.voiceCommands = testVCArray;
+ });
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
- NSArray *add = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
- expect(add).toNot(beEmpty());
+ // should only have one operation
+ it(@"should only have one operation", ^{
+ expect(testManager.transactionQueue.operations).to(haveCount(1));
+ });
});
- context(@"when a menu already exists", ^{
+ // when new voice commands are set
+ describe(@"when new voice commands are set", ^{
beforeEach(^{
- testManager.voiceCommands = @[testVoiceCommand];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Add
-
testManager.voiceCommands = @[testVoiceCommand2];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Delete
});
- it(@"should send deletes first", ^{
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+ // should queue another operation
+ it(@"should queue another operation", ^{
+ expect(testManager.transactionQueue.operations).to(haveCount(2));
+ });
+
+ // when the first operation finishes and updates the current voice commands
+ describe(@"when the first operation finishes and updates the current voice commands", ^{
+ beforeEach(^{
+ SDLVoiceCommandUpdateOperation *firstOp = testManager.transactionQueue.operations[0];
+ firstOp.currentVoiceCommands = [@[testVoiceCommand2] mutableCopy];
+ [firstOp finishOperation];
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ [NSThread sleepForTimeInterval:0.5];
+ });
- expect(deletes).to(haveCount(1));
- expect(adds).to(haveCount(2));
+ it(@"should update the second operation", ^{
+ expect(((SDLVoiceCommandUpdateOperation *)testManager.transactionQueue.operations.firstObject).oldVoiceCommands.firstObject).withTimeout(3.0).toEventually(equal(testVoiceCommand2));
+ });
});
});
});
- context(@"On disconnects", ^{
+ // on disconnect
+ context(@"on disconnect", ^{
beforeEach(^{
[testManager stop];
});
it(@"should reset correctly", ^{
expect(testManager.connectionManager).to(equal(mockConnectionManager));
-
expect(testManager.voiceCommands).to(beEmpty());
- expect(testManager.connectionManager).to(equal(mockConnectionManager));
- expect(testManager.currentHMILevel).to(beNil());
- expect(testManager.inProgressUpdate).to(beNil());
- expect(testManager.hasQueuedUpdate).to(beFalse());
- expect(testManager.waitingOnHMIUpdate).to(beFalse());
+ expect(testManager.currentLevel).to(beNil());
expect(testManager.lastVoiceCommandId).to(equal(VoiceCommandIdMin));
- expect(testManager.oldVoiceCommands).to(beEmpty());
+ expect(testManager.currentVoiceCommands).to(beEmpty());
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m
new file mode 100644
index 000000000..ca8c9cfbd
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m
@@ -0,0 +1,249 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAddCommand.h"
+#import "SDLAddCommandResponse.h"
+#import "SDLDeleteCommand.h"
+#import "SDLDeleteCommandResponse.h"
+#import "SDLError.h"
+#import "SDLFileManager.h"
+#import "SDLHMILevel.h"
+#import "SDLVoiceCommand.h"
+#import "SDLVoiceCommandManager.h"
+#import "SDLVoiceCommandUpdateOperation.h"
+#import "TestConnectionManager.h"
+
+@interface SDLVoiceCommand()
+
+@property (assign, nonatomic) UInt32 commandId;
+
+@end
+
+QuickSpecBegin(SDLVoiceCommandUpdateOperationSpec)
+
+__block SDLDeleteCommandResponse *successDelete = nil;
+__block SDLDeleteCommandResponse *failDelete = nil;
+__block SDLAddCommandResponse *successAdd = nil;
+__block SDLAddCommandResponse *failAdd = nil;
+
+__block SDLVoiceCommand *newVoiceCommand1 = [[SDLVoiceCommand alloc] initWithVoiceCommands:@[@"NewVC1"] handler:^{}];
+__block SDLVoiceCommand *newVoiceCommand2 = [[SDLVoiceCommand alloc] initWithVoiceCommands:@[@"NewVC2"] handler:^{}];
+__block SDLVoiceCommand *oldVoiceCommand1 = [[SDLVoiceCommand alloc] initWithVoiceCommands:@[@"OldVC1"] handler:^{}];
+__block SDLVoiceCommand *oldVoiceCommand2 = [[SDLVoiceCommand alloc] initWithVoiceCommands:@[@"OldVC2"] handler:^{}];
+
+
+describe(@"a voice command operation", ^{
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLVoiceCommandUpdateOperation *testOp = nil;
+
+ __block NSError *callbackError = nil;
+ __block NSArray<SDLVoiceCommand *> *callbackCurrentVoiceCommands = nil;
+
+ beforeEach(^{
+ successDelete = [[SDLDeleteCommandResponse alloc] init];
+ successDelete.success = @YES;
+ successDelete.resultCode = SDLResultSuccess;
+
+ failDelete = [[SDLDeleteCommandResponse alloc] init];
+ failDelete.success = @NO;
+ failDelete.resultCode = SDLResultDisallowed;
+
+ successAdd = [[SDLAddCommandResponse alloc] init];
+ successAdd.success = @YES;
+ successAdd.resultCode = SDLResultSuccess;
+
+ failAdd = [[SDLAddCommandResponse alloc] init];
+ failAdd.success = @NO;
+ failAdd.resultCode = SDLResultDisallowed;
+
+ newVoiceCommand1.commandId = 1;
+ newVoiceCommand2.commandId = 2;
+ oldVoiceCommand1.commandId = 3;
+ oldVoiceCommand2.commandId = 4;
+
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testOp = nil;
+
+ callbackError = nil;
+ callbackCurrentVoiceCommands = nil;
+ });
+
+ // should have a priority of 'normal'
+ it(@"should have a priority of 'normal'", ^{
+ testOp = [[SDLVoiceCommandUpdateOperation alloc] initWithConnectionManager:testConnectionManager pendingVoiceCommands:@[] oldVoiceCommands:@[] updateCompletionHandler:^(NSArray<SDLVoiceCommand *> * _Nonnull newCurrentVoiceCommands, NSError * _Nullable error) {
+ }];
+
+ expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
+ });
+
+ // initializing the operation
+ describe(@"initializing the operation", ^{
+ testOp = [[SDLVoiceCommandUpdateOperation alloc] initWithConnectionManager:testConnectionManager pendingVoiceCommands:@[newVoiceCommand1, newVoiceCommand2] oldVoiceCommands:@[oldVoiceCommand1, oldVoiceCommand2] updateCompletionHandler:^(NSArray<SDLVoiceCommand *> * _Nonnull newCurrentVoiceCommands, NSError * _Nullable error) {}];
+
+ expect(testOp.oldVoiceCommands).to(equal(@[oldVoiceCommand1, oldVoiceCommand2]));
+ });
+
+ // starting the operation
+ describe(@"starting the operation", ^{
+
+ // if it starts cancelled
+ context(@"if it starts cancelled", ^{
+ beforeEach(^{
+ testOp = [[SDLVoiceCommandUpdateOperation alloc] initWithConnectionManager:testConnectionManager pendingVoiceCommands:@[newVoiceCommand1, newVoiceCommand2] oldVoiceCommands:@[oldVoiceCommand1, oldVoiceCommand2] updateCompletionHandler:^(NSArray<SDLVoiceCommand *> * _Nonnull newCurrentVoiceCommands, NSError * _Nullable error) {
+ callbackCurrentVoiceCommands = newCurrentVoiceCommands;
+ callbackError = error;
+ }];
+ [testOp cancel];
+ [testOp start];
+ });
+
+ it(@"should return immediately with an error", ^{
+ expect(callbackError).toEventuallyNot(beNil());
+ });
+ });
+
+ // if it has voice commands to delete
+ context(@"if it has voice commands to delete", ^{
+ beforeEach(^{
+ testOp = [[SDLVoiceCommandUpdateOperation alloc] initWithConnectionManager:testConnectionManager pendingVoiceCommands:@[] oldVoiceCommands:@[oldVoiceCommand1, oldVoiceCommand2] updateCompletionHandler:^(NSArray<SDLVoiceCommand *> * _Nonnull newCurrentVoiceCommands, NSError * _Nullable error) {
+ callbackCurrentVoiceCommands = newCurrentVoiceCommands;
+ callbackError = error;
+ }];
+ [testOp start];
+ });
+
+ // and the delete succeeds
+ context(@"and the delete succeeds", ^{
+ beforeEach(^{
+ SDLDeleteCommandResponse *deleteOld1 = [[SDLDeleteCommandResponse alloc] init];
+ deleteOld1.success = @YES;
+ deleteOld1.resultCode = SDLResultSuccess;
+
+ SDLDeleteCommandResponse *deleteOld2 = [[SDLDeleteCommandResponse alloc] init];
+ deleteOld2.success = @YES;
+ deleteOld2.resultCode = SDLResultSuccess;
+
+ [testConnectionManager respondToRequestWithResponse:deleteOld1 requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:deleteOld2 requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ });
+
+ it(@"should update the current voice commands", ^{
+ expect(callbackCurrentVoiceCommands).to(haveCount(0));
+ expect(callbackError).to(beNil());
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+
+ // and the delete fails
+ context(@"and the delete fails", ^{
+ beforeEach(^{
+ [testConnectionManager respondToRequestWithResponse:failDelete requestNumber:0 error:[NSError sdl_lifecycle_failedWithBadResult:SDLResultDisallowed info:nil]];
+ [testConnectionManager respondToRequestWithResponse:failDelete requestNumber:1 error:[NSError sdl_lifecycle_failedWithBadResult:SDLResultDisallowed info:nil]];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:NO];
+ });
+
+ it(@"should update the current voice commands and attempt to send the adds", ^{
+ expect(callbackCurrentVoiceCommands).to(haveCount(2));
+ expect(callbackError).toNot(beNil());
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+
+ // and the delete partially fails
+ context(@"and the delete partially fails", ^{
+ beforeEach(^{
+ [testConnectionManager respondToRequestWithResponse:failDelete requestNumber:0 error:[NSError sdl_lifecycle_failedWithBadResult:SDLResultDisallowed info:nil]];
+ [testConnectionManager respondToRequestWithResponse:successDelete requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:NO];
+ });
+
+ it(@"should update the current voice commands and attempt to send the adds", ^{
+ expect(callbackCurrentVoiceCommands).to(haveCount(1));
+ expect(callbackError).toNot(beNil());
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+ });
+
+ context(@"if it doesn't have any voice commands to delete", ^{
+ beforeEach(^{
+ testOp = [[SDLVoiceCommandUpdateOperation alloc] initWithConnectionManager:testConnectionManager pendingVoiceCommands:@[newVoiceCommand1, newVoiceCommand2] oldVoiceCommands:@[] updateCompletionHandler:^(NSArray<SDLVoiceCommand *> * _Nonnull newCurrentVoiceCommands, NSError * _Nullable error) {
+ callbackCurrentVoiceCommands = newCurrentVoiceCommands;
+ callbackError = error;
+ }];
+ [testOp start];
+ });
+
+ context(@"adding voice commands", ^{
+ context(@"and the add succeeds", ^{
+ beforeEach(^{
+ SDLAddCommandResponse *addNew1 = [[SDLAddCommandResponse alloc] init];
+ addNew1.success = @YES;
+ addNew1.resultCode = SDLResultSuccess;
+
+ SDLAddCommandResponse *addNew2 = [[SDLAddCommandResponse alloc] init];
+ addNew2.success = @YES;
+ addNew2.resultCode = SDLResultSuccess;
+
+ [testConnectionManager respondToRequestWithResponse:addNew1 requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addNew2 requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ });
+
+ it(@"should update the current voice commands", ^{
+ expect(callbackCurrentVoiceCommands).to(haveCount(2));
+ expect(callbackError).to(beNil());
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+
+ context(@"and the add fails", ^{
+ beforeEach(^{
+ SDLAddCommandResponse *addNew1 = [[SDLAddCommandResponse alloc] init];
+ addNew1.success = @NO;
+ addNew1.resultCode = SDLResultDisallowed;
+
+ SDLAddCommandResponse *addNew2 = [[SDLAddCommandResponse alloc] init];
+ addNew2.success = @NO;
+ addNew2.resultCode = SDLResultDisallowed;
+
+ [testConnectionManager respondToRequestWithResponse:addNew1 requestNumber:0 error:[NSError sdl_lifecycle_failedWithBadResult:SDLResultDisallowed info:nil]];
+ [testConnectionManager respondToRequestWithResponse:addNew2 requestNumber:1 error:[NSError sdl_lifecycle_failedWithBadResult:SDLResultDisallowed info:nil]];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:NO];
+ });
+
+ it(@"should update the current voice commands", ^{
+ expect(callbackCurrentVoiceCommands).to(haveCount(0));
+ expect(callbackError).toNot(beNil());
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+
+ context(@"and the add partially fails", ^{
+ beforeEach(^{
+ SDLAddCommandResponse *addNew1 = [[SDLAddCommandResponse alloc] init];
+ addNew1.success = @NO;
+ addNew1.resultCode = SDLResultDisallowed;
+
+ SDLAddCommandResponse *addNew2 = [[SDLAddCommandResponse alloc] init];
+ addNew2.success = @YES;
+ addNew2.resultCode = SDLResultSuccess;
+
+ [testConnectionManager respondToRequestWithResponse:addNew1 requestNumber:0 error:[NSError sdl_lifecycle_failedWithBadResult:SDLResultDisallowed info:nil]];
+ [testConnectionManager respondToRequestWithResponse:addNew2 requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:NO];
+ });
+
+ it(@"should update the current voice commands", ^{
+ expect(callbackCurrentVoiceCommands).to(haveCount(1));
+ expect(callbackError).toNot(beNil());
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/Notifications/SDLResponseDispatcherSpec.m b/SmartDeviceLinkTests/Notifications/SDLResponseDispatcherSpec.m
index 4a9d452e6..9dcff09b7 100644
--- a/SmartDeviceLinkTests/Notifications/SDLResponseDispatcherSpec.m
+++ b/SmartDeviceLinkTests/Notifications/SDLResponseDispatcherSpec.m
@@ -125,7 +125,7 @@ describe(@"a response dispatcher", ^{
__block NSUInteger numTimesHandlerCalled = 0;
beforeEach(^{
- testShow = [[SDLShow alloc] initWithMainField1:@"Test Show" mainField2:nil alignment:SDLTextAlignmentCenter];
+ testShow = [[SDLShow alloc] initWithMainField1:@"Test Show" mainField2:nil mainField3:nil mainField4:nil alignment:SDLTextAlignmentCenter statusBar:nil mediaTrack:nil graphic:nil secondaryGraphic:nil softButtons:nil customPresets:nil metadataTags:nil templateTitle:nil windowID:nil templateConfiguration:nil];
testShow.correlationID = @1;
});
@@ -242,8 +242,11 @@ describe(@"a response dispatcher", ^{
testCommandId = 1;
testAddCommandCorrelationId = @42;
numTimesHandlerCalled = 0;
-
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testAddCommand = [[SDLAddCommand alloc] initWithId:testCommandId vrCommands:nil handler:^(__kindof SDLRPCNotification * _Nonnull notification) {
+#pragma clang diagnostic pop
numTimesHandlerCalled++;
}];
testAddCommand.correlationID = testAddCommandCorrelationId;
@@ -343,7 +346,10 @@ describe(@"a response dispatcher", ^{
context(@"without a handler", ^{
beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testAddCommand = [[SDLAddCommand alloc] initWithId:1 vrCommands:nil handler:nil];
+#pragma clang diagnostic pop
});
it(@"should not add the command", ^{
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLControlFramePayloadConstantsSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLControlFramePayloadConstantsSpec.m
index dba3e9a8b..480adbe27 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLControlFramePayloadConstantsSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLControlFramePayloadConstantsSpec.m
@@ -17,21 +17,28 @@ describe(@"Individual Enum Value Tests", ^ {
it(@"Should match internal values", ^ {
expect(SDLControlFrameInt32NotFound).to(equal(-1));
expect(SDLControlFrameInt64NotFound).to(equal(-1));
- expect(SDLControlFrameProtocolVersionKey).to(equal(@"protocolVersion"));
+
+ expect(SDLControlFrameAuthTokenKey).to(equal(@"authToken"));
+ expect(SDLControlFrameAudioServiceTransportsKey).to(equal(@"audioServiceTransports"));
expect(SDLControlFrameHashIdKey).to(equal(@"hashId"));
+ expect(SDLControlFrameHeightKey).to(equal(@"height"));
expect(SDLControlFrameMTUKey).to(equal(@"mtu"));
- expect(SDLControlFrameSecondaryTransportsKey).to(equal(@"secondaryTransports"));
- expect(SDLControlFrameAudioServiceTransportsKey).to(equal(@"audioServiceTransports"));
- expect(SDLControlFrameVideoServiceTransportsKey).to(equal(@"videoServiceTransports"));
- expect(SDLControlFrameAuthTokenKey).to(equal(@"authToken"));
- expect(SDLControlFrameRejectedParams).to(equal(@"rejectedParams"));
+ expect(SDLControlFrameProtocolVersionKey).to(equal(@"protocolVersion"));
expect(SDLControlFrameReasonKey).to(equal(@"reason"));
- expect(SDLControlFrameVideoProtocolKey).to(equal(@"videoProtocol"));
- expect(SDLControlFrameVideoCodecKey).to(equal(@"videoCodec"));
- expect(SDLControlFrameHeightKey).to(equal(@"height"));
- expect(SDLControlFrameWidthKey).to(equal(@"width"));
+ expect(SDLControlFrameRejectedParams).to(equal(@"rejectedParams"));
+ expect(SDLControlFrameSecondaryTransportsKey).to(equal(@"secondaryTransports"));
expect(SDLControlFrameTCPIPAddressKey).to(equal(@"tcpIpAddress"));
expect(SDLControlFrameTCPPortKey).to(equal(@"tcpPort"));
+ expect(SDLControlFrameVehicleHardwareVersionKey).to(equal(@"systemHardwareVersion"));
+ expect(SDLControlFrameVehicleMakeKey).to(equal(@"make"));
+ expect(SDLControlFrameVehicleModelKey).to(equal(@"model"));
+ expect(SDLControlFrameVehicleModelYearKey).to(equal(@"modelYear"));
+ expect(SDLControlFrameVehicleSoftwareVersionKey).to(equal(@"systemSoftwareVersion"));
+ expect(SDLControlFrameVehicleTrimKey).to(equal(@"trim"));
+ expect(SDLControlFrameVideoCodecKey).to(equal(@"videoCodec"));
+ expect(SDLControlFrameVideoProtocolKey).to(equal(@"videoProtocol"));
+ expect(SDLControlFrameVideoServiceTransportsKey).to(equal(@"videoServiceTransports"));
+ expect(SDLControlFrameWidthKey).to(equal(@"width"));
});
});
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
index 483033569..27de73b2a 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
@@ -10,8 +10,10 @@
#import <OCMock/OCMock.h>
#import "SDLTransportType.h"
+#import "SDLControlFramePayloadAudioStartServiceAck.h"
#import "SDLControlFramePayloadRegisterSecondaryTransportNak.h"
#import "SDLControlFramePayloadRPCStartServiceAck.h"
+#import "SDLControlFramePayloadVideoStartServiceAck.h"
#import "SDLGlobals.h"
#import "SDLProtocolHeader.h"
#import "SDLProtocol.h"
@@ -35,9 +37,9 @@ NSDictionary* dictionaryV1 = @{SDLRPCParameterNameRequest:
@{SDLRPCParameterNameCommandId:@55}}};
NSDictionary* dictionaryV2 = @{SDLRPCParameterNameCommandId:@55};
-describe(@"Send StartService Tests", ^ {
+describe(@"Send StartService Tests", ^{
context(@"Insecure", ^{
- it(@"Should send the correct data", ^ {
+ it(@"Should send the correct data", ^{
// Reset max protocol version before test. (This test case expects V1 header. If other test ran
// prior to this one, SDLGlobals would keep the max protocol version and this test case would fail.)
[SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = [SDLVersion versionWithString:@"1.0.0"];
@@ -100,7 +102,7 @@ describe(@"Send StartService Tests", ^ {
});
context(@"Secure", ^{
- it(@"Should send the correct data", ^ {
+ it(@"Should send the correct data", ^{
// TODO: How do we properly test the security? Assume a correct / fail?
// TODO: The security methods need to be split out to their own class so they can be public.
// Abstract Protocol needs to be combined into Protocol
@@ -108,9 +110,9 @@ describe(@"Send StartService Tests", ^ {
});
});
-describe(@"Send EndSession Tests", ^ {
- context(@"During V1 session", ^ {
- it(@"Should send the correct data", ^ {
+describe(@"Send EndSession Tests", ^{
+ context(@"During V1 session", ^{
+ it(@"Should send the correct data", ^{
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -137,8 +139,8 @@ describe(@"Send EndSession Tests", ^ {
});
});
- context(@"During V2 session", ^ {
- it(@"Should send the correct data", ^ {
+ context(@"During V2 session", ^{
+ it(@"Should send the correct data", ^{
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -166,8 +168,8 @@ describe(@"Send EndSession Tests", ^ {
});
});
-describe(@"Send Register Secondary Transport Tests", ^ {
- it(@"Should send the correct data", ^ {
+describe(@"Send Register Secondary Transport Tests", ^{
+ it(@"Should send the correct data", ^{
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -199,14 +201,14 @@ describe(@"Send Register Secondary Transport Tests", ^ {
});
});
-describe(@"SendRPCRequest Tests", ^ {
+describe(@"SendRPCRequest Tests", ^{
__block id mockRequest;
- beforeEach(^ {
+ beforeEach(^{
mockRequest = OCMPartialMock([[SDLRPCRequest alloc] init]);
});
- context(@"During V1 session", ^ {
- it(@"Should send the correct data", ^ {
+ context(@"During V1 session", ^{
+ it(@"Should send the correct data", ^{
[[[[mockRequest stub] andReturn:dictionaryV1] ignoringNonObjectArgs] serializeAsDictionary:1];
__block BOOL verified = NO;
@@ -241,8 +243,8 @@ describe(@"SendRPCRequest Tests", ^ {
});
});
- context(@"During V2 session", ^ {
- it(@"Should send the correct data bulk data when bulk data is available", ^ {
+ context(@"During V2 session", ^{
+ it(@"Should send the correct data bulk data when bulk data is available", ^{
[[[[mockRequest stub] andReturn:dictionaryV2] ignoringNonObjectArgs] serializeAsDictionary:2];
[[[mockRequest stub] andReturn:@0x98765] correlationID];
[[[mockRequest stub] andReturn:@"DeleteCommand"] name];
@@ -288,9 +290,9 @@ describe(@"SendRPCRequest Tests", ^ {
});
});
-describe(@"HandleBytesFromTransport Tests", ^ {
- context(@"During V1 session", ^ {
-// it(@"Should parse the data correctly", ^ {
+describe(@"HandleBytesFromTransport Tests", ^{
+ context(@"During V1 session", ^{
+// it(@"Should parse the data correctly", ^{
// id routerMock = OCMClassMock(SDLProtocolReceivedMessageRouter.class);
//
// //Override initialization methods so that our protocol will use our object instead
@@ -336,8 +338,8 @@ describe(@"HandleBytesFromTransport Tests", ^ {
// });
});
- context(@"During V2 session", ^ {
-// it(@"Should parse the data correctly", ^ {
+ context(@"During V2 session", ^{
+// it(@"Should parse the data correctly", ^{
// id routerMock = OCMClassMock(SDLProtocolReceivedMessageRouter.class);
//
// //Override initialization methods so that our protocol will use our object instead
@@ -395,12 +397,19 @@ describe(@"HandleBytesFromTransport Tests", ^ {
});
});
-describe(@"HandleProtocolSessionStarted tests", ^ {
+describe(@"HandleProtocolSessionStarted tests", ^{
__block id transportMock = nil;
__block SDLProtocol *testProtocol = nil;
__block id delegateMock = nil;
- __block int64_t testMTU = 989786483;
- __block int32_t hashId = 1545784;
+ int64_t testMTU = 989786483;
+ int32_t hashId = 1545784;
+ NSString *testAuthToken = @"testAuthToken";;
+ NSString *testMake = @"Livio";
+ NSString *testModel = @"Is";
+ NSString *testTrim = @"Awesome";
+ NSString *testModelYear = @"2021";
+ NSString *testSystemSoftwareVersion = @"1.1.1.1";
+ NSString *testSystemHardwareVersion = @"2.2.2.2";
beforeEach(^{
transportMock = OCMProtocolMock(@protocol(SDLTransportType));
@@ -413,15 +422,9 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
});
context(@"For protocol versions 5.0.0 and greater", ^{
- __block NSString *testAuthToken = nil;
-
- beforeEach(^{
- testAuthToken = @"testAuthToken";
- });
-
context(@"If the service type is RPC", ^{
- it(@"Should store the auth token and the protocol version and pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.2.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ it(@"Should store the auth token, system info, and the protocol version and pass the start service along to the delegate", ^{
+ SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.2.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:testMake model:testModel trim:testTrim modelYear:testModelYear systemSoftwareVersion:testSystemSoftwareVersion systemHardwareVersion:testSystemHardwareVersion];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -445,7 +448,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
});
it(@"Should store the protocol version, but not get the auth token, and pass the start service along to the delegate if the protocol version is greater than 5.0.0 but less than 5.2.0", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -463,13 +466,13 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
OCMVerifyAllWithDelay(delegateMock, 0.1);
- expect(testProtocol.authToken).to(beNil());
+ expect(testProtocol.authToken).to(equal(testAuthToken));
expect([SDLGlobals sharedGlobals].protocolVersion.stringVersion).to(equal(@"5.1.0"));
expect([SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion.stringVersion).to(equal(@"5.1.0"));
});
it(@"Should set the max head unit version using the header version if the protocol version is missing from the payload", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -495,7 +498,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"If the service type is control", ^{
it(@"Should just pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -522,7 +525,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"If the service type is Audio", ^{
it(@"Should just pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadAudioStartServiceAck *testPayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithMTU:testMTU];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -550,7 +553,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"If the service type is Video", ^{
it(@"Should just pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:testAuthToken protocolVersion:@"5.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadVideoStartServiceAck *testPayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:0 width:0 protocol:nil codec:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -580,7 +583,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"For protocol versions below 5.0.0", ^{
context(@"If the service type is RPC", ^{
it(@"Should store the protocol version and pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:@"3.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:@"3.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
@@ -605,7 +608,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"If the service type is not RPC", ^{
it(@"Should just pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:@"4.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:@"4.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:4];
@@ -630,7 +633,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"If the service type is Audio", ^{
it(@"Should just pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:@"4.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadAudioStartServiceAck *testPayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithMTU:testMTU];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:4];
@@ -656,7 +659,7 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
context(@"If the service type is Video", ^{
it(@"Should just pass the start service along to the delegate", ^{
- SDLControlFramePayloadRPCStartServiceAck *testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:hashId mtu:testMTU authToken:nil protocolVersion:@"4.1.0" secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ SDLControlFramePayloadVideoStartServiceAck *testPayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:0 width:0 protocol:nil codec:nil];
NSData *testData = testPayload.data;
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:4];
@@ -691,7 +694,7 @@ describe(@"HandleProtocolRegisterSecondaryTransport Tests", ^{
testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
});
- it(@"Should pass information along to delegate when ACKed", ^ {
+ it(@"Should pass information along to delegate when ACKed", ^{
id delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
@@ -711,7 +714,7 @@ describe(@"HandleProtocolRegisterSecondaryTransport Tests", ^{
OCMVerifyAllWithDelay(delegateMock, 0.1);
});
- it(@"Should pass information along to delegate when NAKed", ^ {
+ it(@"Should pass information along to delegate when NAKed", ^{
id delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
@@ -750,12 +753,12 @@ describe(@"HandleHeartbeatForSession Tests", ^{
[testProtocol handleHeartbeatForSession:0x44];
});
- it(@"Should pass information along to delegate", ^ {
+ it(@"Should pass information along to delegate", ^{
OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
-describe(@"OnProtocolMessageReceived Tests", ^ {
+describe(@"OnProtocolMessageReceived Tests", ^{
__block id transportMock = nil;
__block SDLProtocol *testProtocol = nil;
__block id delegateMock = nil;
@@ -776,12 +779,12 @@ describe(@"OnProtocolMessageReceived Tests", ^ {
[testProtocol protocol:testProtocol didReceiveMessage:testMessage];
});
- it(@"Should pass information along to delegate", ^ {
+ it(@"Should pass information along to delegate", ^{
OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
-describe(@"OnProtocolOpened Tests", ^ {
+describe(@"OnProtocolOpened Tests", ^{
__block id transportMock = nil;
__block SDLProtocol *testProtocol = nil;
__block id delegateMock = nil;
@@ -797,12 +800,12 @@ describe(@"OnProtocolOpened Tests", ^ {
[testProtocol onTransportConnected];
});
- it(@"Should pass information along to delegate", ^ {
+ it(@"Should pass information along to delegate", ^{
OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
-describe(@"OnProtocolClosed Tests", ^ {
+describe(@"OnProtocolClosed Tests", ^{
__block id transportMock = nil;
__block SDLProtocol *testProtocol = nil;
__block id delegateMock = nil;
@@ -818,7 +821,7 @@ describe(@"OnProtocolClosed Tests", ^ {
[testProtocol onTransportDisconnected];
});
- it(@"Should pass information along to delegate", ^ {
+ it(@"Should pass information along to delegate", ^{
OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m
index 63e927d5f..a1e94e896 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLControlFramePayloadRPCStartServiceAckSpec.m
@@ -9,136 +9,85 @@
QuickSpecBegin(SDLControlFramePayloadRPCStartServiceAckSpec)
-describe(@"Test encoding data", ^{
+describe(@"The payload", ^{
__block SDLControlFramePayloadRPCStartServiceAck *testPayload = nil;
- __block int32_t testHashId = 0;
- __block int64_t testMTU = 0;
- __block NSString *testProtocolVersion = nil;
- __block NSArray<NSString *> *testSecondaryTransports = nil;
- __block NSArray<NSNumber *> *testAudioServiceTransports = nil;
- __block NSArray<NSNumber *> *testVideoServiceTransports = nil;
-
- context(@"with parameters", ^{
- beforeEach(^{
- testHashId = 1457689;
- testMTU = 5984649;
- testProtocolVersion = @"1.32.32";
-
- testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:nil protocolVersion:testProtocolVersion secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
+ __block NSData *testData = nil;
+ int32_t testHashId = 1457689;
+ int64_t testMTU = 5984649;
+ NSString *testProtocolVersion = @"1.32.32";
+ NSString *testAuthToken = @"Test Auth Token";
+ NSArray<NSString *> *testSecondaryTransports = @[@"TCP_WIFI", @"IAP_USB"];
+ NSArray<NSNumber *> *testAudioServiceTransports = @[@(2)];
+ NSArray<NSNumber *> *testVideoServiceTransports = @[@2, @1];
+ NSString *testMake = @"Livio";
+ NSString *testModel = @"Is";
+ NSString *testTrim = @"Awesome";
+ NSString *testModelYear = @"2021";
+ NSString *testSystemSoftwareVersion = @"1.1.1.1";
+ NSString *testSystemHardwareVersion = @"2.2.2.2";
+
+ describe(@"Test encoding data", ^{
+ context(@"with parameters", ^{
+ beforeEach(^{
+ testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:testAuthToken protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:testMake model:testModel trim:testTrim modelYear:testModelYear systemSoftwareVersion:testSystemSoftwareVersion systemHardwareVersion:testSystemHardwareVersion];
+ });
+
+ it(@"should create the correct data", ^{
+ NSString *base64Encoded = [testPayload.data base64EncodedStringWithOptions:0];
+ expect(base64Encoded).to(equal(@"bAEAAAR2aWRlb1NlcnZpY2VUcmFuc3BvcnRzABMAAAAQMAACAAAAEDEAAQAAAAAQaGFzaElkABk+FgACbW9kZWwAAwAAAElzABJtdHUAiVFbAAAAAAACbW9kZWxZZWFyAAUAAAAyMDIxAAJzeXN0ZW1IYXJkd2FyZVZlcnNpb24ACAAAADIuMi4yLjIAAm1ha2UABgAAAExpdmlvAAJhdXRoVG9rZW4AEAAAAFRlc3QgQXV0aCBUb2tlbgAEc2Vjb25kYXJ5VHJhbnNwb3J0cwAkAAAAAjAACQAAAFRDUF9XSUZJAAIxAAgAAABJQVBfVVNCAAACc3lzdGVtU29mdHdhcmVWZXJzaW9uAAgAAAAxLjEuMS4xAAJ0cmltAAgAAABBd2Vzb21lAARhdWRpb1NlcnZpY2VUcmFuc3BvcnRzAAwAAAAQMAACAAAAAAJwcm90b2NvbFZlcnNpb24ACAAAADEuMzIuMzIAAA=="));
+ });
});
- it(@"should create the correct data", ^{
- NSString *base64Encoded = [testPayload.data base64EncodedStringWithOptions:0];
- expect(base64Encoded).to(equal(@"OwAAABBoYXNoSWQAGT4WABJtdHUAiVFbAAAAAAACcHJvdG9jb2xWZXJzaW9uAAgAAAAxLjMyLjMyAAA="));
- });
- });
+ context(@"without parameters", ^{
+ beforeEach(^{
+ testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:SDLControlFrameInt32NotFound mtu:SDLControlFrameInt64NotFound authToken:nil protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
+ });
- context(@"with secondary transport parameters", ^{
- beforeEach(^{
- testHashId = 987654;
- testMTU = 4096;
- testProtocolVersion = @"5.10.01";
- testSecondaryTransports = @[@"TCP_WIFI", @"IAP_USB"];
- testAudioServiceTransports = @[@(2)];
- testVideoServiceTransports = @[(@2), @(1)];
-
- testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
- });
-
- it(@"should create the correct data", ^{
- NSString *base64Encoded = [testPayload.data base64EncodedStringWithOptions:0];
- expect(base64Encoded).to(equal(@"wwAAAAR2aWRlb1NlcnZpY2VUcmFuc3BvcnRzABMAAAAQMAACAAAAEDEAAQAAAAAQaGFzaElkAAYSDwASbXR1AAAQAAAAAAAABHNlY29uZGFyeVRyYW5zcG9ydHMAJAAAAAIwAAkAAABUQ1BfV0lGSQACMQAIAAAASUFQX1VTQgAABGF1ZGlvU2VydmljZVRyYW5zcG9ydHMADAAAABAwAAIAAAAAAnByb3RvY29sVmVyc2lvbgAIAAAANS4xMC4wMQAA"));
+ it(@"should create no data", ^{
+ expect(testPayload.data.length).to(equal(0));
+ });
});
});
- context(@"without parameters", ^{
- beforeEach(^{
- testHashId = SDLControlFrameInt32NotFound;
- testMTU = SDLControlFrameInt64NotFound;
-
- testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:nil protocolVersion:nil secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
- });
-
- it(@"should create no data", ^{
- expect(testPayload.data.length).to(equal(0));
+ describe(@"Test decoding data", ^{
+ context(@"with parameters", ^{
+ beforeEach(^{
+ SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:testAuthToken protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:testMake model:testModel trim:testTrim modelYear:testModelYear systemSoftwareVersion:testSystemSoftwareVersion systemHardwareVersion:testSystemHardwareVersion];
+ testData = firstPayload.data;
+
+ testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:testData];
+ });
+
+ it(@"should output the correct params", ^{
+ expect(testPayload.hashId).to(equal(testHashId));
+ expect(testPayload.mtu).to(equal(testMTU));
+ expect(testPayload.authToken).to(equal(testAuthToken));
+ expect(testPayload.protocolVersion).to(equal(testProtocolVersion));
+ expect(testPayload.secondaryTransports).to(equal(testSecondaryTransports));
+ expect(testPayload.audioServiceTransports).to(equal(testAudioServiceTransports));
+ expect(testPayload.videoServiceTransports).to(equal(testVideoServiceTransports));
+ expect(testPayload.make).to(equal(testMake));
+ expect(testPayload.model).to(equal(testModel));
+ expect(testPayload.trim).to(equal(testTrim));
+ expect(testPayload.modelYear).to(equal(testModelYear));
+ expect(testPayload.systemSoftwareVersion).to(equal(testSystemSoftwareVersion));
+ expect(testPayload.systemHardwareVersion).to(equal(testSystemHardwareVersion));
+ });
});
});
-});
-
-describe(@"Test decoding data", ^{
- __block SDLControlFramePayloadRPCStartServiceAck *testPayload = nil;
- __block NSData *testData = nil;
- __block int32_t testHashId = 0;
- __block int64_t testMTU = 0;
- __block NSString *testAuthToken = nil;
- __block NSString *testProtocolVersion = nil;
- __block NSArray<NSString *> *testSecondaryTransports = nil;
- __block NSArray<NSNumber *> *testAudioServiceTransports = nil;
- __block NSArray<NSNumber *> *testVideoServiceTransports = nil;
-
- context(@"with parameters", ^{
- beforeEach(^{
- testHashId = 1545784;
- testMTU = 989786483;
- testAuthToken = @"testAuthToken";
- testProtocolVersion = @"3.89.5";
- SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:testAuthToken protocolVersion:testProtocolVersion secondaryTransports:nil audioServiceTransports:nil videoServiceTransports:nil];
- testData = firstPayload.data;
+ describe(@"Test nil data", ^{
+ __block SDLControlFramePayloadRPCStartServiceAck *testPayload = nil;
+ __block NSData *testData = nil;
- testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:testData];
- });
-
- it(@"should output the correct params", ^{
- expect(testPayload.hashId).to(equal(testHashId));
- expect(testPayload.mtu).to(equal(testMTU));
- expect(testPayload.authToken).to(equal(testAuthToken));
- expect(testPayload.protocolVersion).to(equal(testProtocolVersion));
- expect(testPayload.secondaryTransports).to(beNil());
- expect(testPayload.audioServiceTransports).to(beNil());
- expect(testPayload.videoServiceTransports).to(beNil());
- });
- });
-
- context(@"with secondary transport parameters", ^{
beforeEach(^{
- testHashId = 17999024;
- testMTU = 1798250;
- testAuthToken = @"testAuthToken";
- testProtocolVersion = @"6.01.00";
- testSecondaryTransports = @[@"TCP_WIFI"];
- testAudioServiceTransports = @[@(2), @(1)];
- testVideoServiceTransports = @[@(1)];
-
- SDLControlFramePayloadRPCStartServiceAck *firstPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMTU authToken:testAuthToken protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
- testData = firstPayload.data;
-
testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:testData];
});
it(@"should output the correct params", ^{
- expect(testPayload.hashId).to(equal(testHashId));
- expect(testPayload.mtu).to(equal(testMTU));
- expect(testPayload.authToken).to(equal(testAuthToken));
- expect(testPayload.protocolVersion).to(equal(testProtocolVersion));
- expect(testPayload.secondaryTransports).to(equal(testSecondaryTransports));
- expect(testPayload.audioServiceTransports).to(equal(testAudioServiceTransports));
- expect(testPayload.videoServiceTransports).to(equal(testVideoServiceTransports));
+ expect(testPayload.data.length).to(equal(0));
});
});
});
-describe(@"Test nil data", ^{
- __block SDLControlFramePayloadRPCStartServiceAck *testPayload = nil;
- __block NSData *testData = nil;
-
- beforeEach(^{
- testPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithData:testData];
- });
-
- it(@"should output the correct params", ^{
- expect(testPayload.data.length).to(equal(0));
- });
-});
-
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m
index b47292f55..9c13b667a 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLFunctionIDSpec.m
@@ -91,6 +91,7 @@ describe(@"GetFunctionName Tests", ^ {
expect([functionID functionNameForId:32787]).to(equal(SDLRPCFunctionNameOnSystemCapabilityUpdated));
expect([functionID functionNameForId:32789]).to(equal(SDLRPCFunctionNameOnUpdateFile));
expect([functionID functionNameForId:32790]).to(equal(SDLRPCFunctionNameOnUpdateSubMenu));
+ expect([functionID functionNameForId:32791]).to(equal(SDLRPCFunctionNameOnAppCapabilityUpdated));
//Not listed in Spec
#pragma clang diagnostic push
@@ -178,6 +179,7 @@ describe(@"GetFunctionID Tests", ^ {
expect([functionID functionIdForName:SDLRPCFunctionNameOnRCStatus]).to(equal(@32785));
expect([functionID functionIdForName:SDLRPCFunctionNameOnAppServiceData]).to(equal(@32786));
expect([functionID functionIdForName:SDLRPCFunctionNameOnSystemCapabilityUpdated]).to(equal(@32787));
+ expect([functionID functionIdForName:SDLRPCFunctionNameOnAppCapabilityUpdated]).to(equal(32791));
//Not listed in Spec
#pragma clang diagnostic push
diff --git a/SmartDeviceLinkTests/ProxySpecs/SDLHapticManagerSpec.m b/SmartDeviceLinkTests/ProxySpecs/SDLHapticManagerSpec.m
index cec23d2ee..abbd49643 100644
--- a/SmartDeviceLinkTests/ProxySpecs/SDLHapticManagerSpec.m
+++ b/SmartDeviceLinkTests/ProxySpecs/SDLHapticManagerSpec.m
@@ -21,20 +21,25 @@
#import "SDLTouch.h"
#import "TestHapticRectViewController.h"
+static inline BOOL floatEqual(const float f1, const float f2) {
+ return fabsf(f1 - f2) < 0.01;
+}
+
BOOL compareRectangle(SDLRectangle *sdlRectangle, CGRect cgRect) {
- expect(sdlRectangle.x).to(equal(cgRect.origin.x));
- expect(sdlRectangle.y).to(equal(cgRect.origin.y));
- expect(sdlRectangle.width).to(equal(cgRect.size.width));
- expect(sdlRectangle.height).to(equal(cgRect.size.height));
- return YES;
+ return floatEqual(sdlRectangle.x.floatValue, cgRect.origin.x) &&
+ floatEqual(sdlRectangle.y.floatValue, cgRect.origin.y) &&
+ floatEqual(sdlRectangle.width.floatValue, cgRect.size.width) &&
+ floatEqual(sdlRectangle.height.floatValue, cgRect.size.height);
}
BOOL compareScaledRectangle(SDLRectangle *sdlRectangle, CGRect cgRect, float scale) {
- expect(sdlRectangle.x).to(equal(cgRect.origin.x * scale));
- expect(sdlRectangle.y).to(equal(cgRect.origin.y * scale));
- expect(sdlRectangle.width).to(equal(cgRect.size.width * scale));
- expect(sdlRectangle.height).to(equal(cgRect.size.height * scale));
- return YES;
+ if (scale < 1.0) {
+ scale = 1.0;
+ }
+ return floatEqual(sdlRectangle.x.floatValue, cgRect.origin.x * scale) &&
+ floatEqual(sdlRectangle.y.floatValue, cgRect.origin.y * scale) &&
+ floatEqual(sdlRectangle.width.floatValue, cgRect.size.width * scale) &&
+ floatEqual(sdlRectangle.height.floatValue, cgRect.size.height * scale);
}
@interface SDLFocusableItemLocator ()
@@ -58,10 +63,13 @@ describe(@"the haptic manager", ^{
__block CGRect viewRect2;
beforeEach(^{
- uiWindow = [[UIWindow alloc] init];
+ const CGRect frame = CGRectMake(0, 0, 320, 480);
testHapticRectViewController = [[TestHapticRectViewController alloc] init];
+ testHapticRectViewController.view.frame = frame;
+ uiWindow = [[UIWindow alloc] initWithFrame:frame];
uiWindow.rootViewController = testHapticRectViewController;
+
sdlLifecycleManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
hapticManager = nil;
@@ -139,7 +147,7 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect = hapticRectData[0];
SDLRectangle *sdlRect = sdlhapticRect.rect;
- compareRectangle(sdlRect, viewRect1);
+ expect(compareRectangle(sdlRect, viewRect1)).to(beTrue());
}
});
});
@@ -172,7 +180,7 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect = hapticRectData[0];
SDLRectangle *sdlRect = sdlhapticRect.rect;
- compareRectangle(sdlRect, viewRect1);
+ expect(compareRectangle(sdlRect, viewRect1)).to(beTrue());
}
});
});
@@ -216,24 +224,26 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect2 = hapticRectData[1];
SDLRectangle *sdlRect2 = sdlhapticRect2.rect;
- compareRectangle(sdlRect1, viewRect2);
- compareRectangle(sdlRect2, viewRect1);
+ expect(compareRectangle(sdlRect1, viewRect2)).to(beTrue());
+ expect(compareRectangle(sdlRect2, viewRect1)).to(beTrue());
}
});
});
context(@"when initialized with nested views", ^{
beforeEach(^{
- UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(101, 101, 50, 50)];
- [testHapticRectViewController.view addSubview:textField];
+ UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(101, 101, 50, 50)];
+ [testHapticRectViewController.view addSubview:containerView];
viewRect1 = CGRectMake(110, 110, 10, 10);
UITextField *textField1 = [[UITextField alloc] initWithFrame:viewRect1];
- [textField addSubview:textField1];
+ textField1.text = @"B";
+ [containerView addSubview:textField1];
viewRect2 = CGRectMake(130, 130, 10, 10);
UITextField *textField2 = [[UITextField alloc] initWithFrame:viewRect2];
- [textField addSubview:textField2];
+ textField2.text = @"C";
+ [containerView addSubview:textField2];
hapticManager = [[SDLFocusableItemLocator alloc] initWithViewController:testHapticRectViewController connectionManager:sdlLifecycleManager videoScaleManager:sdlStreamingVideoScaleManager];
hapticManager.enableHapticDataRequests = YES;
@@ -249,7 +259,7 @@ describe(@"the haptic manager", ^{
return YES;
}] withResponseHandler:[OCMArg any]]);
- int expectedCount = 2;
+ const int expectedCount = 2;
expect(sentHapticRequest.hapticRectData.count).to(equal(expectedCount));
if(sentHapticRequest.hapticRectData.count == expectedCount) {
@@ -260,24 +270,26 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect2 = hapticRectData[1];
SDLRectangle *sdlRect2 = sdlhapticRect2.rect;
- compareRectangle(sdlRect1, viewRect1);
- compareRectangle(sdlRect2, viewRect2);
+ expect(compareRectangle(sdlRect1, viewRect1)).to(beTrue());
+ expect(compareRectangle(sdlRect2, viewRect2)).to(beTrue());
}
});
});
context(@"when initialized with nested button views", ^{
beforeEach(^{
- UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(101, 101, 50, 50)];
- [testHapticRectViewController.view addSubview:button];
+ UIView *boxView = [[UIView alloc] initWithFrame:CGRectMake(101, 101, 50, 50)];
+ [testHapticRectViewController.view addSubview:boxView];
viewRect1 = CGRectMake(110, 110, 10, 10);
UIButton *button1 = [[UIButton alloc] initWithFrame:viewRect1];
- [button addSubview:button1];
+ [button1 setTitle:@"B" forState:UIControlStateNormal];
+ [boxView addSubview:button1];
viewRect2 = CGRectMake(130, 130, 10, 10);
UITextField *textField2 = [[UITextField alloc] initWithFrame:viewRect2];
- [button addSubview:textField2];
+ textField2.text = @"C";
+ [boxView addSubview:textField2];
hapticManager = [[SDLFocusableItemLocator alloc] initWithViewController:testHapticRectViewController connectionManager:sdlLifecycleManager videoScaleManager:sdlStreamingVideoScaleManager];
hapticManager.enableHapticDataRequests = YES;
@@ -293,7 +305,7 @@ describe(@"the haptic manager", ^{
return YES;
}] withResponseHandler:[OCMArg any]]);
- int expectedCount = 2;
+ const int expectedCount = 2;
expect(sentHapticRequest.hapticRectData.count).to(equal(expectedCount));
if(sentHapticRequest.hapticRectData.count == expectedCount) {
@@ -304,8 +316,8 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect2 = hapticRectData[1];
SDLRectangle *sdlRect2 = sdlhapticRect2.rect;
- compareRectangle(sdlRect1, viewRect1);
- compareRectangle(sdlRect2, viewRect2);
+ expect(compareRectangle(sdlRect1, viewRect1)).to(beTrue());
+ expect(compareRectangle(sdlRect2, viewRect2)).to(beTrue());
}
});
});
@@ -346,7 +358,7 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect = hapticRectData[0];
SDLRectangle *sdlRect = sdlhapticRect.rect;
- compareRectangle(sdlRect, viewRect1);
+ expect(compareRectangle(sdlRect, viewRect1)).to(beTrue());
}
});
});
@@ -391,13 +403,14 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect1 = hapticRectData[0];
SDLRectangle *sdlRect1 = sdlhapticRect1.rect;
- compareRectangle(sdlRect1, viewRect1);
+ expect(compareRectangle(sdlRect1, viewRect1)).to(beTrue());
}
});
});
context(@"when started", ^{
beforeEach(^{
+ [hapticManager stop]; // stop it, just in case
[hapticManager start];
[[NSNotificationCenter defaultCenter] postNotificationName:SDLDidUpdateProjectionView object:nil];
});
@@ -414,8 +427,8 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect2 = hapticRectData[1];
SDLRectangle *sdlRect2 = sdlhapticRect2.rect;
- compareRectangle(sdlRect1, viewRect2);
- compareRectangle(sdlRect2, viewRect1);
+ expect(compareRectangle(sdlRect1, viewRect2)).to(beTrue());
+ expect(compareRectangle(sdlRect2, viewRect1)).to(beTrue());
}
});
@@ -459,9 +472,11 @@ describe(@"the haptic manager", ^{
context(@"when touched in overlapping views' area", ^{
beforeEach(^{
UITextField *textField1 = [[UITextField alloc] initWithFrame:CGRectMake(101, 101, 50, 50)];
+ textField1.text = @"A";
[testHapticRectViewController.view addSubview:textField1];
UITextField *textField2 = [[UITextField alloc] initWithFrame:CGRectMake(126, 126, 50, 50)];
+ textField2.text = @"B";
[testHapticRectViewController.view addSubview:textField2];
hapticManager = [[SDLFocusableItemLocator alloc] initWithViewController:testHapticRectViewController connectionManager:sdlLifecycleManager videoScaleManager:sdlStreamingVideoScaleManager];
@@ -470,8 +485,11 @@ describe(@"the haptic manager", ^{
});
it(@"should return no view object", ^{
- UIView* view = [hapticManager viewForPoint:CGPointMake(130, 130)];
- expect(view).to(beNil());
+ const CGPoint pt = CGPointMake(80, 90);
+ UIView *view = [hapticManager viewForPoint:pt];
+ if (view) {
+ failWithMessage(([NSString stringWithFormat:@"found view %@ at point %@", view, NSStringFromCGPoint(pt)]));
+ }
});
});
@@ -492,9 +510,11 @@ describe(@"the haptic manager", ^{
describe(@"scaling", ^{
__block float testUpdatedScale = 0.0;
- __block CGSize testScreenSize = testHapticRectViewController.view.frame.size;
+ __block CGSize testScreenSize = CGSizeZero;
beforeEach(^{
+ testScreenSize = testHapticRectViewController.view.frame.size;
+
viewRect1 = CGRectMake(320, 600, 100, 100);
UIButton *button = [[UIButton alloc] initWithFrame:viewRect1];
[testHapticRectViewController.view addSubview:button];
@@ -521,7 +541,7 @@ describe(@"the haptic manager", ^{
return YES;
}] withResponseHandler:[OCMArg any]]);
- int expectedCount = 1;
+ const int expectedCount = 1;
expect(sentHapticRequest.hapticRectData.count).to(equal(expectedCount));
if(sentHapticRequest.hapticRectData.count == expectedCount) {
@@ -529,7 +549,9 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect = hapticRectData[0];
SDLRectangle *sdlRect = sdlhapticRect.rect;
- compareScaledRectangle(sdlRect, viewRect1, testUpdatedScale);
+ if (!compareScaledRectangle(sdlRect, viewRect1, testUpdatedScale)) {
+ failWithMessage(([NSString stringWithFormat:@"rects are not equal (%@ vs %@)", sdlRect, NSStringFromCGRect(viewRect1)]));
+ }
}
});
});
@@ -550,7 +572,7 @@ describe(@"the haptic manager", ^{
return YES;
}] withResponseHandler:[OCMArg any]]);
- int expectedCount = 1;
+ const int expectedCount = 1;
expect(sentHapticRequest.hapticRectData.count).to(equal(expectedCount));
if(sentHapticRequest.hapticRectData.count == expectedCount) {
@@ -558,7 +580,9 @@ describe(@"the haptic manager", ^{
SDLHapticRect *sdlhapticRect = hapticRectData[0];
SDLRectangle *sdlRect = sdlhapticRect.rect;
- compareScaledRectangle(sdlRect, viewRect1, 1.0);
+ if (!compareScaledRectangle(sdlRect, viewRect1, testUpdatedScale)) {
+ failWithMessage(([NSString stringWithFormat:@"rects are not equal {%@ vs %@} scale:%2.2f", sdlRect, NSStringFromCGRect(viewRect1), testUpdatedScale]));
+ }
}
});
});
diff --git a/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m b/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m
index b7279a352..9b424cc27 100644
--- a/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m
+++ b/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m
@@ -248,7 +248,7 @@ describe(@"the secondary transport manager ", ^{
testAudioServiceTransports = @[@(2), @(1)];
testVideoServiceTransports = @[@(2)];
- testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
+ testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
});
@@ -274,7 +274,7 @@ describe(@"the secondary transport manager ", ^{
// Note: this is not allowed for now. It should contain only one element.
testSecondaryTransports = @[@"TCP_WIFI", @"IAP_USB_HOST_MODE"];
- testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
+ testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
});
@@ -299,7 +299,7 @@ describe(@"the secondary transport manager ", ^{
testAudioServiceTransports = @[@(2)];
testVideoServiceTransports = @[@(2)];
- testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
+ testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
});
@@ -320,7 +320,7 @@ describe(@"the secondary transport manager ", ^{
context(@"without secondary transport related parameter", ^{
beforeEach(^{
- testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
+ testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
});
@@ -411,7 +411,7 @@ describe(@"the secondary transport manager ", ^{
testTransportEventUpdatePayload = [[SDLControlFramePayloadTransportEventUpdate alloc] initWithTcpIpAddress:testTcpIpAddress tcpPort:testTcpPort];
testTransportEventUpdateMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testTransportEventUpdateHeader andPayload:testTransportEventUpdatePayload.data];
- testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
+ testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
manager.currentHMILevel = SDLHMILevelFull;
manager.currentApplicationState = UIApplicationStateActive;
@@ -450,7 +450,7 @@ describe(@"the secondary transport manager ", ^{
testTransportEventUpdatePayload = [[SDLControlFramePayloadTransportEventUpdate alloc] initWithTcpIpAddress:testTcpIpAddress tcpPort:testTcpPort];
testTransportEventUpdateMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testTransportEventUpdateHeader andPayload:testTransportEventUpdatePayload.data];
- testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
+ testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports make:nil model:nil trim:nil modelYear:nil systemSoftwareVersion:nil systemHardwareVersion:nil];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
});
@@ -726,13 +726,9 @@ describe(@"the secondary transport manager ", ^{
OCMExpect([testStreamingProtocolDelegate transportClosed]);
- // Wait for the timer to elapse
- float waitTime = RegisterTransportTime;
- NSLog(@"Please wait for register transport timer to elapse... (for %.02f seconds)", waitTime);
- [NSThread sleepForTimeInterval:waitTime];
+ [NSThread sleepForTimeInterval:RegisterTransportTime]; // This still needs to be here to ensure that the Verify happens correctly
OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
-
expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
});
@@ -743,12 +739,7 @@ describe(@"the secondary transport manager ", ^{
[testSecondaryProtocolMock onTransportConnected];
- // Wait for the timer to elapse
- float waitTime = RegisterTransportTime;
- NSLog(@"Please wait for register transport timer to elapse... (for %.02f seconds)", waitTime);
- [NSThread sleepForTimeInterval:waitTime];
-
- expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ expect(manager.stateMachine.currentState).withTimeout(3.0).toEventually(equal(SDLSecondaryTransportStateReconnecting));
});
});
});
@@ -1011,12 +1002,7 @@ describe(@"the secondary transport manager ", ^{
[manager.stateMachine setToState:SDLSecondaryTransportStateReconnecting fromOldState:nil callEnterTransition:YES];
});
- // wait for the timer
- float waitTime = RetryConnectionDelay;
- NSLog(@"Please wait for reconnection timeout... (for %.02f seconds)", waitTime);
- [NSThread sleepForTimeInterval:waitTime];
-
- expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ expect(manager.stateMachine.currentState).withTimeout(RetryConnectionDelay + 3.0).toEventually(equal(SDLSecondaryTransportStateConfigured));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppCapabilityTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppCapabilityTypeSpec.m
new file mode 100644
index 000000000..f00f8f2af
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppCapabilityTypeSpec.m
@@ -0,0 +1,21 @@
+//
+// SDLAppCapabilityTypeSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAppCapabilityType.h"
+
+
+QuickSpecBegin(SDLAppCapabilityTypeSpec)
+
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
+ expect(SDLAppCapabilityTypeVideoStreaming).to(equal(@"VIDEO_STREAMING"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLDoorStatusTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLDoorStatusTypeSpec.m
new file mode 100644
index 000000000..04a16c159
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLDoorStatusTypeSpec.m
@@ -0,0 +1,24 @@
+//
+// SDLDoorStatusTypeSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDoorStatusType.h"
+
+QuickSpecBegin(SDLDoorStatusTypeSpec)
+
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
+ expect(SDLDoorStatusTypeClosed).to(equal(@"CLOSED"));
+ expect(SDLDoorStatusTypeLocked).to(equal(@"LOCKED"));
+ expect(SDLDoorStatusTypeAjar).to(equal(@"AJAR"));
+ expect(SDLDoorStatusTypeRemoved).to(equal(@"REMOVED"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLImageFieldNameSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLImageFieldNameSpec.m
index 6363714eb..f3a539e71 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLImageFieldNameSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLImageFieldNameSpec.m
@@ -29,6 +29,8 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLImageFieldNameLocationImage).to(equal(@"locationImage"));
expect(SDLImageFieldNameSubMenuIcon).to(equal(@"subMenuIcon"));
expect(SDLImageFieldNameSubtleAlertIcon).to(equal(@"subtleAlertIcon"));
+ expect(SDLImageFieldNameMenuCommandSecondaryImage).to(equal(@"menuCommandSecondaryImage"));
+ expect(SDLImageFieldNameMenuSubMenuSecondaryImage).to(equal(@"menuSubMenuSecondaryImage"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m
index ce2782d3f..d47e87d4c 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m
@@ -12,13 +12,15 @@
QuickSpecBegin(SDLKeyboardEventSpec)
-describe(@"Individual Enum Value Tests", ^ {
- it(@"Should match internal values", ^ {
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
expect(SDLKeyboardEventKeypress).to(equal(@"KEYPRESS"));
expect(SDLKeyboardEventSubmitted).to(equal(@"ENTRY_SUBMITTED"));
expect(SDLKeyboardEventCancelled).to(equal(@"ENTRY_CANCELLED"));
expect(SDLKeyboardEventAborted).to(equal(@"ENTRY_ABORTED"));
expect(SDLKeyboardEventVoice).to(equal(@"ENTRY_VOICE"));
+ expect(SDLKeyboardEventInputKeyMaskEnabled).to(equal(@"INPUT_KEY_MASK_ENABLED"));
+ expect(SDLKeyboardEventInputKeyMaskDisabled).to(equal(@"INPUT_KEY_MASK_DISABLED"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m
new file mode 100644
index 000000000..dd7bd708e
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m
@@ -0,0 +1,23 @@
+//
+// SDLAppHMITypeSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLKeyboardInputMask.h"
+
+QuickSpecBegin(SDLKeyboardInputMaskSpec)
+
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
+ expect(SDLKeyboardInputMaskEnableInputKeyMask).to(equal(@"ENABLE_INPUT_KEY_MASK"));
+ expect(SDLKeyboardInputMaskDisableInputKeyMask).to(equal(@"DISABLE_INPUT_KEY_MASK"));
+ expect(SDLKeyboardInputMaskUserChoiceInputKeyMask).to(equal(@"USER_CHOICE_INPUT_KEY_MASK"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m
index ec0298852..d254c9d06 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m
@@ -12,11 +12,12 @@
QuickSpecBegin(SDLKeyboardLayoutSpec)
-describe(@"Individual Enum Value Tests", ^ {
- it(@"Should match internal values", ^ {
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
expect(SDLKeyboardLayoutQWERTY).to(equal(@"QWERTY"));
expect(SDLKeyboardLayoutQWERTZ).to(equal(@"QWERTZ"));
expect(SDLKeyboardLayoutAZERTY).to(equal(@"AZERTY"));
+ expect(SDLKeyboardLayoutNumeric).to(equal(@"NUMERIC"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSeekIndicatorTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSeekIndicatorTypeSpec.m
new file mode 100644
index 000000000..fd5d06c25
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSeekIndicatorTypeSpec.m
@@ -0,0 +1,23 @@
+//
+// SDLSeekIndicatorTypeSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Frank Elias on 12/4/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLSeekIndicatorType.h"
+
+QuickSpecBegin(SDLSeekIndicatorTypeSpec)
+
+describe(@"Individual Enum Value Tests", ^{
+ it(@"Should match internal values", ^{
+ expect(SDLSeekIndicatorTypeTrack).to(equal(@"TRACK"));
+ expect(SDLSeekIndicatorTypeTime).to(equal(@"TIME"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m
index 786ecc7c6..dfab2e81a 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLStaticIconNameSpec.m
@@ -25,7 +25,11 @@ describe(@"Individual Enum Value Tests", ^{
expect(SDLStaticIconNameAudioMute).to(equal(@"0x12"));
expect(SDLStaticIconNameAudiobookEpisode).to(equal(@"0x83"));
expect(SDLStaticIconNameAudiobookNarrator).to(equal(@"0x82"));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(SDLStaticIconNameAuxillaryAudio).to(equal(@"0x45"));
+#pragma clang diagnostic pop
+ expect(SDLStaticIconNameAuxiliaryAudio).to(equal(@"0x45"));
expect(SDLStaticIconNameBack).to(equal(@"0x86"));
expect(SDLStaticIconNameBatteryCapacity0Of5).to(equal(@"0xF7"));
expect(SDLStaticIconNameBatteryCapacity1Of5).to(equal(@"0xF8"));
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTextFieldNameSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTextFieldNameSpec.m
index 8f4b698fa..b9827e75c 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTextFieldNameSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLTextFieldNameSpec.m
@@ -20,7 +20,10 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLTextFieldNameMainField4).to(equal(@"mainField4"));
expect(SDLTextFieldNameTemplateTitle).to(equal(@"templateTitle"));
expect(SDLTextFieldNameStatusBar).to(equal(@"statusBar"));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(SDLTextFieldNameMediaClock).to(equal(@"mediaClock"));
+#pragma clang diagnostic pop
expect(SDLTextFieldNameMediaTrack).to(equal(@"mediaTrack"));
expect(SDLTextFieldNameAlertText1).to(equal(@"alertText1"));
expect(SDLTextFieldNameAlertText2).to(equal(@"alertText2"));
@@ -46,6 +49,12 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLTextFieldNameSubtleAlertText1).to(equal(@"subtleAlertText1"));
expect(SDLTextFieldNameSubtleAlertText2).to(equal(@"subtleAlertText2"));
expect(SDLTextFieldNameSubtleAlertSoftButtonText).to(equal("subtleAlertSoftButtonText"));
+ expect(SDLTextFieldNameTimeToDestination).to(equal(@"timeToDestination"));
+ expect(SDLTextFieldNameTurnText).to(equal(@"turnText"));
+ expect(SDLTextFieldNameMenuCommandSecondaryText).to(equal(@"menuCommandSecondaryText"));
+ expect(SDLTextFieldNameMenuCommandTertiaryText).to(equal(@"menuCommandTertiaryText"));
+ expect(SDLTextFieldNameMenuSubMenuSecondaryText).to(equal(@"menuSubMenuSecondaryText"));
+ expect(SDLTextFieldNameMenuSubMenuTertiaryText).to(equal(@"menuSubMenuTertiaryText"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
index f897b1d22..e1ff34a0f 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
@@ -26,7 +26,10 @@ describe(@"individual enum value tests", ^{
expect(SDLVehicleDataTypeEmergencyEvent).to(equal(@"VEHICLEDATA_EMERGENCYEVENT"));
expect(SDLVehicleDataTypeEngineOilLife).to(equal(@"VEHICLEDATA_ENGINEOILLIFE"));
expect(SDLVehicleDataTypeEngineTorque).to(equal(@"VEHICLEDATA_ENGINETORQUE"));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(SDLVehicleDataTypeExternalTemperature).to(equal(@"VEHICLEDATA_EXTERNTEMP"));
+#pragma clang diagnostic pop
expect(SDLVehicleDataTypeFuelConsumption).to(equal(@"VEHICLEDATA_FUELCONSUMPTION"));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -50,6 +53,8 @@ describe(@"individual enum value tests", ^{
expect(SDLVehicleDataTypeSteeringWheel).to(equal(@"VEHICLEDATA_STEERINGWHEEL"));
expect(SDLVehicleDataTypeTirePressure).to(equal(@"VEHICLEDATA_TIREPRESSURE"));
expect(SDLVehicleDataTypeTurnSignal).to(equal(@"VEHICLEDATA_TURNSIGNAL"));
+ expect(SDLVehicleDataTypeVehicleDataClimateData).to(equal(@"VEHICLEDATA_CLIMATEDATA"));
+ expect(SDLVehicleDataTypeSeatOccupancy).to(equal(@"VEHICLEDATA_SEATOCCUPANCY"));
expect(SDLVehicleDataTypeVIN).to(equal(@"VEHICLEDATA_VIN"));
expect(SDLVehicleDataTypeWindowStatus).to(equal(@"VEHICLEDATA_WINDOWSTATUS"));
expect(SDLVehicleDataTypeWiperStatus).to(equal(@"VEHICLEDATA_WIPERSTATUS"));
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppCapabilityUpdatedSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppCapabilityUpdatedSpec.m
new file mode 100644
index 000000000..bcac73dfa
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppCapabilityUpdatedSpec.m
@@ -0,0 +1,80 @@
+//
+// SDLOnAppCapabilityUpdatedSpec.m
+// SmartDeviceLink
+
+#import <Foundation/Foundation.h>
+#import <Nimble/Nimble.h>
+#import <Quick/Quick.h>
+
+#import "SDLAppCapability.h"
+#import "SDLOnAppCapabilityUpdated.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLVideoStreamingCapability.h"
+
+QuickSpecBegin(SDLOnAppCapabilityUpdatedSpec)
+
+describe(@"getter/setter tests", ^{
+ SDLVideoStreamingCapability *videoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ SDLAppCapability *appCapability = [[SDLAppCapability alloc] initWithAppCapabilityType:SDLAppCapabilityTypeVideoStreaming videoStreamingCapability:videoStreamingCapability];
+ __block SDLOnAppCapabilityUpdated *testStruct = nil;
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLOnAppCapabilityUpdated alloc] init];
+ });
+ it(@"expect object to be created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.appCapability).to(beNil());
+ });
+ });
+
+ context(@"init & assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLOnAppCapabilityUpdated alloc] init];
+ testStruct.appCapability = appCapability;
+ });
+ it(@"expect object to be created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapability).to(equal(appCapability));
+ });
+ });
+
+ context(@"initWithVideoStreamingCapability:", ^{
+ beforeEach(^{
+ testStruct = [[SDLOnAppCapabilityUpdated alloc] initWithAppCapability:appCapability];
+ });
+ it(@"expect object to be created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapability).to(equal(appCapability));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary *params = @{
+ SDLRPCParameterNameAppCapability: appCapability,
+ };
+ NSDictionary* dict = @{SDLRPCParameterNameNotification: @{
+ SDLRPCParameterNameParameters: params,
+ SDLRPCParameterNameOperationName: SDLRPCFunctionNameOnAppCapabilityUpdated}
+ };
+ testStruct = [[SDLOnAppCapabilityUpdated alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect object to be created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapability).to(equal(appCapability));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
index b42482828..4b7857312 100644
--- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
@@ -49,6 +49,8 @@ SDLStabilityControlsStatus *stabilityControlsStatus = [[SDLStabilityControlsStat
NSArray<SDLWindowStatus *> *windowStatus = @[[[SDLWindowStatus alloc] init], [[SDLWindowStatus alloc] init]];
const BOOL handsOffSteering = YES;
SDLGearStatus *gearStatus = [[SDLGearStatus alloc] initWithUserSelectedGear:SDLPRNDLDrive actualGear:SDLPRNDLPark transmissionType:SDLTransmissionTypeAutomatic];
+SDLClimateData *climateData = [[SDLClimateData alloc] init];
+SDLSeatOccupancy *seatOccupancy = [[SDLSeatOccupancy alloc] init];
describe(@"getter/setter tests", ^{
context(@"init and assign", ^{
@@ -66,9 +68,9 @@ describe(@"getter/setter tests", ^{
testResponse.emergencyEvent = emergencyEvent;
testResponse.engineOilLife = @(engineOilLife);
testResponse.engineTorque = @(engineTorque);
- testResponse.externalTemperature = @(externalTemperature);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testResponse.externalTemperature = @(externalTemperature);
testResponse.fuelLevel = @(fuelLevel);
testResponse.fuelLevel_State = fuelLevel_State;
#pragma clang diagnostic pop
@@ -85,6 +87,7 @@ describe(@"getter/setter tests", ^{
testResponse.prndl = prndl;
#pragma clang diagnostic pop
testResponse.rpm = @(rpm);
+ testResponse.seatOccupancy = seatOccupancy;
testResponse.speed = @(speed);
testResponse.stabilityControlsStatus = stabilityControlsStatus;
testResponse.steeringWheelAngle = @(steeringWheelAngle);
@@ -93,6 +96,7 @@ describe(@"getter/setter tests", ^{
testResponse.vin = vin;
testResponse.windowStatus = windowStatus;
testResponse.wiperStatus = wiperStatus;
+ testResponse.climateData = climateData;
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(@(accPedalPosition)));
@@ -108,9 +112,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
expect(testResponse.engineTorque).to(equal(@(engineTorque)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
expect(testResponse.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
#pragma clang diagnostic pop
@@ -127,6 +131,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(prndl));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(equal(seatOccupancy));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
@@ -135,6 +140,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(equal(vin));
expect(testResponse.windowStatus).to(equal(windowStatus));
expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.climateData).to(equal(climateData));
});
});
@@ -173,6 +179,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:prndl,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:@(rpm),
+ SDLRPCParameterNameSeatOccupancy:seatOccupancy,
SDLRPCParameterNameSpeed:@(speed),
SDLRPCParameterNameStabilityControlsStatus:stabilityControlsStatus,
SDLRPCParameterNameSteeringWheelAngle:@(steeringWheelAngle),
@@ -181,6 +188,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameVIN:vin,
SDLRPCParameterNameWindowStatus:windowStatus,
SDLRPCParameterNameWiperStatus:wiperStatus,
+ SDLRPCParameterNameClimateData:climateData,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnVehicleData}};
SDLOnVehicleData* testResponse = [[SDLOnVehicleData alloc] initWithDictionary:dict];
@@ -199,9 +207,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
expect(testResponse.engineTorque).to(equal(@(engineTorque)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
expect(testResponse.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
#pragma clang diagnostic pop
@@ -218,6 +226,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(prndl));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(equal(seatOccupancy));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
@@ -226,6 +235,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(equal(vin));
expect(testResponse.windowStatus).to(equal(windowStatus));
expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.climateData).to(equal(climateData));
});
});
@@ -245,9 +255,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(beNil());
expect(testResponse.engineOilLife).to(beNil());
expect(testResponse.engineTorque).to(beNil());
- expect(testResponse.externalTemperature).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
expect(testResponse.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -264,6 +274,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.rpm).to(beNil());
+ expect(testResponse.seatOccupancy).to(beNil());
expect(testResponse.speed).to(beNil());
expect(testResponse.stabilityControlsStatus).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
@@ -272,10 +283,19 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(beNil());
expect(testResponse.windowStatus).to(beNil());
expect(testResponse.wiperStatus).to(beNil());
+ expect(testResponse.climateData).to(beNil());
});
});
+
context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:", ^{
- SDLOnVehicleData* testResponse = [[SDLOnVehicleData alloc] initWithGps:gps speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:fuelRangeArray externalTemperature:@(externalTemperature) turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:@(odometer) beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:@(engineTorque) accPedalPosition:@(accPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey handsOffSteering:@(handsOffSteering) windowStatus:windowStatus];
+ __block SDLOnVehicleData *testResponse = nil;
+
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testResponse = [[SDLOnVehicleData alloc] initWithGps:gps speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:fuelRangeArray externalTemperature:@(externalTemperature) turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:@(odometer) beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:@(engineTorque) accPedalPosition:@(accPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey handsOffSteering:@(handsOffSteering) windowStatus:windowStatus];
+#pragma clang diagnostic pop
+ });
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(@(accPedalPosition)));
@@ -291,9 +311,61 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
expect(testResponse.engineTorque).to(equal(@(engineTorque)));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
+ expect(testResponse.fuelLevel).to(beNil());
+ expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.fuelRange).to(equal(fuelRangeArray));
+ expect(testResponse.gearStatus).to(equal(gearStatus));
+ expect(testResponse.gps).to(equal(gps));
+ expect(testResponse.handsOffSteering).to(equal(@(handsOffSteering)));
+ expect(testResponse.headLampStatus).to(equal(headLampStatus));
+ expect(testResponse.instantFuelConsumption).to(equal(@(instantFuelConsumption)));
+ expect(testResponse.myKey).to(equal(myKey));
+ expect(testResponse.odometer).to(equal(@(odometer)));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(beNil());
+ expect(testResponse.speed).to(equal(@(speed)));
+ expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
+ expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
+ expect(testResponse.tirePressure).to(equal(tirePressure));
+ expect(testResponse.turnSignal).to(equal(turnSignal));
+ expect(testResponse.vin).to(equal(vin));
+ expect(testResponse.windowStatus).to(equal(windowStatus));
+ expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ });
+ });
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:", ^{
+ __block SDLOnVehicleData *testResponse = nil;
+
+ beforeEach(^{
+ testResponse = [[SDLOnVehicleData alloc] initWithGps:gps speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:fuelRangeArray climateData:climateData turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:@(odometer) beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:@(engineTorque) accPedalPosition:@(accPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:@(handsOffSteering) seatOccupancy:seatOccupancy];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testResponse.accPedalPosition).to(equal(@(accPedalPosition)));
+ expect(testResponse.airbagStatus).to(equal(airbagStatus));
+ expect(testResponse.beltStatus).to(equal(beltStatus));
+ expect(testResponse.bodyInformation).to(equal(bodyInformation));
+ expect(testResponse.cloudAppVehicleID).to(equal(cloudAppVehicleID));
+ expect(testResponse.clusterModeStatus).to(equal(clusterModeStatus));
+ expect(testResponse.deviceStatus).to(equal(deviceStatus));
+ expect(testResponse.driverBraking).to(equal(driverBraking));
+ expect(testResponse.eCallInfo).to(equal(eCallInfo));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(electronicParkBrakeStatus));
+ expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
+ expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
+ expect(testResponse.engineTorque).to(equal(@(engineTorque)));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
expect(testResponse.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -310,6 +382,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(equal(seatOccupancy));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
@@ -318,6 +391,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(equal(vin));
expect(testResponse.windowStatus).to(equal(windowStatus));
expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.climateData).to(equal(climateData));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m
index 3d636db9e..570b9eb23 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m
@@ -18,7 +18,8 @@ QuickSpecBegin(SDLAddCommandSpec)
describe(@"Getter/Setter Tests", ^ {
SDLMenuParams* menu = [[SDLMenuParams alloc] init];
- SDLImage* image = [[SDLImage alloc] init];
+ SDLImage *image = [[SDLImage alloc] initWithName:@"Icon" ofType:SDLImageTypeDynamic isTemplate:YES];
+ SDLImage *testSecondaryImage = [[SDLImage alloc] initWithStaticIconName:SDLStaticIconNameKey];
it(@"Should set and get correctly", ^ {
SDLAddCommand* testRequest = [[SDLAddCommand alloc] init];
@@ -27,27 +28,31 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.menuParams = menu;
testRequest.vrCommands = [@[@"name", @"anotherName"] mutableCopy];
testRequest.cmdIcon = image;
+ testRequest.secondaryImage = testSecondaryImage;
expect(testRequest.cmdID).to(equal(@434577));
expect(testRequest.menuParams).to(equal(menu));
expect(testRequest.vrCommands).to(equal([@[@"name", @"anotherName"] mutableCopy]));
expect(testRequest.cmdIcon).to(equal(image));
+ expect(testRequest.secondaryImage).to(equal(testSecondaryImage));
});
-
+
it(@"Should get correctly when initialized", ^ {
NSMutableDictionary<NSString *, id> *dict = [@{SDLRPCParameterNameRequest:
@{SDLRPCParameterNameParameters:
@{SDLRPCParameterNameCommandId:@434577,
SDLRPCParameterNameMenuParams:menu,
SDLRPCParameterNameVRCommands:[@[@"name", @"anotherName"] mutableCopy],
- SDLRPCParameterNameCommandIcon:image},
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameAddCommand}} mutableCopy];
+ SDLRPCParameterNameCommandIcon:image,
+ SDLRPCParameterNameSecondaryImage: testSecondaryImage},
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameAddCommand}} mutableCopy];
SDLAddCommand* testRequest = [[SDLAddCommand alloc] initWithDictionary:dict];
expect(testRequest.cmdID).to(equal(@434577));
expect(testRequest.menuParams).to(equal(menu));
expect(testRequest.vrCommands).to(equal([@[@"name", @"anotherName"] mutableCopy]));
expect(testRequest.cmdIcon).to(equal(image));
+ expect(testRequest.secondaryImage).to(equal(testSecondaryImage));
});
it(@"Should return nil if not set", ^ {
@@ -57,6 +62,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuParams).to(beNil());
expect(testRequest.vrCommands).to(beNil());
expect(testRequest.cmdIcon).to(beNil());
+ expect(testRequest.secondaryImage).to(beNil());
});
});
@@ -65,6 +71,9 @@ describe(@"initializers", ^{
__block UInt32 commandId = 1234;
__block NSArray<NSString *> *vrCommands = @[@"commands"];
__block NSString *menuName = @"Menu Name";
+ SDLImage *image = [[SDLImage alloc] initWithName:@"Icon" ofType:SDLImageTypeDynamic isTemplate:YES];
+ SDLImage *testSecondaryImage = [[SDLImage alloc] initWithStaticIconName:SDLStaticIconNameKey];
+ SDLMenuParams *testMenuParams = [[SDLMenuParams alloc] initWithMenuName:menuName];
void (^handler)(SDLOnCommand *) = ^(SDLOnCommand *command) {};
beforeEach(^{
@@ -83,7 +92,10 @@ describe(@"initializers", ^{
context(@"initWithHandler:", ^{
it(@"should initialize correctly", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithHandler:handler];
+#pragma clang diagnostic pop
expect(testCommand).toNot(beNil());
expect(testCommand.vrCommands).to(beNil());
@@ -94,7 +106,10 @@ describe(@"initializers", ^{
context(@"initWithId:vrCommands:handler:", ^{
it(@"should initialize correctly", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithId:commandId vrCommands:vrCommands handler:nil];
+#pragma clang diagnostic pop
expect(testCommand.cmdID).to(equal(commandId));
expect(testCommand.vrCommands).to(equal(vrCommands));
@@ -105,7 +120,10 @@ describe(@"initializers", ^{
context(@"initWithId:vrCommands:menuName:handler:", ^{
it(@"should initialize correctly", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithId:commandId vrCommands:vrCommands menuName:menuName handler:nil];
+#pragma clang diagnostic pop
expect(testCommand.cmdID).to(equal(commandId));
expect(testCommand.vrCommands).to(equal(vrCommands));
@@ -122,8 +140,10 @@ describe(@"initializers", ^{
NSString *iconValue = @"Icon";
SDLImageType imageType = SDLImageTypeDynamic;
BOOL imageIsTemplate = YES;
-
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithId:commandId vrCommands:vrCommands menuName:menuName parentId:parentId position:position iconValue:iconValue iconType:imageType iconIsTemplate:imageIsTemplate handler:nil];
+#pragma clang diagnostic pop
expect(testCommand.cmdID).to(equal(commandId));
expect(testCommand.vrCommands).to(equal(vrCommands));
@@ -138,7 +158,10 @@ describe(@"initializers", ^{
});
it(@"should initialize without an image", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithId:commandId vrCommands:vrCommands menuName:menuName parentId:parentId position:position iconValue:nil iconType:nil iconIsTemplate:NO handler:nil];
+#pragma clang diagnostic pop
expect(testCommand.cmdID).to(equal(commandId));
expect(testCommand.vrCommands).to(equal(vrCommands));
@@ -155,8 +178,10 @@ describe(@"initializers", ^{
it(@"should initialize with an image", ^{
SDLImage *image = [[SDLImage alloc] initWithName:@"Icon" ofType:SDLImageTypeDynamic isTemplate:YES];
-
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithId:commandId vrCommands:vrCommands menuName:menuName parentId:parentId position:position icon:image handler:nil];
+#pragma clang diagnostic pop
expect(testCommand.cmdID).to(equal(commandId));
expect(testCommand.vrCommands).to(equal(vrCommands));
@@ -171,7 +196,10 @@ describe(@"initializers", ^{
});
it(@"should initialize without an image", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testCommand = [[SDLAddCommand alloc] initWithId:commandId vrCommands:vrCommands menuName:menuName parentId:parentId position:position icon:nil handler:nil];
+#pragma clang diagnostic pop
expect(testCommand.cmdID).to(equal(commandId));
expect(testCommand.vrCommands).to(equal(vrCommands));
@@ -182,6 +210,41 @@ describe(@"initializers", ^{
expect(testCommand.cmdIcon).to(beNil());
});
});
+
+ context(@"initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage", ^{
+ it(@"should initialize with an image", ^{
+ testCommand = [[SDLAddCommand alloc] initWithCmdID:commandId menuParams:testMenuParams vrCommands:vrCommands cmdIcon:image secondaryImage:testSecondaryImage];
+
+ expect(testCommand.cmdID).to(equal(commandId));
+ expect(testCommand.vrCommands).to(equal(vrCommands));
+ expect(testCommand.menuParams).to(equal(testMenuParams));
+
+ expect(testCommand.cmdIcon).toNot(beNil());
+ expect(testCommand.cmdIcon.value).to(equal(image.value));
+ expect(testCommand.cmdIcon.imageType).to(equal(image.imageType));
+ expect(testCommand.cmdIcon.isTemplate).to(equal(image.isTemplate));
+
+ expect(testCommand.secondaryImage).toNot(beNil());
+ expect(testCommand.secondaryImage.value).to(equal(testSecondaryImage.value));
+ expect(testCommand.secondaryImage.imageType).to(equal(testSecondaryImage.imageType));
+ expect(testCommand.secondaryImage.isTemplate).to(equal(testSecondaryImage.isTemplate));
+ });
+
+ it(@"should initialize without an image", ^{
+ testCommand = [[SDLAddCommand alloc] initWithCmdID:commandId menuParams:testMenuParams vrCommands:vrCommands cmdIcon:image secondaryImage:nil];
+
+ expect(testCommand.cmdID).to(equal(commandId));
+ expect(testCommand.vrCommands).to(equal(vrCommands));
+ expect(testCommand.menuParams).to(equal(testMenuParams));
+
+ expect(testCommand.cmdIcon).toNot(beNil());
+ expect(testCommand.cmdIcon.value).to(equal(image.value));
+ expect(testCommand.cmdIcon.imageType).to(equal(image.imageType));
+ expect(testCommand.cmdIcon.isTemplate).to(equal(image.isTemplate));
+
+ expect(testCommand.secondaryImage).to(beNil());
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
index 3dffd0961..a3cc333e2 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
@@ -19,12 +19,16 @@ describe(@"Getter/Setter Tests", ^ {
__block UInt32 menuId = 4345645;
__block UInt8 position = 27;
__block NSString *menuName = @"Welcome to the menu";
+ __block NSString *secondaryText = @"Secondary text";
+ __block NSString *tertiaryText = @"Tertiary text";
__block SDLImage *image = nil;
+ __block SDLImage *secondaryImage = nil;
__block SDLMenuLayout testLayout = SDLMenuLayoutList;
__block NSNumber *parentID = @44;
beforeEach(^{
image = [[SDLImage alloc] initWithName:@"Test" isTemplate:false];
+ secondaryImage = [[SDLImage alloc] initWithStaticIconName:SDLStaticIconNameKey];
});
it(@"should correctly initialize with initWithMenuID:menuName:", ^{
@@ -35,10 +39,16 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuName).to(equal(menuName));
expect(testRequest.menuIcon).to(beNil());
expect(testRequest.parentID).to(beNil());
+ expect(testRequest.secondaryText).to(beNil());
+ expect(testRequest.tertiaryText).to(beNil());
+ expect(testRequest.secondaryImage).to(beNil());
});
it(@"should correctly initialize with initWithMenuID:menuName:menuLayout:menuIcon:position:parentID:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithMenuID:menuId menuName:menuName position:@(position) menuIcon:image menuLayout:testLayout parentID:parentID];
+#pragma clang diagnostic pop
expect(testRequest.menuID).to(equal(@(menuId)));
expect(testRequest.position).to(equal(@(position)));
@@ -46,6 +56,23 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuIcon).to(equal(image));
expect(testRequest.menuLayout).to(equal(testLayout));
expect(testRequest.parentID).to(equal(parentID));
+ expect(testRequest.secondaryText).to(beNil());
+ expect(testRequest.tertiaryText).to(beNil());
+ expect(testRequest.secondaryImage).to(beNil());
+ });
+
+ it(@"should correctly initialize with initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:", ^{
+ SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithMenuID:menuId menuName:menuName position:@(position) menuIcon:image menuLayout:testLayout parentID:parentID secondaryText:secondaryText tertiaryText:tertiaryText secondaryImage:secondaryImage];
+
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(equal(@(position)));
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon).to(equal(image));
+ expect(testRequest.menuLayout).to(equal(testLayout));
+ expect(testRequest.parentID).to(equal(parentID));
+ expect(testRequest.secondaryText).to(equal(secondaryText));
+ expect(testRequest.tertiaryText).to(equal(tertiaryText));
+ expect(testRequest.secondaryImage).to(equal(secondaryImage));
});
it(@"Should set and get correctly", ^ {
@@ -57,6 +84,9 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.menuIcon = image;
testRequest.menuLayout = testLayout;
testRequest.parentID = parentID;
+ testRequest.secondaryText = secondaryText;
+ testRequest.tertiaryText = tertiaryText;
+ testRequest.secondaryImage = secondaryImage;
expect(testRequest.menuID).to(equal(@(menuId)));
expect(testRequest.position).to(equal(@(position)));
@@ -64,6 +94,9 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuIcon).to(equal(image));
expect(testRequest.menuLayout).to(equal(testLayout));
expect(testRequest.parentID).to(equal(parentID));
+ expect(testRequest.secondaryText).to(equal(secondaryText));
+ expect(testRequest.tertiaryText).to(equal(tertiaryText));
+ expect(testRequest.secondaryImage).to(equal(secondaryImage));
});
it(@"Should get correctly when initialized", ^ {
@@ -76,6 +109,9 @@ describe(@"Getter/Setter Tests", ^ {
SDLRPCParameterNameValue: image.value
},
SDLRPCParameterNameMenuLayout: testLayout,
+ SDLRPCParameterNameSecondaryText: secondaryText,
+ SDLRPCParameterNameTertiaryText: tertiaryText,
+ SDLRPCParameterNameSecondaryImage: secondaryImage,
SDLRPCParameterNameParentID: parentID
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameAddSubMenu}};
@@ -87,6 +123,9 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuIcon.value).to(equal(@"Test"));
expect(testRequest.menuLayout).to(equal(testLayout));
expect(testRequest.parentID).to(equal(parentID));
+ expect(testRequest.secondaryText).to(equal(secondaryText));
+ expect(testRequest.tertiaryText).to(equal(tertiaryText));
+ expect(testRequest.secondaryImage).to(equal(secondaryImage));
});
it(@"Should return nil if not set", ^ {
@@ -98,6 +137,9 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.menuIcon).to(beNil());
expect(testRequest.menuLayout).to(beNil());
expect(testRequest.parentID).to(beNil());
+ expect(testRequest.secondaryText).to(beNil());
+ expect(testRequest.tertiaryText).to(beNil());
+ expect(testRequest.secondaryImage).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
index 2872c6cee..c2b0b3681 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
@@ -16,46 +16,52 @@ QuickSpecBegin(SDLGetVehicleDataSpec)
describe(@"getter/setter tests", ^{
context(@"init and assign", ^{
- SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] init];
- testRequest.accPedalPosition = @YES;
- testRequest.airbagStatus = @YES;
- testRequest.beltStatus = @YES;
- testRequest.bodyInformation = @YES;
- testRequest.cloudAppVehicleID = @YES;
- testRequest.clusterModeStatus = @YES;
- testRequest.deviceStatus = @YES;
- testRequest.driverBraking = @YES;
- testRequest.eCallInfo = @YES;
- testRequest.electronicParkBrakeStatus = @YES;
- testRequest.emergencyEvent = @YES;
- testRequest.engineOilLife = @YES;
- testRequest.engineTorque = @YES;
- testRequest.externalTemperature = @YES;
+ __block SDLGetVehicleData *testRequest = nil;
+
+ beforeEach(^{
+ testRequest = [[SDLGetVehicleData alloc] init];
+ testRequest.accPedalPosition = @YES;
+ testRequest.airbagStatus = @YES;
+ testRequest.beltStatus = @YES;
+ testRequest.bodyInformation = @YES;
+ testRequest.cloudAppVehicleID = @YES;
+ testRequest.clusterModeStatus = @YES;
+ testRequest.deviceStatus = @YES;
+ testRequest.driverBraking = @YES;
+ testRequest.eCallInfo = @YES;
+ testRequest.electronicParkBrakeStatus = @YES;
+ testRequest.emergencyEvent = @YES;
+ testRequest.engineOilLife = @YES;
+ testRequest.engineTorque = @YES;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- testRequest.fuelLevel = @YES;
- testRequest.fuelLevel_State = @YES;
+ testRequest.externalTemperature = @YES;
+ testRequest.fuelLevel = @YES;
+ testRequest.fuelLevel_State = @YES;
#pragma clang diagnostic pop
- testRequest.fuelRange = @YES;
- testRequest.gearStatus = @YES;
- testRequest.gps = @YES;
- testRequest.handsOffSteering = @YES;
- testRequest.headLampStatus = @YES;
- testRequest.instantFuelConsumption = @YES;
- testRequest.myKey = @YES;
- testRequest.odometer = @YES;
+ testRequest.fuelRange = @YES;
+ testRequest.gearStatus = @YES;
+ testRequest.gps = @YES;
+ testRequest.handsOffSteering = @YES;
+ testRequest.headLampStatus = @YES;
+ testRequest.instantFuelConsumption = @YES;
+ testRequest.myKey = @YES;
+ testRequest.odometer = @YES;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- testRequest.prndl = @YES;
+ testRequest.prndl = @YES;
#pragma clang diagnostic pop
- testRequest.rpm = @YES;
- testRequest.speed = @YES;
- testRequest.stabilityControlsStatus = @YES;
- testRequest.steeringWheelAngle = @YES;
- testRequest.tirePressure = @YES;
- testRequest.turnSignal = @YES;
- testRequest.windowStatus = @YES;
- testRequest.wiperStatus = @YES;
+ testRequest.rpm = @YES;
+ testRequest.seatOccupancy = @YES;
+ testRequest.speed = @YES;
+ testRequest.stabilityControlsStatus = @YES;
+ testRequest.steeringWheelAngle = @YES;
+ testRequest.tirePressure = @YES;
+ testRequest.turnSignal = @YES;
+ testRequest.windowStatus = @YES;
+ testRequest.wiperStatus = @YES;
+ testRequest.climateData = @YES;
+ });
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -71,9 +77,9 @@ describe(@"getter/setter tests", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -90,6 +96,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -97,10 +104,12 @@ describe(@"getter/setter tests", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
context(@"initWithDictionary:", ^{
+ __block SDLGetVehicleData *testRequest = nil;
NSDictionary<NSString *, id> *dict = @{SDLRPCParameterNameRequest:
@{SDLRPCParameterNameParameters:@{
SDLRPCParameterNameAccelerationPedalPosition:@YES,
@@ -135,6 +144,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:@YES,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:@YES,
+ SDLRPCParameterNameSeatOccupancy:@YES,
SDLRPCParameterNameSpeed:@YES,
SDLRPCParameterNameStabilityControlsStatus:@YES,
SDLRPCParameterNameSteeringWheelAngle:@YES,
@@ -142,9 +152,12 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameTurnSignal:@YES,
SDLRPCParameterNameWindowStatus:@YES,
SDLRPCParameterNameWiperStatus:@YES,
+ SDLRPCParameterNameClimateData:@YES
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
- SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] initWithDictionary:dict];
+ beforeEach(^{
+ testRequest = [[SDLGetVehicleData alloc] initWithDictionary:dict];
+ });
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -160,9 +173,9 @@ describe(@"getter/setter tests", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -179,6 +192,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -186,13 +200,19 @@ describe(@"getter/setter tests", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
});
describe(@"initializers", ^{
context(@"init", ^{
- SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] init];
+ __block SDLGetVehicleData *testRequest = nil;
+
+ beforeEach(^{
+ testRequest = [[SDLGetVehicleData alloc] init];
+ });
+
it(@"expect all properties to be nil", ^{
expect(testRequest.accPedalPosition).to(beNil());
expect(testRequest.airbagStatus).to(beNil());
@@ -207,9 +227,9 @@ describe(@"initializers", ^{
expect(testRequest.emergencyEvent).to(beNil());
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(beNil());
- expect(testRequest.externalTemperature).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(beNil());
expect(testRequest.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -226,6 +246,7 @@ describe(@"initializers", ^{
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testRequest.rpm).to(beNil());
+ expect(testRequest.seatOccupancy).to(beNil());
expect(testRequest.speed).to(beNil());
expect(testRequest.stabilityControlsStatus).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
@@ -233,14 +254,19 @@ describe(@"initializers", ^{
expect(testRequest.turnSignal).to(beNil());
expect(testRequest.windowStatus).to(beNil());
expect(testRequest.wiperStatus).to(beNil());
+ expect(testRequest.climateData).to(beNil());
});
});
context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:", ^{
+ __block SDLGetVehicleData *testRequest = nil;
+
+ beforeEach(^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES cloudAppVehicleID:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES vin:YES wiperStatus:YES];
+ testRequest = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES cloudAppVehicleID:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES vin:YES wiperStatus:YES];
#pragma clang diagnostic pop
+ });
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -256,9 +282,9 @@ describe(@"initializers", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -275,6 +301,7 @@ describe(@"initializers", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(beNil());
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(beNil());
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -282,11 +309,19 @@ describe(@"initializers", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(beNil());
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(beNil());
});
});
context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:", ^{
- SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES externalTemperature:@YES turnSignal:@YES vin:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES windowStatus:@YES];
+ __block SDLGetVehicleData *testRequest = nil;
+
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testRequest = [[SDLGetVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES externalTemperature:@YES turnSignal:@YES vin:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES windowStatus:@YES];
+#pragma clang diagnostic pop
+ });
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -302,9 +337,61 @@ describe(@"initializers", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.externalTemperature).to(equal(@YES));
+ expect(testRequest.fuelLevel).to(beNil());
+ expect(testRequest.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testRequest.fuelRange).to(equal(@YES));
+ expect(testRequest.gearStatus).to(equal(@YES));
+ expect(testRequest.gps).to(equal(@YES));
+ expect(testRequest.handsOffSteering).to(equal(@YES));
+ expect(testRequest.headLampStatus).to(equal(@YES));
+ expect(testRequest.instantFuelConsumption).to(equal(@YES));
+ expect(testRequest.myKey).to(equal(@YES));
+ expect(testRequest.odometer).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(beNil());
+ expect(testRequest.speed).to(equal(@YES));
+ expect(testRequest.stabilityControlsStatus).to(equal(@YES));
+ expect(testRequest.steeringWheelAngle).to(equal(@YES));
+ expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
+ expect(testRequest.windowStatus).to(equal(@YES));
+ expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(beNil());
+ });
+ });
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:", ^{
+ __block SDLGetVehicleData *testRequest = nil;
+
+ beforeEach(^{
+ testRequest = [[SDLGetVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES climateData:@YES turnSignal:@YES vin:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES windowStatus:@YES handsOffSteering:@YES seatOccupancy:@YES];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testRequest.accPedalPosition).to(equal(@YES));
+ expect(testRequest.airbagStatus).to(equal(@YES));
+ expect(testRequest.beltStatus).to(equal(@YES));
+ expect(testRequest.bodyInformation).to(equal(@YES));
+ expect(testRequest.cloudAppVehicleID).to(equal(@YES));
+ expect(testRequest.clusterModeStatus).to(equal(@YES));
+ expect(testRequest.deviceStatus).to(equal(@YES));
+ expect(testRequest.driverBraking).to(equal(@YES));
+ expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
+ expect(testRequest.emergencyEvent).to(equal(@YES));
+ expect(testRequest.engineOilLife).to(equal(@YES));
+ expect(testRequest.engineTorque).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(beNil());
expect(testRequest.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -321,6 +408,7 @@ describe(@"initializers", ^{
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -328,13 +416,18 @@ describe(@"initializers", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
context(@"should set OEM Custom Vehicle Data", ^{
- SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] init];
- [testRequest setOEMCustomVehicleData:@"OEMCustomVehicleData" withVehicleDataState:NO];
- [testRequest setOEMCustomVehicleData:@"OEMCustomVehicleData1" withVehicleDataState:YES];
+ __block SDLGetVehicleData *testRequest = nil;
+
+ beforeEach(^{
+ testRequest = [[SDLGetVehicleData alloc] init];
+ [testRequest setOEMCustomVehicleData:@"OEMCustomVehicleData" withVehicleDataState:NO];
+ [testRequest setOEMCustomVehicleData:@"OEMCustomVehicleData1" withVehicleDataState:YES];
+ });
it(@"expect OEM Custom Vehicle Data to be set properly", ^{
expect([testRequest getOEMCustomVehicleData:@"OEMCustomVehicleData"]).to(equal(@NO));
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m
index ae5adf8ad..bcd212865 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m
@@ -12,6 +12,7 @@
#import "SDLAppHMIType.h"
#import "SDLAppInfo.h"
#import "SDLDeviceInfo.h"
+#import "SDLGlobals.h"
#import "SDLLanguage.h"
#import "SDLLifecycleConfiguration.h"
#import "SDLRPCParameterNames.h"
@@ -42,7 +43,7 @@ describe(@"RegisterAppInterface Tests", ^{
__block SDLDeviceInfo *info = nil;
__block SDLAppInfo *appInfo = nil;
__block SDLTemplateColorScheme *colorScheme = nil;
- __block SDLMsgVersion * currentSDLMsgVersion = [[SDLMsgVersion alloc] initWithMajorVersion:7 minorVersion:0 patchVersion:0];
+ __block SDLMsgVersion * currentSDLMsgVersion = nil;
beforeEach(^{
testRegisterAppInterface = nil;
@@ -51,6 +52,10 @@ describe(@"RegisterAppInterface Tests", ^{
info = [[SDLDeviceInfo alloc] init];
appInfo = [[SDLAppInfo alloc] init];
colorScheme = [[SDLTemplateColorScheme alloc] init];
+ UInt8 majorVersion = (UInt8)[SDLMaxProxyRPCVersion substringWithRange:NSMakeRange(0, 1)].intValue;
+ UInt8 minorVersion = (UInt8)[SDLMaxProxyRPCVersion substringWithRange:NSMakeRange(2, 1)].intValue;
+ UInt8 patchVersion = (UInt8)[SDLMaxProxyRPCVersion substringWithRange:NSMakeRange(4, 1)].intValue;
+ currentSDLMsgVersion = [[SDLMsgVersion alloc] initWithMajorVersion:majorVersion minorVersion:minorVersion patchVersion:patchVersion];
});
it(@"Should set and get correctly", ^ {
@@ -90,52 +95,48 @@ describe(@"RegisterAppInterface Tests", ^{
expect(testRegisterAppInterface.sdlMsgVersion).to(equal(msgVersion));
});
- describe(@"Setting With Dictionary", ^{
- beforeEach( ^{
- NSDictionary *dict = @{SDLRPCParameterNameRequest:
- @{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameSyncMessageVersion:@{
- SDLRPCParameterNameMajorVersion: @7,
- SDLRPCParameterNameMinorVersion: @0,
- SDLRPCParameterNamePatchVersion: @0
- },
- SDLRPCParameterNameAppName:appName,
- SDLRPCParameterNameTTSName:[@[chunk] mutableCopy],
- SDLRPCParameterNameNGNMediaScreenAppName:shortAppName,
- SDLRPCParameterNameVRSynonyms:@[vrSynonyms],
- SDLRPCParameterNameIsMediaApplication:isMediaApp,
- SDLRPCParameterNameLanguageDesired:SDLLanguageNoNo,
- SDLRPCParameterNameHMIDisplayLanguageDesired:SDLLanguagePtPt,
- SDLRPCParameterNameAppHMIType:appTypes,
- SDLRPCParameterNameHashId:resumeHash,
- SDLRPCParameterNameDeviceInfo:info,
- SDLRPCParameterNameFullAppID:fullAppId,
- SDLRPCParameterNameAppId:appId,
- SDLRPCParameterNameAppInfo:appInfo,
- SDLRPCParameterNameDayColorScheme: colorScheme,
- SDLRPCParameterNameNightColorScheme: colorScheme,
- },
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameRegisterAppInterface}};
- SDLRegisterAppInterface *testRegisterAppInterface = [[SDLRegisterAppInterface alloc] initWithDictionary:dict];
-
- expect(testRegisterAppInterface.sdlMsgVersion).to(equal(currentSDLMsgVersion));
- expect(testRegisterAppInterface.appName).to(match(appName));
- expect(testRegisterAppInterface.ttsName).to(equal([@[chunk] mutableCopy]));
- expect(testRegisterAppInterface.ngnMediaScreenAppName).to(match(shortAppName));
- expect(testRegisterAppInterface.vrSynonyms).to(equal(@[vrSynonyms]));
- expect(testRegisterAppInterface.isMediaApplication).to(equal(isMediaApp));
- expect(testRegisterAppInterface.languageDesired).to(equal(SDLLanguageNoNo));
- expect(testRegisterAppInterface.hmiDisplayLanguageDesired).to(equal(SDLLanguagePtPt));
- expect(testRegisterAppInterface.appHMIType).to(equal(appTypes));
- expect(testRegisterAppInterface.hashID).to(match(resumeHash));
- expect(testRegisterAppInterface.deviceInfo).to(equal(info));
- expect(testRegisterAppInterface.fullAppID).to(match(fullAppId));
- expect(testRegisterAppInterface.appID).to(match(appId));
- expect(testRegisterAppInterface.appInfo).to(equal(appInfo));
- expect(testRegisterAppInterface.dayColorScheme).to(equal(colorScheme));
- expect(testRegisterAppInterface.nightColorScheme).to(equal(colorScheme));
- });
- });
+ describe(@"Setting With Dictionary", ^{
+ it(@"initWithDictionary", ^{
+ NSDictionary *dict = @{SDLRPCParameterNameRequest:
+ @{SDLRPCParameterNameParameters:
+ @{SDLRPCParameterNameSyncMessageVersion:currentSDLMsgVersion,
+ SDLRPCParameterNameAppName:appName,
+ SDLRPCParameterNameTTSName:[@[chunk] mutableCopy],
+ SDLRPCParameterNameNGNMediaScreenAppName:shortAppName,
+ SDLRPCParameterNameVRSynonyms:@[vrSynonyms],
+ SDLRPCParameterNameIsMediaApplication:isMediaApp,
+ SDLRPCParameterNameLanguageDesired:SDLLanguageNoNo,
+ SDLRPCParameterNameHMIDisplayLanguageDesired:SDLLanguagePtPt,
+ SDLRPCParameterNameAppHMIType:appTypes,
+ SDLRPCParameterNameHashId:resumeHash,
+ SDLRPCParameterNameDeviceInfo:info,
+ SDLRPCParameterNameFullAppID:fullAppId,
+ SDLRPCParameterNameAppId:appId,
+ SDLRPCParameterNameAppInfo:appInfo,
+ SDLRPCParameterNameDayColorScheme: colorScheme,
+ SDLRPCParameterNameNightColorScheme: colorScheme,
+ },
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameRegisterAppInterface}};
+ SDLRegisterAppInterface *testRegisterAppInterface = [[SDLRegisterAppInterface alloc] initWithDictionary:dict];
+
+ expect(testRegisterAppInterface.sdlMsgVersion).to(equal(currentSDLMsgVersion));
+ expect(testRegisterAppInterface.appName).to(match(appName));
+ expect(testRegisterAppInterface.ttsName).to(equal([@[chunk] mutableCopy]));
+ expect(testRegisterAppInterface.ngnMediaScreenAppName).to(match(shortAppName));
+ expect(testRegisterAppInterface.vrSynonyms).to(equal(@[vrSynonyms]));
+ expect(testRegisterAppInterface.isMediaApplication).to(equal(isMediaApp));
+ expect(testRegisterAppInterface.languageDesired).to(equal(SDLLanguageNoNo));
+ expect(testRegisterAppInterface.hmiDisplayLanguageDesired).to(equal(SDLLanguagePtPt));
+ expect(testRegisterAppInterface.appHMIType).to(equal(appTypes));
+ expect(testRegisterAppInterface.hashID).to(match(resumeHash));
+ expect(testRegisterAppInterface.deviceInfo).to(equal(info));
+ expect(testRegisterAppInterface.fullAppID).to(match(fullAppId));
+ expect(testRegisterAppInterface.appID).to(match(appId));
+ expect(testRegisterAppInterface.appInfo).to(equal(appInfo));
+ expect(testRegisterAppInterface.dayColorScheme).to(equal(colorScheme));
+ expect(testRegisterAppInterface.nightColorScheme).to(equal(colorScheme));
+ });
+ });
describe(@"initializers", ^{
it(@"init", ^{
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m
index 721ba0b86..d05fd1607 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m
@@ -20,10 +20,18 @@ QuickSpecBegin(SDLSetMediaClockTimerSpec)
describe(@"SetMediaClocktimer Spec", ^ {
__block NSTimeInterval testTime1Interval = 32887;
__block NSTimeInterval testTime2Interval = 3723;
+ __block float testCountRate = 1423.0;
__block SDLStartTime *time1 = [[SDLStartTime alloc] initWithHours:9 minutes:8 seconds:7];
__block SDLStartTime *time2 = [[SDLStartTime alloc] initWithHours:1 minutes:2 seconds:3];
__block SDLUpdateMode testUpdateMode = SDLUpdateModeCountUp;
__block SDLAudioStreamingIndicator testIndicator = SDLAudioStreamingIndicatorPlayPause;
+ __block SDLSeekStreamingIndicator *forwardSeekTest;
+ __block SDLSeekStreamingIndicator *backSeekTest;
+
+ beforeEach(^{
+ forwardSeekTest = [[SDLSeekStreamingIndicator alloc] initWithType:SDLSeekIndicatorTypeTrack];
+ backSeekTest = [[SDLSeekStreamingIndicator alloc] initWithType:SDLSeekIndicatorTypeTrack];
+ });
describe(@"when initialized", ^{
it(@"should properly initialize with initWithDictionary:", ^{
@@ -32,7 +40,9 @@ describe(@"SetMediaClocktimer Spec", ^ {
@{SDLRPCParameterNameStartTime:time1,
SDLRPCParameterNameEndTime:time2,
SDLRPCParameterNameUpdateMode:testUpdateMode,
- SDLRPCParameterNameAudioStreamingIndicator:testIndicator
+ SDLRPCParameterNameAudioStreamingIndicator:testIndicator,
+ SDLRPCParameterNameForwardSeekIndicator:forwardSeekTest,
+ SDLRPCParameterNameBackSeekIndicator:backSeekTest
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetMediaClockTimer}
};
@@ -42,6 +52,8 @@ describe(@"SetMediaClocktimer Spec", ^ {
expect(testRequest.endTime).to(equal(time2));
expect(testRequest.updateMode).to(equal(testUpdateMode));
expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
});
it(@"should properly initialize with init", ^{
@@ -51,45 +63,132 @@ describe(@"SetMediaClocktimer Spec", ^ {
expect(testRequest.endTime).to(beNil());
expect(testRequest.updateMode).to(beNil());
expect(testRequest.audioStreamingIndicator).to(beNil());
+ expect(testRequest.forwardSeekIndicator).to(beNil());
+ expect(testRequest.backSeekIndicator).to(beNil());
+ expect(testRequest.countRate).to(beNil());
});
- it(@"should properly initialize with countUpWithStartTimeInterval:endTimeInterval:playPauseIndicator:", ^{
+ it(@"should properly initialize with initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:", ^{
+ SDLSetMediaClockTimer* testRequest = [[SDLSetMediaClockTimer alloc] initWithUpdateMode:testUpdateMode startTime:time1 endTime:time2 audioStreamingIndicator:testIndicator forwardSeekIndicator:forwardSeekTest backSeekIndicator:backSeekTest countRate:@(testCountRate)];
+
+ expect(testRequest.startTime).to(equal(time1));
+ expect(testRequest.endTime).to(equal(time2));
+ expect(testRequest.updateMode).to(equal(SDLUpdateModeCountUp));
+ expect(testRequest.audioStreamingIndicator).to(equal(SDLAudioStreamingIndicatorPlayPause));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
+ });
+
+ it(@"should properly initialize with countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countUpFromStartTimeInterval:testTime1Interval toEndTimeInterval:testTime2Interval playPauseIndicator:testIndicator];
+#pragma clang diagnostic pop
+
+ expect(testRequest.startTime).to(equal(time1));
+ expect(testRequest.endTime).to(equal(time2));
+ expect(testRequest.updateMode).to(equal(SDLUpdateModeCountUp));
+ expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(beNil());
+ expect(testRequest.backSeekIndicator).to(beNil());
+ expect(testRequest.countRate).to(beNil());
+ });
+
+ it(@"should properly initialize with countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:", ^{
+ SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countUpFromStartTimeInterval:testTime1Interval toEndTimeInterval:testTime2Interval playPauseIndicator:testIndicator forwardSeekIndicator:forwardSeekTest backSeekIndicator:backSeekTest countRate:@(testCountRate)];
expect(testRequest.startTime).to(equal(time1));
expect(testRequest.endTime).to(equal(time2));
expect(testRequest.updateMode).to(equal(SDLUpdateModeCountUp));
expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
});
- it(@"should properly initialize with countUpWithStartTime:endTime:playPauseIndicator:", ^{
+ it(@"should properly initialize with countUpFromStartTime:toEndTime:playPauseIndicator:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countUpFromStartTime:time1 toEndTime:time2 playPauseIndicator:testIndicator];
+#pragma clang diagnostic pop
+
+ expect(testRequest.startTime).to(equal(time1));
+ expect(testRequest.endTime).to(equal(time2));
+ expect(testRequest.updateMode).to(equal(SDLUpdateModeCountUp));
+ expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(beNil());
+ expect(testRequest.backSeekIndicator).to(beNil());
+ expect(testRequest.countRate).to(beNil());
+ });
+
+ it(@"should properly initialize with countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:", ^{
+ SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countUpFromStartTime:time1 toEndTime:time2 playPauseIndicator:testIndicator forwardSeekIndicator:forwardSeekTest backSeekIndicator:backSeekTest countRate:@(testCountRate)];
expect(testRequest.startTime).to(equal(time1));
expect(testRequest.endTime).to(equal(time2));
expect(testRequest.updateMode).to(equal(SDLUpdateModeCountUp));
expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
});
- it(@"should properly initialize with countUpWithStartTimeInterval:endTimeInterval:playPauseIndicator:", ^{
+ it(@"should properly initialize with countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countDownFromStartTimeInterval:testTime1Interval toEndTimeInterval:testTime2Interval playPauseIndicator:testIndicator];
+#pragma clang diagnostic pop
expect(testRequest.startTime).to(equal(time1));
expect(testRequest.endTime).to(equal(time2));
expect(testRequest.updateMode).to(equal(SDLUpdateModeCountDown));
expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(beNil());
+ expect(testRequest.backSeekIndicator).to(beNil());
+ expect(testRequest.countRate).to(beNil());
});
- it(@"should properly initialize with countDownWithStartTime:endTime:playPauseIndicator:", ^{
+ it(@"should properly initialize with countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:", ^{
+ SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countDownFromStartTimeInterval:testTime1Interval toEndTimeInterval:testTime2Interval playPauseIndicator:testIndicator forwardSeekIndicator:forwardSeekTest backSeekIndicator:backSeekTest countRate:@(testCountRate)];
+
+ expect(testRequest.startTime).to(equal(time1));
+ expect(testRequest.endTime).to(equal(time2));
+ expect(testRequest.updateMode).to(equal(SDLUpdateModeCountDown));
+ expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
+ });
+
+ it(@"should properly initialize with countDownFromStartTime:toEndTime:playPauseIndicator:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countDownFromStartTime:time1 toEndTime:time2 playPauseIndicator:testIndicator];
+#pragma clang diagnostic pop
expect(testRequest.startTime).to(equal(time1));
expect(testRequest.endTime).to(equal(time2));
expect(testRequest.updateMode).to(equal(SDLUpdateModeCountDown));
expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(beNil());
+ expect(testRequest.backSeekIndicator).to(beNil());
+ expect(testRequest.countRate).to(beNil());
});
- it(@"should properly initialize with pauseWithPlayPauseIndicator", ^{
+ it(@"should properly initialize with countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:", ^{
+ SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer countDownFromStartTime:time1 toEndTime:time2 playPauseIndicator:testIndicator forwardSeekIndicator:forwardSeekTest backSeekIndicator:backSeekTest countRate:@(testCountRate)];
+
+ expect(testRequest.startTime).to(equal(time1));
+ expect(testRequest.endTime).to(equal(time2));
+ expect(testRequest.updateMode).to(equal(SDLUpdateModeCountDown));
+ expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
+ });
+
+ it(@"should properly initialize with pauseWithPlayPauseIndicator:", ^{
SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer pauseWithPlayPauseIndicator:testIndicator];
expect(testRequest.startTime).to(beNil());
@@ -117,12 +216,30 @@ describe(@"SetMediaClocktimer Spec", ^ {
});
it(@"should properly initialize with resumeWithPlayPauseIndicator:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer resumeWithPlayPauseIndicator:testIndicator];
+#pragma clang diagnostic pop
+
+ expect(testRequest.startTime).to(beNil());
+ expect(testRequest.endTime).to(beNil());
+ expect(testRequest.updateMode).to(equal(SDLUpdateModeResume));
+ expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.countRate).to(beNil());
+ });
+
+ it(@"should properly initialize with resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:", ^{
+ SDLSetMediaClockTimer *testRequest = [SDLSetMediaClockTimer resumeWithPlayPauseIndicator:testIndicator forwardSeekIndicator:forwardSeekTest backSeekIndicator:backSeekTest countRate:@(testCountRate)];
expect(testRequest.startTime).to(beNil());
expect(testRequest.endTime).to(beNil());
expect(testRequest.updateMode).to(equal(SDLUpdateModeResume));
expect(testRequest.audioStreamingIndicator).to(equal(testIndicator));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
});
it(@"should properly initialize with clearWithPlayPauseIndicator:", ^{
@@ -135,7 +252,10 @@ describe(@"SetMediaClocktimer Spec", ^ {
});
it(@"should properly initialize with initWithUpdateMode:startTime:endTime:playPauseIndicator:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSetMediaClockTimer *testRequest = [[SDLSetMediaClockTimer alloc] initWithUpdateMode:testUpdateMode startTime:time1 endTime:time2 playPauseIndicator:testIndicator];
+#pragma clang diagnostic pop
expect(testRequest.startTime).to(equal(time1));
expect(testRequest.endTime).to(equal(time2));
@@ -151,11 +271,17 @@ describe(@"SetMediaClocktimer Spec", ^ {
testRequest.endTime = time2;
testRequest.updateMode = SDLUpdateModeCountUp;
testRequest.audioStreamingIndicator = SDLAudioStreamingIndicatorPlayPause;
+ testRequest.forwardSeekIndicator = forwardSeekTest;
+ testRequest.backSeekIndicator = backSeekTest;
+ testRequest.countRate = @(testCountRate);
expect(testRequest.startTime).to(equal(time1));
expect(testRequest.endTime).to(equal(time2));
expect(testRequest.updateMode).to(equal(SDLUpdateModeCountUp));
expect(testRequest.audioStreamingIndicator).to(equal(SDLAudioStreamingIndicatorPlayPause));
+ expect(testRequest.forwardSeekIndicator).to(equal(forwardSeekTest));
+ expect(testRequest.backSeekIndicator).to(equal(backSeekTest));
+ expect(testRequest.countRate).to(equal(testCountRate));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m
index 8cd897977..ddfd6333e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m
@@ -20,57 +20,81 @@
QuickSpecBegin(SDLShowSpec)
-SDLImage* image1 = [[SDLImage alloc] init];
-SDLImage* image2 = [[SDLImage alloc] init];
-SDLSoftButton* button = [[SDLSoftButton alloc] init];
-
-NSArray<SDLMetadataType> *formatArray = @[SDLMetadataTypeMediaArtist,SDLMetadataTypeMediaTitle];
-SDLMetadataTags* testMetadata = [[SDLMetadataTags alloc] initWithTextFieldTypes:formatArray mainField2:formatArray mainField3:formatArray mainField4:formatArray];
-
describe(@"Getter/Setter Tests", ^ {
- __block SDLTemplateConfiguration *testTemplateConfig = nil;
+ __block NSString *testString1 = @"Test 1";
+ __block NSString *testString2 = @"Test 2";
+ __block NSString *testString3 = @"Test 3";
+ __block NSString *testString4 = @"Test 4";
+ __block NSString *testStatusBarString = @"Test Status";
+ __block NSString *testMediaClockString = @"Test Clock";
+ __block NSString *testMediaTrackString = @"Test Track";
+ __block NSString *testTemplateTitleString = @"Hello World";
+ __block SDLImage *testGraphic = nil;
+ __block SDLImage *testSecondaryGraphic = nil;
+ __block NSArray<NSString *> *testCustomPresets = nil;
+ __block SDLSoftButton *testButton = nil;
+ __block NSArray<SDLSoftButton *> *testSoftButtons = nil;
+ __block SDLMetadataType testType1 = SDLMetadataTypeHumidity;
+ __block SDLMetadataType testType2 = SDLMetadataTypeRating;
+ __block SDLMetadataType testType3 = SDLMetadataTypeMediaYear;
+ __block SDLMetadataType testType4 = SDLMetadataTypeWeatherTerm;
+ __block SDLTextAlignment testAlignment = SDLTextAlignmentCenter;
+ __block SDLMetadataTags *testMetadata = nil;
+ __block SDLTemplateConfiguration *testTemplateConfiguration = nil;
__block int testWindowID = 4;
beforeEach(^{
- testTemplateConfig = [[SDLTemplateConfiguration alloc] initWithPredefinedLayout:SDLPredefinedLayoutMedia];
+ testGraphic = [[SDLImage alloc] initWithName:@"test name" isTemplate:false];
+ testSecondaryGraphic = [[SDLImage alloc] initWithName:@"test name 2" isTemplate:false];
+ testCustomPresets = @[testString1];
+ testButton = [[SDLSoftButton alloc] initWithType:SDLSoftButtonTypeText text:@"Test Button" image:nil highlighted:NO buttonId:0 systemAction:nil handler:nil];
+ testSoftButtons = @[testButton];
+ testMetadata = [[SDLMetadataTags alloc] initWithTextFieldTypes:@[testType1] mainField2:@[testType2] mainField3:@[testType3] mainField4:@[testType4]];
+ testTemplateConfiguration = [[SDLTemplateConfiguration alloc] initWithPredefinedLayout:SDLPredefinedLayoutMedia];
});
it(@"Should set and get correctly", ^ {
SDLShow* testRequest = [[SDLShow alloc] init];
- testRequest.mainField1 = @"field1";
- testRequest.mainField2 = @"field2";
- testRequest.mainField3 = @"field3";
- testRequest.mainField4 = @"field4";
+ testRequest.mainField1 = testString1;
+ testRequest.mainField2 = testString2;
+ testRequest.mainField3 = testString3;
+ testRequest.mainField4 = testString4;
testRequest.alignment = SDLTextAlignmentLeft;
- testRequest.statusBar = @"status";
- testRequest.mediaClock = @"TheTime";
- testRequest.mediaTrack = @"In The Clear";
- testRequest.templateTitle = @"Hello World";
- testRequest.graphic = image1;
- testRequest.secondaryGraphic = image2;
- testRequest.softButtons = [@[button] mutableCopy];
- testRequest.customPresets = [@[@"preset1", @"preset2"] mutableCopy];
+ testRequest.statusBar = testStatusBarString;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testRequest.mediaClock = testMediaClockString;
+#pragma clang diagnostic pop
+ testRequest.mediaTrack = testMediaTrackString;
+ testRequest.templateTitle = testTemplateTitleString;
+ testRequest.graphic = testGraphic;
+ testRequest.secondaryGraphic = testSecondaryGraphic;
+ testRequest.softButtons = testSoftButtons;
+ testRequest.customPresets = testCustomPresets;
testRequest.metadataTags = testMetadata;
testRequest.windowID = @(testWindowID);
- testRequest.templateConfiguration = testTemplateConfig;
+ testRequest.templateConfiguration = testTemplateConfiguration;
- expect(testRequest.mainField1).to(equal(@"field1"));
- expect(testRequest.mainField2).to(equal(@"field2"));
- expect(testRequest.mainField3).to(equal(@"field3"));
- expect(testRequest.mainField4).to(equal(@"field4"));
+ expect(testRequest.mainField1).to(equal(testString1));
+ expect(testRequest.mainField2).to(equal(testString2));
+ expect(testRequest.mainField3).to(equal(testString3));
+ expect(testRequest.mainField4).to(equal(testString4));
expect(testRequest.alignment).to(equal(SDLTextAlignmentLeft));
- expect(testRequest.statusBar).to(equal(@"status"));
- expect(testRequest.mediaClock).to(equal(@"TheTime"));
- expect(testRequest.mediaTrack).to(equal(@"In The Clear"));
- expect(testRequest.templateTitle).to(equal(@"Hello World"));
- expect(testRequest.graphic).to(equal(image1));
- expect(testRequest.secondaryGraphic).to(equal(image2));
- expect(testRequest.softButtons).to(equal([@[button] mutableCopy]));
- expect(testRequest.customPresets).to(equal([@[@"preset1", @"preset2"] mutableCopy]));
+ expect(testRequest.statusBar).to(equal(testStatusBarString));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.mediaClock).to(equal(testMediaClockString));
+#pragma clang diagnostic pop
+ expect(testRequest.mediaTrack).to(equal(testMediaTrackString));
+ expect(testRequest.templateTitle).to(equal(testTemplateTitleString));
+ expect(testRequest.graphic).to(equal(testGraphic));
+ expect(testRequest.secondaryGraphic).to(equal(testSecondaryGraphic));
+ expect(testRequest.softButtons).to(equal(testSoftButtons));
+ expect(testRequest.customPresets).to(equal(testCustomPresets));
expect(testRequest.metadataTags).to(equal(testMetadata));
expect(testRequest.windowID).to(equal(testWindowID));
- expect(testRequest.templateConfiguration).to(equal(testTemplateConfig));
+ expect(testRequest.templateConfiguration).to(equal(testTemplateConfiguration));
});
it(@"Should return nil if not set", ^{
@@ -82,7 +106,10 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.mainField4).to(beNil());
expect(testRequest.alignment).to(beNil());
expect(testRequest.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testRequest.mediaTrack).to(beNil());
expect(testRequest.templateTitle).to(beNil());
expect(testRequest.graphic).to(beNil());
@@ -95,42 +122,21 @@ describe(@"Getter/Setter Tests", ^ {
});
describe(@"initializing", ^{
- __block NSString *testString1 = @"Test 1";
- __block NSString *testString2 = @"Test 2";
- __block NSString *testString3 = @"Test 3";
- __block NSString *testString4 = @"Test 4";
- __block NSString *testStatusBarString = @"Test Status";
- __block NSString *testMediaClockString = @"Test Clock";
- __block NSString *testMediaTrackString = @"Test Track";
- __block NSString *testTemplateTitleString = @"Hello World";
- __block SDLImage *testGraphic = nil;
- __block NSArray<NSString *> *testCustomPresets = nil;
- __block SDLSoftButton *testButton = nil;
- __block NSArray<SDLSoftButton *> *testSoftButtons = nil;
- __block SDLMetadataType testType1 = SDLMetadataTypeHumidity;
- __block SDLMetadataType testType2 = SDLMetadataTypeRating;
- __block SDLMetadataType testType3 = SDLMetadataTypeMediaYear;
- __block SDLMetadataType testType4 = SDLMetadataTypeWeatherTerm;
- __block SDLTextAlignment testAlignment = SDLTextAlignmentCenter;
- __block SDLMetadataTags *testTags = nil;
-
- beforeEach(^{
- testGraphic = [[SDLImage alloc] initWithName:@"test name" isTemplate:false];
- testCustomPresets = @[testString1];
- testButton = [[SDLSoftButton alloc] initWithType:SDLSoftButtonTypeText text:@"Test Button" image:nil highlighted:NO buttonId:0 systemAction:nil handler:nil];
- testSoftButtons = @[testButton];
- testTags = [[SDLMetadataTags alloc] initWithTextFieldTypes:@[testType1] mainField2:@[testType2] mainField3:@[testType3] mainField4:@[testType4]];
- });
-
it(@"should initialize with initWithMainField1:mainField2:alignment:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField2:testString2 alignment:testAlignment];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(equal(testString1));
expect(testShow.mainField2).to(equal(testString2));
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(equal(testAlignment));
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -139,14 +145,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.customPresets).to(beNil());
expect(testShow.metadataTags).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testShow = [[SDLShow alloc] initWithMainField1:nil mainField2:nil alignment:nil];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(beNil());
expect(testShow.mainField2).to(beNil());
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(beNil());
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -157,14 +169,20 @@ describe(@"Getter/Setter Tests", ^ {
});
it(@"should initialize correctly with initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField1Type:testType1 mainField2:testString2 mainField2Type:testType2 alignment:testAlignment];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(equal(testString1));
expect(testShow.mainField2).to(equal(testString2));
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(equal(testAlignment));
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -176,14 +194,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.metadataTags.mainField3).to(beNil());
expect(testShow.metadataTags.mainField4).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testShow = [[SDLShow alloc] initWithMainField1:nil mainField1Type:nil mainField2:nil mainField2Type:nil alignment:nil];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(beNil());
expect(testShow.mainField2).to(beNil());
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(beNil());
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -194,14 +218,20 @@ describe(@"Getter/Setter Tests", ^ {
});
it(@"should initialize correctly with initWithMainField1:mainField2:mainField3:mainField4:alignment:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField2:testString2 mainField3:testString3 mainField4:testString4 alignment:testAlignment];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(equal(testString1));
expect(testShow.mainField2).to(equal(testString2));
expect(testShow.mainField3).to(equal(testString3));
expect(testShow.mainField4).to(equal(testString4));
expect(testShow.alignment).to(equal(testAlignment));
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -213,14 +243,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.metadataTags.mainField3).to(beNil());
expect(testShow.metadataTags.mainField4).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testShow = [[SDLShow alloc] initWithMainField1:nil mainField2:nil mainField3:nil mainField4:nil alignment:nil];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(beNil());
expect(testShow.mainField2).to(beNil());
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(beNil());
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -231,14 +267,20 @@ describe(@"Getter/Setter Tests", ^ {
});
it(@"should initialize correctly with initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField1Type:testType1 mainField2:testString2 mainField2Type:testType2 mainField3:testString3 mainField3Type:testType3 mainField4:testString4 mainField4Type:testType4 alignment:testAlignment];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(equal(testString1));
expect(testShow.mainField2).to(equal(testString2));
expect(testShow.mainField3).to(equal(testString3));
expect(testShow.mainField4).to(equal(testString4));
expect(testShow.alignment).to(equal(testAlignment));
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -250,14 +292,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.metadataTags.mainField3).to(contain(testType3));
expect(testShow.metadataTags.mainField4).to(contain(testType4));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testShow = [[SDLShow alloc] initWithMainField1:nil mainField1Type:nil mainField2:nil mainField2Type:nil mainField3:nil mainField3Type:nil mainField4:nil mainField4Type:nil alignment:nil];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(beNil());
expect(testShow.mainField2).to(beNil());
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(beNil());
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -268,14 +316,20 @@ describe(@"Getter/Setter Tests", ^ {
});
it(@"should initialize correctly with initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField2:testString2 alignment:testAlignment statusBar:testStatusBarString mediaClock:testMediaClockString mediaTrack:testMediaTrackString];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(equal(testString1));
expect(testShow.mainField2).to(equal(testString2));
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(equal(testAlignment));
expect(testShow.statusBar).to(equal(testStatusBarString));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(equal(testMediaClockString));
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(equal(testMediaTrackString));
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -287,14 +341,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.metadataTags.mainField3).to(beNil());
expect(testShow.metadataTags.mainField4).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testShow = [[SDLShow alloc] initWithMainField1:nil mainField2:nil alignment:nil statusBar:nil mediaClock:nil mediaTrack:nil];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(beNil());
expect(testShow.mainField2).to(beNil());
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(beNil());
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -305,14 +365,20 @@ describe(@"Getter/Setter Tests", ^ {
});
it(@"should initialize correctly with initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:", ^{
- SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField2:testString2 mainField3:testString3 mainField4:testString4 alignment:testAlignment statusBar:testStatusBarString mediaClock:testMediaClockString mediaTrack:testMediaTrackString graphic:testGraphic softButtons:testSoftButtons customPresets:testCustomPresets textFieldMetadata:testTags];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField2:testString2 mainField3:testString3 mainField4:testString4 alignment:testAlignment statusBar:testStatusBarString mediaClock:testMediaClockString mediaTrack:testMediaTrackString graphic:testGraphic softButtons:testSoftButtons customPresets:testCustomPresets textFieldMetadata:testMetadata];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(equal(testString1));
expect(testShow.mainField2).to(equal(testString2));
expect(testShow.mainField3).to(equal(testString3));
expect(testShow.mainField4).to(equal(testString4));
expect(testShow.alignment).to(equal(testAlignment));
expect(testShow.statusBar).to(equal(testStatusBarString));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(equal(testMediaClockString));
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(equal(testMediaTrackString));
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(equal(testGraphic));
@@ -324,14 +390,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.metadataTags.mainField3).to(contain(testType3));
expect(testShow.metadataTags.mainField4).to(contain(testType4));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testShow = [[SDLShow alloc] initWithMainField1:nil mainField2:nil mainField3:nil mainField4:nil alignment:nil statusBar:nil mediaClock:nil mediaTrack:nil graphic:nil softButtons:nil customPresets:nil textFieldMetadata:nil];
+#pragma clang diagnostic pop
expect(testShow.mainField1).to(beNil());
expect(testShow.mainField2).to(beNil());
expect(testShow.mainField3).to(beNil());
expect(testShow.mainField4).to(beNil());
expect(testShow.alignment).to(beNil());
expect(testShow.statusBar).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testShow.mediaClock).to(beNil());
+#pragma clang diagnostic pop
expect(testShow.mediaTrack).to(beNil());
expect(testShow.templateTitle).to(beNil());
expect(testShow.graphic).to(beNil());
@@ -341,45 +413,70 @@ describe(@"Getter/Setter Tests", ^ {
expect(testShow.metadataTags).to(beNil());
});
+ it(@"should initialize correctly with initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:", ^{
+ SDLShow *testShow = [[SDLShow alloc] initWithMainField1:testString1 mainField2:testString2 mainField3:testString3 mainField4:testString4 alignment:testAlignment statusBar:testStatusBarString mediaTrack:testMediaTrackString graphic:testGraphic secondaryGraphic:testSecondaryGraphic softButtons:testSoftButtons customPresets:testCustomPresets metadataTags:testMetadata templateTitle:testTemplateTitleString windowID:@(testWindowID) templateConfiguration:testTemplateConfiguration];
+ expect(testShow.mainField1).to(equal(testString1));
+ expect(testShow.mainField2).to(equal(testString2));
+ expect(testShow.mainField3).to(equal(testString3));
+ expect(testShow.mainField4).to(equal(testString4));
+ expect(testShow.alignment).to(equal(testAlignment));
+ expect(testShow.statusBar).to(equal(testStatusBarString));
+ expect(testShow.mediaTrack).to(equal(testMediaTrackString));
+ expect(testShow.graphic).to(equal(testGraphic));
+ expect(testShow.secondaryGraphic).to(equal(testSecondaryGraphic));
+ expect(testShow.softButtons).to(contain(testButton));
+ expect(testShow.customPresets).to(contain(testString1));
+ expect(testShow.metadataTags.mainField1).to(contain(testType1));
+ expect(testShow.metadataTags.mainField2).to(contain(testType2));
+ expect(testShow.metadataTags.mainField3).to(contain(testType3));
+ expect(testShow.metadataTags.mainField4).to(contain(testType4));
+ expect(testShow.templateTitle).to(equal(testTemplateTitleString));
+ expect(testShow.windowID).to(equal(@(testWindowID)));
+ expect(testShow.templateConfiguration).to(equal(testTemplateConfiguration));
+ });
+
it(@"Should get correctly when initialized with a dictionary", ^ {
NSMutableDictionary* dict = [@{SDLRPCParameterNameRequest:
@{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameMainField1:@"field1",
- SDLRPCParameterNameMainField2:@"field2",
- SDLRPCParameterNameMainField3:@"field3",
- SDLRPCParameterNameMainField4:@"field4",
+ @{SDLRPCParameterNameMainField1:testString1,
+ SDLRPCParameterNameMainField2:testString2,
+ SDLRPCParameterNameMainField3:testString3,
+ SDLRPCParameterNameMainField4:testString4,
SDLRPCParameterNameAlignment:SDLTextAlignmentLeft,
- SDLRPCParameterNameStatusBar:@"status",
- SDLRPCParameterNameMediaClock:@"TheTime",
- SDLRPCParameterNameMediaTrack:@"In The Clear",
- SDLRPCParameterNameTemplateTitle: @"Hello World",
- SDLRPCParameterNameGraphic:image1,
- SDLRPCParameterNameSecondaryGraphic:image2,
- SDLRPCParameterNameSoftButtons:[@[button] mutableCopy],
- SDLRPCParameterNameCustomPresets:[@[@"preset1", @"preset2"] mutableCopy],
+ SDLRPCParameterNameStatusBar:testStatusBarString,
+ SDLRPCParameterNameMediaClock:testMediaClockString,
+ SDLRPCParameterNameMediaTrack:testMediaTrackString,
+ SDLRPCParameterNameTemplateTitle: testTemplateTitleString,
+ SDLRPCParameterNameGraphic:testGraphic,
+ SDLRPCParameterNameSecondaryGraphic:testSecondaryGraphic,
+ SDLRPCParameterNameSoftButtons:testSoftButtons,
+ SDLRPCParameterNameCustomPresets:testCustomPresets,
SDLRPCParameterNameMetadataTags:testMetadata,
SDLRPCParameterNameWindowId:@(testWindowID),
- SDLRPCParameterNameTemplateConfiguration:testTemplateConfig
+ SDLRPCParameterNameTemplateConfiguration:testTemplateConfiguration
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameShow}} mutableCopy];
SDLShow* testRequest = [[SDLShow alloc] initWithDictionary:dict];
- expect(testRequest.mainField1).to(equal(@"field1"));
- expect(testRequest.mainField2).to(equal(@"field2"));
- expect(testRequest.mainField3).to(equal(@"field3"));
- expect(testRequest.mainField4).to(equal(@"field4"));
+ expect(testRequest.mainField1).to(equal(testString1));
+ expect(testRequest.mainField2).to(equal(testString2));
+ expect(testRequest.mainField3).to(equal(testString3));
+ expect(testRequest.mainField4).to(equal(testString4));
expect(testRequest.alignment).to(equal(SDLTextAlignmentLeft));
- expect(testRequest.statusBar).to(equal(@"status"));
- expect(testRequest.mediaClock).to(equal(@"TheTime"));
- expect(testRequest.mediaTrack).to(equal(@"In The Clear"));
+ expect(testRequest.statusBar).to(equal(testStatusBarString));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.mediaClock).to(equal(testMediaClockString));
+#pragma clang diagnostic pop
+ expect(testRequest.mediaTrack).to(equal(testMediaTrackString));
expect(testRequest.templateTitle).to(equal(testTemplateTitleString));
- expect(testRequest.graphic).to(equal(image1));
- expect(testRequest.secondaryGraphic).to(equal(image2));
- expect(testRequest.softButtons).to(equal([@[button] mutableCopy]));
- expect(testRequest.customPresets).to(equal([@[@"preset1", @"preset2"] mutableCopy]));
+ expect(testRequest.graphic).to(equal(testGraphic));
+ expect(testRequest.secondaryGraphic).to(equal(testSecondaryGraphic));
+ expect(testRequest.softButtons).to(equal(testSoftButtons));
+ expect(testRequest.customPresets).to(equal(testCustomPresets));
expect(testRequest.metadataTags).to(equal(testMetadata));
expect(testRequest.windowID).to(equal(testWindowID));
- expect(testRequest.templateConfiguration).to(equal(testTemplateConfig));
+ expect(testRequest.templateConfiguration).to(equal(testTemplateConfiguration));
});
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
index 7e3a98f36..558bca573 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
@@ -30,9 +30,9 @@ describe(@"getter/setter tests", ^{
testRequest.emergencyEvent = @YES;
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @YES;
- testRequest.externalTemperature = @YES;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testRequest.externalTemperature = @YES;
testRequest.fuelLevel = @YES;
testRequest.fuelLevel_State = @YES;
#pragma clang diagnostic pop
@@ -49,6 +49,7 @@ describe(@"getter/setter tests", ^{
testRequest.prndl = @YES;
#pragma clang diagnostic pop
testRequest.rpm = @YES;
+ testRequest.seatOccupancy = @YES;
testRequest.speed = @YES;
testRequest.stabilityControlsStatus = @YES;
testRequest.steeringWheelAngle = @YES;
@@ -56,6 +57,7 @@ describe(@"getter/setter tests", ^{
testRequest.turnSignal = @YES;
testRequest.windowStatus = @YES;
testRequest.wiperStatus = @YES;
+ testRequest.climateData = @YES;
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -71,9 +73,9 @@ describe(@"getter/setter tests", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -90,6 +92,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -97,6 +100,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
@@ -135,6 +139,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:@YES,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:@YES,
+ SDLRPCParameterNameSeatOccupancy:@YES,
SDLRPCParameterNameSpeed:@YES,
SDLRPCParameterNameStabilityControlsStatus:@YES,
SDLRPCParameterNameSteeringWheelAngle:@YES,
@@ -142,6 +147,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameTurnSignal:@YES,
SDLRPCParameterNameWindowStatus:@YES,
SDLRPCParameterNameWiperStatus:@YES,
+ SDLRPCParameterNameClimateData:@YES,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}};
SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithDictionary:dict];
@@ -160,9 +166,9 @@ describe(@"getter/setter tests", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -179,6 +185,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -186,6 +193,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
});
@@ -208,9 +216,9 @@ describe(@"test initializers", ^{
expect(testRequest.emergencyEvent).to(beNil());
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(beNil());
- expect(testRequest.externalTemperature).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(beNil());
expect(testRequest.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -227,6 +235,7 @@ describe(@"test initializers", ^{
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testRequest.rpm).to(beNil());
+ expect(testRequest.seatOccupancy).to(beNil());
expect(testRequest.speed).to(beNil());
expect(testRequest.stabilityControlsStatus).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
@@ -234,11 +243,66 @@ describe(@"test initializers", ^{
expect(testRequest.turnSignal).to(beNil());
expect(testRequest.windowStatus).to(beNil());
expect(testRequest.wiperStatus).to(beNil());
+ expect(testRequest.climateData).to(beNil());
+ });
+ });
+
+ context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES cloudAppVehicleID:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES electronicParkBrakeStatus:YES emergencyEvent:YES engineOilLife:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES fuelRange:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES turnSignal:YES wiperStatus:YES];
+#pragma clang diagnostic pop
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testRequest.accPedalPosition).to(equal(@YES));
+ expect(testRequest.airbagStatus).to(equal(@YES));
+ expect(testRequest.beltStatus).to(equal(@YES));
+ expect(testRequest.bodyInformation).to(equal(@YES));
+ expect(testRequest.cloudAppVehicleID).to(equal(@YES));
+ expect(testRequest.clusterModeStatus).to(equal(@YES));
+ expect(testRequest.deviceStatus).to(equal(@YES));
+ expect(testRequest.driverBraking).to(equal(@YES));
+ expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
+ expect(testRequest.emergencyEvent).to(equal(@YES));
+ expect(testRequest.engineOilLife).to(equal(@YES));
+ expect(testRequest.engineTorque).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
+ expect(testRequest.fuelLevel).to(equal(@YES));
+ expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic pop
+ expect(testRequest.fuelRange).to(equal(@YES));
+ expect(testRequest.gearStatus).to(beNil());
+ expect(testRequest.gps).to(equal(@YES));
+ expect(testRequest.handsOffSteering).to(beNil());
+ expect(testRequest.headLampStatus).to(equal(@YES));
+ expect(testRequest.instantFuelConsumption).to(equal(@YES));
+ expect(testRequest.myKey).to(equal(@YES));
+ expect(testRequest.odometer).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.prndl).to(equal(@YES));
+#pragma clang diagnostic pop
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(beNil());
+ expect(testRequest.speed).to(equal(@YES));
+ expect(testRequest.stabilityControlsStatus).to(beNil());
+ expect(testRequest.steeringWheelAngle).to(equal(@YES));
+ expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
+ expect(testRequest.windowStatus).to(beNil());
+ expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(beNil());
});
});
context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES externalTemperature:@YES turnSignal:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES windowStatus:@YES];
+#pragma clang diagnostic pop
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -254,9 +318,57 @@ describe(@"test initializers", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.externalTemperature).to(equal(@YES));
+ expect(testRequest.fuelLevel).to(beNil());
+ expect(testRequest.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testRequest.fuelRange).to(equal(@YES));
+ expect(testRequest.gearStatus).to(equal(@YES));
+ expect(testRequest.gps).to(equal(@YES));
+ expect(testRequest.handsOffSteering).to(equal(@YES));
+ expect(testRequest.headLampStatus).to(equal(@YES));
+ expect(testRequest.instantFuelConsumption).to(equal(@YES));
+ expect(testRequest.myKey).to(equal(@YES));
+ expect(testRequest.odometer).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(beNil());
+ expect(testRequest.speed).to(equal(@YES));
+ expect(testRequest.stabilityControlsStatus).to(equal(@YES));
+ expect(testRequest.steeringWheelAngle).to(equal(@YES));
+ expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
+ expect(testRequest.windowStatus).to(equal(@YES));
+ expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(beNil());
+ });
+ });
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:", ^{
+ SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES climateData:@YES turnSignal:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES windowStatus:@YES handsOffSteering:@YES seatOccupancy:@YES];
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testRequest.accPedalPosition).to(equal(@YES));
+ expect(testRequest.airbagStatus).to(equal(@YES));
+ expect(testRequest.beltStatus).to(equal(@YES));
+ expect(testRequest.bodyInformation).to(equal(@YES));
+ expect(testRequest.cloudAppVehicleID).to(equal(@YES));
+ expect(testRequest.clusterModeStatus).to(equal(@YES));
+ expect(testRequest.deviceStatus).to(equal(@YES));
+ expect(testRequest.driverBraking).to(equal(@YES));
+ expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
+ expect(testRequest.emergencyEvent).to(equal(@YES));
+ expect(testRequest.engineOilLife).to(equal(@YES));
+ expect(testRequest.engineTorque).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(beNil());
expect(testRequest.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -273,6 +385,7 @@ describe(@"test initializers", ^{
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -280,6 +393,7 @@ describe(@"test initializers", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
index f71889b5f..b2b52ad5e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
@@ -30,9 +30,9 @@ describe(@"getter/setter tests", ^{
testRequest.emergencyEvent = @YES;
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @YES;
- testRequest.externalTemperature = @YES;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testRequest.externalTemperature = @YES;
testRequest.fuelLevel = @YES;
testRequest.fuelLevel_State = @YES;
#pragma clang diagnostic pop
@@ -49,6 +49,7 @@ describe(@"getter/setter tests", ^{
testRequest.prndl = @YES;
#pragma clang diagnostic pop
testRequest.rpm = @YES;
+ testRequest.seatOccupancy = @YES;
testRequest.speed = @YES;
testRequest.stabilityControlsStatus = @YES;
testRequest.steeringWheelAngle = @YES;
@@ -56,6 +57,7 @@ describe(@"getter/setter tests", ^{
testRequest.turnSignal = @YES;
testRequest.windowStatus = @YES;
testRequest.wiperStatus = @YES;
+ testRequest.climateData = @YES;
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -71,9 +73,9 @@ describe(@"getter/setter tests", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -90,12 +92,14 @@ describe(@"getter/setter tests", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
@@ -134,6 +138,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:@YES,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:@YES,
+ SDLRPCParameterNameSeatOccupancy:@YES,
SDLRPCParameterNameSpeed:@YES,
SDLRPCParameterNameStabilityControlsStatus:@YES,
SDLRPCParameterNameSteeringWheelAngle:@YES,
@@ -141,6 +146,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameTurnSignal:@YES,
SDLRPCParameterNameWindowStatus:@YES,
SDLRPCParameterNameWiperStatus:@YES,
+ SDLRPCParameterNameClimateData:@YES,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}};
SDLUnsubscribeVehicleData* testRequest = [[SDLUnsubscribeVehicleData alloc] initWithDictionary:dict];
@@ -159,9 +165,9 @@ describe(@"getter/setter tests", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
@@ -178,6 +184,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -185,6 +192,7 @@ describe(@"getter/setter tests", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
});
@@ -207,9 +215,9 @@ describe(@"test initializers", ^{
expect(testRequest.emergencyEvent).to(beNil());
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(beNil());
- expect(testRequest.externalTemperature).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(beNil());
expect(testRequest.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -226,6 +234,7 @@ describe(@"test initializers", ^{
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testRequest.rpm).to(beNil());
+ expect(testRequest.seatOccupancy).to(beNil());
expect(testRequest.speed).to(beNil());
expect(testRequest.stabilityControlsStatus).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
@@ -233,6 +242,7 @@ describe(@"test initializers", ^{
expect(testRequest.turnSignal).to(beNil());
expect(testRequest.windowStatus).to(beNil());
expect(testRequest.wiperStatus).to(beNil());
+ expect(testRequest.climateData).to(beNil());
});
});
@@ -256,9 +266,9 @@ describe(@"test initializers", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic push
@@ -275,17 +285,19 @@ describe(@"test initializers", ^{
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(beNil());
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(beNil());
expect(testRequest.steeringWheelAngle).to(equal(@YES));
expect(testRequest.tirePressure).to(equal(@YES));
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(beNil());
});
});
context (@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:", ^{
- SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES externalTemperature:@YES turnSignal:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES windowStatus:@YES];
+ SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES externalTemperature:@YES turnSignal:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES windowStatus:@YES];
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -301,9 +313,9 @@ describe(@"test initializers", ^{
expect(testRequest.emergencyEvent).to(equal(@YES));
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
#pragma clang diagnostic push
@@ -320,6 +332,7 @@ describe(@"test initializers", ^{
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(beNil());
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.stabilityControlsStatus).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -327,7 +340,58 @@ describe(@"test initializers", ^{
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.windowStatus).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(beNil());
+ });
+ });
+ context (@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES instantFuelConsumption:@YES fuelRange:@YES climateData:@YES turnSignal:@YES gearStatus:@YES tirePressure:@YES odometer:@YES beltStatus:@YES bodyInformation:@YES deviceStatus:@YES driverBraking:@YES wiperStatus:@YES headLampStatus:@YES engineTorque:@YES accPedalPosition:@YES steeringWheelAngle:@YES engineOilLife:@YES electronicParkBrakeStatus:@YES cloudAppVehicleID:@YES stabilityControlsStatus:@YES eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES windowStatus:@YES handsOffSteering:@YES seatOccupancy:@YES];
+#pragma clang diagnostic pop
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testRequest.accPedalPosition).to(equal(@YES));
+ expect(testRequest.airbagStatus).to(equal(@YES));
+ expect(testRequest.beltStatus).to(equal(@YES));
+ expect(testRequest.bodyInformation).to(equal(@YES));
+ expect(testRequest.cloudAppVehicleID).to(equal(@YES));
+ expect(testRequest.clusterModeStatus).to(equal(@YES));
+ expect(testRequest.deviceStatus).to(equal(@YES));
+ expect(testRequest.driverBraking).to(equal(@YES));
+ expect(testRequest.eCallInfo).to(equal(@YES));
+ expect(testRequest.electronicParkBrakeStatus).to(equal(@YES));
+ expect(testRequest.emergencyEvent).to(equal(@YES));
+ expect(testRequest.engineOilLife).to(equal(@YES));
+ expect(testRequest.engineTorque).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.externalTemperature).to(beNil());
+ expect(testRequest.fuelLevel).to(beNil());
+ expect(testRequest.fuelLevel_State).to(beNil());
+#pragma clang diagnostic push
+ expect(testRequest.fuelRange).to(equal(@YES));
+ expect(testRequest.gearStatus).to(equal(@YES));
+ expect(testRequest.gps).to(equal(@YES));
+ expect(testRequest.handsOffSteering).to(equal(@YES));
+ expect(testRequest.headLampStatus).to(equal(@YES));
+ expect(testRequest.instantFuelConsumption).to(equal(@YES));
+ expect(testRequest.myKey).to(equal(@YES));
+ expect(testRequest.odometer).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.seatOccupancy).to(equal(@YES));
+ expect(testRequest.speed).to(equal(@YES));
+ expect(testRequest.stabilityControlsStatus).to(equal(@YES));
+ expect(testRequest.steeringWheelAngle).to(equal(@YES));
+ expect(testRequest.tirePressure).to(equal(@YES));
+ expect(testRequest.turnSignal).to(equal(@YES));
+ expect(testRequest.windowStatus).to(equal(@YES));
+ expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.climateData).to(equal(@YES));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
index 091dd83ba..2c13dcd80 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
@@ -50,6 +50,8 @@ SDLElectronicParkBrakeStatus electronicParkBrakeStatus = SDLElectronicParkBrakeS
const BOOL handsOffSteering = YES;
SDLStabilityControlsStatus *stabilityControlsStatus = [[SDLStabilityControlsStatus alloc] init];
NSArray<SDLWindowStatus *> *windowStatus = @[[[SDLWindowStatus alloc] init], [[SDLWindowStatus alloc] init]];
+SDLClimateData *climateData = [[SDLClimateData alloc] init];
+SDLSeatOccupancy *seatOccupancy = [[SDLSeatOccupancy alloc] init];
describe(@"getter/setter tests", ^{
context(@"init and assign", ^{
@@ -67,9 +69,9 @@ describe(@"getter/setter tests", ^{
testResponse.emergencyEvent = emergencyEvent;
testResponse.engineOilLife = @(engineOilLife);
testResponse.engineTorque = @(engineTorque);
- testResponse.externalTemperature = @(externalTemperature);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testResponse.externalTemperature = @(externalTemperature);
testResponse.fuelLevel = @(fuelLevel);
testResponse.fuelLevel_State = fuelLevel_State;
#pragma clang diagnostic pop
@@ -86,6 +88,7 @@ describe(@"getter/setter tests", ^{
testResponse.prndl = prndl;
#pragma clang diagnostic pop
testResponse.rpm = @(rpm);
+ testResponse.seatOccupancy = seatOccupancy;
testResponse.speed = @(speed);
testResponse.stabilityControlsStatus = stabilityControlsStatus;
testResponse.steeringWheelAngle = @(steeringWheelAngle);
@@ -94,6 +97,7 @@ describe(@"getter/setter tests", ^{
testResponse.vin = vin;
testResponse.windowStatus = windowStatus;
testResponse.wiperStatus = wiperStatus;
+ testResponse.climateData = climateData;
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(@(accPedalPosition)));
@@ -109,9 +113,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
expect(testResponse.engineTorque).to(equal(@(engineTorque)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
expect(testResponse.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
#pragma clang diagnostic pop
@@ -128,6 +132,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(prndl));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(equal(seatOccupancy));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
@@ -136,6 +141,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(equal(vin));
expect(testResponse.windowStatus).to(equal(windowStatus));
expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.climateData).to(equal(climateData));
});
});
@@ -174,6 +180,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:prndl,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:@(rpm),
+ SDLRPCParameterNameSeatOccupancy:seatOccupancy,
SDLRPCParameterNameSpeed:@(speed),
SDLRPCParameterNameStabilityControlsStatus:stabilityControlsStatus,
SDLRPCParameterNameSteeringWheelAngle:@(steeringWheelAngle),
@@ -182,6 +189,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameVIN:vin,
SDLRPCParameterNameWindowStatus:windowStatus,
SDLRPCParameterNameWiperStatus:wiperStatus,
+ SDLRPCParameterNameClimateData:climateData,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
SDLGetVehicleDataResponse* testResponse = [[SDLGetVehicleDataResponse alloc] initWithDictionary:dict];
@@ -200,9 +208,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
expect(testResponse.engineTorque).to(equal(@(engineTorque)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
expect(testResponse.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
#pragma clang diagnostic pop
@@ -219,6 +227,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(prndl));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(equal(seatOccupancy));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
@@ -227,6 +236,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(equal(vin));
expect(testResponse.windowStatus).to(equal(windowStatus));
expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.climateData).to(equal(climateData));
});
});
@@ -246,9 +256,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(beNil());
expect(testResponse.engineOilLife).to(beNil());
expect(testResponse.engineTorque).to(beNil());
- expect(testResponse.externalTemperature).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
expect(testResponse.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -265,6 +275,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic push
expect(testResponse.rpm).to(beNil());
+ expect(testResponse.seatOccupancy).to(beNil());
expect(testResponse.speed).to(beNil());
expect(testResponse.stabilityControlsStatus).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
@@ -273,6 +284,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.vin).to(beNil());
expect(testResponse.windowStatus).to(beNil());
expect(testResponse.wiperStatus).to(beNil());
+ expect(testResponse.climateData).to(beNil());
});
});
@@ -292,9 +304,56 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
expect(testResponse.engineTorque).to(equal(@(engineTorque)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(externalTemperature));
+ expect(testResponse.fuelLevel).to(beNil());
+ expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.fuelRange).to(equal(fuelRangeArray));
+ expect(testResponse.gearStatus).to(equal(gearStatus));
+ expect(testResponse.gps).to(equal(gps));
+ expect(testResponse.handsOffSteering).to(equal(@(handsOffSteering)));
+ expect(testResponse.headLampStatus).to(equal(headLampStatus));
+ expect(testResponse.instantFuelConsumption).to(equal(@(instantFuelConsumption)));
+ expect(testResponse.myKey).to(equal(myKey));
+ expect(testResponse.odometer).to(equal(@(odometer)));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.speed).to(equal(@(speed)));
+ expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
+ expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
+ expect(testResponse.tirePressure).to(equal(tirePressure));
+ expect(testResponse.turnSignal).to(equal(turnSignal));
+ expect(testResponse.vin).to(equal(vin));
+ expect(testResponse.windowStatus).to(equal(windowStatus));
+ expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.climateData).to(beNil());
+ });
+ });
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:seatOccupancy:", ^{
+ it(@"should set all properties properly", ^{
+ SDLGetVehicleDataResponse *testResponse = [[SDLGetVehicleDataResponse alloc] initWithGps:gps speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:fuelRangeArray climateData:climateData turnSignal:turnSignal vin:vin gearStatus:gearStatus tirePressure:tirePressure odometer:@(odometer) beltStatus:beltStatus bodyInformation:bodyInformation deviceStatus:deviceStatus driverBraking:driverBraking wiperStatus:wiperStatus headLampStatus:headLampStatus engineTorque:@(engineTorque) accPedalPosition:@(accPedalPosition) steeringWheelAngle:@(steeringWheelAngle) engineOilLife:@(engineOilLife) electronicParkBrakeStatus:electronicParkBrakeStatus cloudAppVehicleID:cloudAppVehicleID stabilityControlsStatus:stabilityControlsStatus eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey windowStatus:windowStatus handsOffSteering:@(handsOffSteering) seatOccupancy:seatOccupancy];
+ expect(testResponse.accPedalPosition).to(equal(@(accPedalPosition)));
+ expect(testResponse.airbagStatus).to(equal(airbagStatus));
+ expect(testResponse.beltStatus).to(equal(beltStatus));
+ expect(testResponse.bodyInformation).to(equal(bodyInformation));
+ expect(testResponse.cloudAppVehicleID).to(equal(cloudAppVehicleID));
+ expect(testResponse.clusterModeStatus).to(equal(clusterModeStatus));
+ expect(testResponse.deviceStatus).to(equal(deviceStatus));
+ expect(testResponse.driverBraking).to(equal(driverBraking));
+ expect(testResponse.eCallInfo).to(equal(eCallInfo));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(electronicParkBrakeStatus));
+ expect(testResponse.emergencyEvent).to(equal(emergencyEvent));
+ expect(testResponse.engineOilLife).to(equal(@(engineOilLife)));
+ expect(testResponse.engineTorque).to(equal(@(engineTorque)));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
expect(testResponse.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -311,6 +370,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.seatOccupancy).to(equal(seatOccupancy));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.stabilityControlsStatus).to(equal(stabilityControlsStatus));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m
index d7e776aab..3ad17cb87 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m
@@ -16,7 +16,10 @@
QuickSpecBegin(SDLRegisterAppInterfaceResponseSpec)
__block SDLMsgVersion *sdlVersion = [[SDLMsgVersion alloc] initWithMajorVersion:0 minorVersion:0 patchVersion:0];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
__block SDLDisplayCapabilities* info = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic pop
__block SDLButtonCapabilities* button = [[SDLButtonCapabilities alloc] init];
__block SDLSoftButtonCapabilities* softButton = [[SDLSoftButtonCapabilities alloc] init];
__block SDLPresetBankCapabilities* presetBank = [[SDLPresetBankCapabilities alloc] init];__block
@@ -36,18 +39,18 @@ describe(@"Getter/Setter Tests", ^ {
testResponse.buttonCapabilities = @[button];
testResponse.softButtonCapabilities = @[softButton];
testResponse.presetBankCapabilities = presetBank;
+ testResponse.vehicleType = vehicle;
+ testResponse.systemSoftwareVersion = @"systemSoftwareVersion";
#pragma clang diagnostic pop
testResponse.hmiZoneCapabilities = @[SDLHMIZoneCapabilitiesBack, SDLHMIZoneCapabilitiesFront];
testResponse.speechCapabilities = @[SDLSpeechCapabilitiesSAPIPhonemes, SDLSpeechCapabilitiesSilence];
testResponse.vrCapabilities = @[SDLVRCapabilitiesText];
testResponse.audioPassThruCapabilities = @[audioPassThru];
testResponse.pcmStreamCapabilities = audioPassThru;
- testResponse.vehicleType = vehicle;
testResponse.prerecordedSpeech = @[SDLPrerecordedSpeechListen, SDLPrerecordedSpeechHelp];
testResponse.supportedDiagModes = @[@67, @99, @111];
testResponse.hmiCapabilities = hmiCapabilities;
testResponse.sdlVersion = @"sdlVersion";
- testResponse.systemSoftwareVersion = @"systemSoftwareVersion";
testResponse.iconResumed = @YES;
testResponse.sdlMsgVersion = sdlVersion;
@@ -60,18 +63,18 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.buttonCapabilities).to(equal(@[button]));
expect(testResponse.softButtonCapabilities).to(equal(@[softButton]));
expect(testResponse.presetBankCapabilities).to(equal(presetBank));
+ expect(testResponse.vehicleType).to(equal(vehicle));
+ expect(testResponse.systemSoftwareVersion).to(equal(@"systemSoftwareVersion"));
#pragma clang diagnostic pop
expect(testResponse.hmiZoneCapabilities).to(equal(@[SDLHMIZoneCapabilitiesBack, SDLHMIZoneCapabilitiesFront]));
expect(testResponse.speechCapabilities).to(equal(@[SDLSpeechCapabilitiesSAPIPhonemes, SDLSpeechCapabilitiesSilence]));
expect(testResponse.vrCapabilities).to(equal(@[SDLVRCapabilitiesText]));
expect(testResponse.audioPassThruCapabilities).to(equal(@[audioPassThru]));
expect(testResponse.pcmStreamCapabilities).to(equal(audioPassThru));
- expect(testResponse.vehicleType).to(equal(vehicle));
expect(testResponse.prerecordedSpeech).to(equal(@[SDLPrerecordedSpeechListen, SDLPrerecordedSpeechHelp]));
expect(testResponse.supportedDiagModes).to(equal(@[@67, @99, @111]));
expect(testResponse.hmiCapabilities).to(equal(hmiCapabilities));
expect(testResponse.sdlVersion).to(equal(@"sdlVersion"));
- expect(testResponse.systemSoftwareVersion).to(equal(@"systemSoftwareVersion"));
expect(testResponse.iconResumed).to(beTrue());
});
@@ -115,18 +118,18 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.buttonCapabilities).to(equal(@[button]));
expect(testResponse.softButtonCapabilities).to(equal(@[softButton]));
expect(testResponse.presetBankCapabilities).to(equal(presetBank));
+ expect(testResponse.vehicleType).to(equal(vehicle));
+ expect(testResponse.systemSoftwareVersion).to(equal(@"systemSoftwareVersion"));
#pragma clang diagnostic pop
expect(testResponse.hmiZoneCapabilities).to(equal(@[SDLHMIZoneCapabilitiesBack, SDLHMIZoneCapabilitiesFront]));
expect(testResponse.speechCapabilities).to(equal(@[SDLSpeechCapabilitiesSAPIPhonemes, SDLSpeechCapabilitiesSilence]));
expect(testResponse.vrCapabilities).to(equal(@[SDLVRCapabilitiesText]));
expect(testResponse.audioPassThruCapabilities).to(equal(@[audioPassThru]));
expect(testResponse.pcmStreamCapabilities).to(equal(audioPassThru));
- expect(testResponse.vehicleType).to(equal(vehicle));
expect(testResponse.prerecordedSpeech).to(equal(@[SDLPrerecordedSpeechListen, SDLPrerecordedSpeechHelp]));
expect(testResponse.supportedDiagModes).to(equal(@[@67, @99, @111]));
expect(testResponse.hmiCapabilities).to(equal(hmiCapabilities));
expect(testResponse.sdlVersion).to(equal(@"sdlVersion"));
- expect(testResponse.systemSoftwareVersion).to(equal(@"systemSoftwareVersion"));
expect(testResponse.iconResumed).to(beTrue());
});
@@ -144,18 +147,18 @@ describe(@"Getter/Setter Tests", ^ {
expect(testResponse.buttonCapabilities).to(beNil());
expect(testResponse.softButtonCapabilities).to(beNil());
expect(testResponse.presetBankCapabilities).to(beNil());
+ expect(testResponse.vehicleType).to(beNil());
+ expect(testResponse.systemSoftwareVersion).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.hmiZoneCapabilities).to(beNil());
expect(testResponse.speechCapabilities).to(beNil());
expect(testResponse.vrCapabilities).to(beNil());
expect(testResponse.audioPassThruCapabilities).to(beNil());
expect(testResponse.pcmStreamCapabilities).to(beNil());
- expect(testResponse.vehicleType).to(beNil());
expect(testResponse.prerecordedSpeech).to(beNil());
expect(testResponse.supportedDiagModes).to(beNil());
expect(testResponse.hmiCapabilities).to(beNil());
expect(testResponse.sdlVersion).to(beNil());
- expect(testResponse.systemSoftwareVersion).to(beNil());
expect(testResponse.iconResumed).to(beNil());
});
@@ -194,18 +197,18 @@ describe(@"Getter/Setter Tests", ^ {
expectAction(^{ [testResponse buttonCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse softButtonCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse presetBankCapabilities]; }).to(raiseException());
+ expectAction(^{ [testResponse vehicleType]; }).to(raiseException());
+ expectAction(^{ [testResponse systemSoftwareVersion]; }).to(raiseException());
#pragma clang diagnostic pop
expectAction(^{ [testResponse hmiZoneCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse speechCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse vrCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse audioPassThruCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse pcmStreamCapabilities]; }).to(raiseException());
- expectAction(^{ [testResponse vehicleType]; }).to(raiseException());
expectAction(^{ [testResponse prerecordedSpeech]; }).to(raiseException());
expectAction(^{ [testResponse supportedDiagModes]; }).to(raiseException());
expectAction(^{ [testResponse hmiCapabilities]; }).to(raiseException());
expectAction(^{ [testResponse sdlVersion]; }).to(raiseException());
- expectAction(^{ [testResponse systemSoftwareVersion]; }).to(raiseException());
expectAction(^{ [testResponse iconResumed]; }).to(raiseException());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatOccupancySpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatOccupancySpec.m
new file mode 100644
index 000000000..172af240b
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatOccupancySpec.m
@@ -0,0 +1,64 @@
+//
+// SDLUnsubscribeVehicleDataResponseSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLSeatOccupancy.h"
+#import "SDLSeatStatus.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLRPCFunctionNames.h"
+
+QuickSpecBegin(SDLSeatOccupancySpec)
+
+SDLSeatStatus *seatStatus = [[SDLSeatStatus alloc] init];
+NSArray *seatStatusArr = @[seatStatus];
+
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
+ it(@"expect all properties to be set properly", ^{
+ SDLSeatOccupancy* testStruct = [[SDLSeatOccupancy alloc] init];
+ testStruct.seatsBelted = seatStatusArr;
+ testStruct.seatsOccupied = seatStatusArr;
+
+ expect(testStruct.seatsBelted).to(equal(seatStatusArr));
+ expect(testStruct.seatsOccupied).to(equal(seatStatusArr));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ it(@"expect all properties to be set properly", ^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameSeatsBelted:seatStatusArr,
+ SDLRPCParameterNameSeatsOccupied:seatStatusArr,
+ };
+
+ SDLSeatOccupancy* testStruct = [[SDLSeatOccupancy alloc] initWithDictionary:dict];
+
+ expect(testStruct.seatsBelted).to(equal(seatStatusArr));
+ expect(testStruct.seatsOccupied).to(equal(seatStatusArr));
+ });
+ });
+
+ context(@"init", ^{
+ it(@"expect all properties to be nil", ^{
+ SDLSeatOccupancy* testStruct = [[SDLSeatOccupancy alloc] init];
+ expect(testStruct.seatsBelted).to(beNil());
+ expect(testStruct.seatsOccupied).to(beNil());
+ });
+ });
+
+ context(@"initWithSeatsOccupied:seatsBelted:", ^{
+ it(@"expect all properties to be set properly", ^{
+ SDLSeatOccupancy* testStruct = [[SDLSeatOccupancy alloc] initWithSeatsOccupied:seatStatusArr seatsBelted:seatStatusArr];
+ expect(testStruct.seatsBelted).to(equal(seatStatusArr));
+ expect(testStruct.seatsOccupied).to(equal(seatStatusArr));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatStatusSpec.m
new file mode 100644
index 000000000..fa56d7729
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatStatusSpec.m
@@ -0,0 +1,66 @@
+//
+// SDLUnsubscribeVehicleDataResponseSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLSeatStatus.h"
+#import "SDLSeatLocation.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLRPCFunctionNames.h"
+
+QuickSpecBegin(SDLSeatStatusSpec)
+
+SDLSeatLocation *seatLocation = [[SDLSeatLocation alloc] init];
+NSNumber<SDLBool> *conditionActive = @YES;
+
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
+ it(@"expect all properties to be set properly", ^{
+ SDLSeatStatus* testStruct = [[SDLSeatStatus alloc] init];
+ testStruct.conditionActive = conditionActive;
+ testStruct.seatLocation = seatLocation;
+
+ expect(testStruct.conditionActive).to(equal(conditionActive));
+ expect(testStruct.seatLocation).to(equal(seatLocation));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ it(@"expect all properties to be set properly", ^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameConditionActive:conditionActive,
+ SDLRPCParameterNameSeatLocation:seatLocation,
+ };
+
+ SDLSeatStatus* testStruct = [[SDLSeatStatus alloc] initWithDictionary:dict];
+
+ expect(testStruct.conditionActive).to(equal(conditionActive));
+ expect(testStruct.seatLocation).to(equal(seatLocation));
+ });
+ });
+
+ context(@"init", ^{
+ it(@"expect all properties to be nil", ^{
+ SDLSeatStatus* testStruct = [[SDLSeatStatus alloc] init];
+
+ expect(testStruct.conditionActive).to(beNil());
+ expect(testStruct.seatLocation).to(beNil());
+ });
+ });
+
+ context(@"initWithSeatsOccupied:seatsBelted:", ^{
+ it(@"expect all properties to be set properly", ^{
+ SDLSeatStatus* testStruct = [[SDLSeatStatus alloc] initWithSeatLocation:seatLocation conditionActive:conditionActive];
+
+ expect(testStruct.conditionActive).to(equal(conditionActive));
+ expect(testStruct.seatLocation).to(equal(seatLocation));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m
index 0d958e18d..ff1a249f7 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m
@@ -19,7 +19,10 @@
QuickSpecBegin(SDLSetDisplayLayoutResponseSpec)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLDisplayCapabilities* info = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic pop
SDLButtonCapabilities* button = [[SDLButtonCapabilities alloc] init];
SDLSoftButtonCapabilities* softButton = [[SDLSoftButtonCapabilities alloc] init];
SDLPresetBankCapabilities* presetBank = [[SDLPresetBankCapabilities alloc] init];
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
index 4a240d32c..6b3e7058e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
@@ -36,9 +36,9 @@ describe(@"getter/setter tests", ^{
testResponse.emergencyEvent = vehicleDataResult;
testResponse.engineOilLife = vehicleDataResult;
testResponse.engineTorque = vehicleDataResult;
- testResponse.externalTemperature = vehicleDataResult;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testResponse.externalTemperature = vehicleDataResult;
testResponse.fuelLevel = vehicleDataResult;
testResponse.fuelLevel_State = vehicleDataResult;
#pragma clang diagnostic pop
@@ -55,6 +55,7 @@ describe(@"getter/setter tests", ^{
testResponse.prndl = vehicleDataResult;
#pragma clang diagnostic pop
testResponse.rpm = vehicleDataResult;
+ testResponse.seatOccupancy = vehicleDataResult;
testResponse.speed = vehicleDataResult;
testResponse.stabilityControlsStatus = vehicleDataResult;
testResponse.steeringWheelAngle = vehicleDataResult;
@@ -62,6 +63,7 @@ describe(@"getter/setter tests", ^{
testResponse.turnSignal = vehicleDataResult;
testResponse.windowStatus = vehicleDataResult;
testResponse.wiperStatus = vehicleDataResult;
+ testResponse.climateData = vehicleDataResult;
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
@@ -77,9 +79,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
@@ -96,6 +98,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.stabilityControlsStatus).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
@@ -103,6 +106,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.windowStatus).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.climateData).to(equal(vehicleDataResult));
});
});
@@ -141,6 +145,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:vehicleDataResult,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:vehicleDataResult,
+ SDLRPCParameterNameSeatOccupancy:vehicleDataResult,
SDLRPCParameterNameSpeed:vehicleDataResult,
SDLRPCParameterNameStabilityControlsStatus:vehicleDataResult,
SDLRPCParameterNameSteeringWheelAngle:vehicleDataResult,
@@ -148,6 +153,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameTurnSignal:vehicleDataResult,
SDLRPCParameterNameWindowStatus:vehicleDataResult,
SDLRPCParameterNameWiperStatus:vehicleDataResult,
+ SDLRPCParameterNameClimateData:vehicleDataResult,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}};
@@ -167,9 +173,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
@@ -186,6 +192,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.stabilityControlsStatus).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
@@ -193,6 +200,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.windowStatus).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.climateData).to(equal(vehicleDataResult));
});
});
@@ -213,9 +221,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(beNil());
expect(testResponse.engineOilLife).to(beNil());
expect(testResponse.engineTorque).to(beNil());
- expect(testResponse.externalTemperature).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
expect(testResponse.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -232,6 +240,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.rpm).to(beNil());
+ expect(testResponse.seatOccupancy).to(beNil());
expect(testResponse.speed).to(beNil());
expect(testResponse.stabilityControlsStatus).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
@@ -239,11 +248,15 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(beNil());
expect(testResponse.windowStatus).to(beNil());
expect(testResponse.wiperStatus).to(beNil());
+ expect(testResponse.climateData).to(beNil());
});
});
context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSubscribeVehicleDataResponse *testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult instantFuelConsumption:vehicleDataResult fuelRange:vehicleDataResult externalTemperature:vehicleDataResult turnSignal:vehicleDataResult gearStatus:vehicleDataResult tirePressure:vehicleDataResult odometer:vehicleDataResult beltStatus:vehicleDataResult bodyInformation:vehicleDataResult deviceStatus:vehicleDataResult driverBraking:vehicleDataResult wiperStatus:vehicleDataResult headLampStatus:vehicleDataResult engineTorque:vehicleDataResult accPedalPosition:vehicleDataResult steeringWheelAngle:vehicleDataResult engineOilLife:vehicleDataResult electronicParkBrakeStatus:vehicleDataResult cloudAppVehicleID:vehicleDataResult stabilityControlsStatus:vehicleDataResult eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult handsOffSteering:vehicleDataResult windowStatus:vehicleDataResult];
+#pragma clang diagnostic pop
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
@@ -259,9 +272,56 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
+ expect(testResponse.fuelLevel).to(beNil());
+ expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.fuelRange).to(equal(vehicleDataResult));
+ expect(testResponse.gearStatus).to(equal(vehicleDataResult));
+ expect(testResponse.gps).to(equal(vehicleDataResult));
+ expect(testResponse.handsOffSteering).to(equal(vehicleDataResult));
+ expect(testResponse.headLampStatus).to(equal(vehicleDataResult));
+ expect(testResponse.instantFuelConsumption).to(equal(vehicleDataResult));
+ expect(testResponse.myKey).to(equal(vehicleDataResult));
+ expect(testResponse.odometer).to(equal(vehicleDataResult));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.prndl).to(beNil());
+#pragma clang diagnostic push
+ expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(beNil());
+ expect(testResponse.speed).to(equal(vehicleDataResult));
+ expect(testResponse.stabilityControlsStatus).to(equal(vehicleDataResult));
+ expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
+ expect(testResponse.tirePressure).to(equal(vehicleDataResult));
+ expect(testResponse.turnSignal).to(equal(vehicleDataResult));
+ expect(testResponse.windowStatus).to(equal(vehicleDataResult));
+ expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ });
+ });
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:", ^{
+ SDLSubscribeVehicleDataResponse *testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult instantFuelConsumption:vehicleDataResult fuelRange:vehicleDataResult climateData:vehicleDataResult turnSignal:vehicleDataResult gearStatus:vehicleDataResult tirePressure:vehicleDataResult odometer:vehicleDataResult beltStatus:vehicleDataResult bodyInformation:vehicleDataResult deviceStatus:vehicleDataResult driverBraking:vehicleDataResult wiperStatus:vehicleDataResult headLampStatus:vehicleDataResult engineTorque:vehicleDataResult accPedalPosition:vehicleDataResult steeringWheelAngle:vehicleDataResult engineOilLife:vehicleDataResult electronicParkBrakeStatus:vehicleDataResult cloudAppVehicleID:vehicleDataResult stabilityControlsStatus:vehicleDataResult eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult windowStatus:vehicleDataResult handsOffSteering:vehicleDataResult seatOccupancy:vehicleDataResult];
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
+ expect(testResponse.airbagStatus).to(equal(vehicleDataResult));
+ expect(testResponse.beltStatus).to(equal(vehicleDataResult));
+ expect(testResponse.bodyInformation).to(equal(vehicleDataResult));
+ expect(testResponse.cloudAppVehicleID).to(equal(vehicleDataResult));
+ expect(testResponse.clusterModes).to(equal(vehicleDataResult));
+ expect(testResponse.deviceStatus).to(equal(vehicleDataResult));
+ expect(testResponse.driverBraking).to(equal(vehicleDataResult));
+ expect(testResponse.eCallInfo).to(equal(vehicleDataResult));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(vehicleDataResult));
+ expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
+ expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
+ expect(testResponse.engineTorque).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
expect(testResponse.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
@@ -278,6 +338,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic push
expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.stabilityControlsStatus).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
@@ -285,6 +346,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.windowStatus).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.climateData).to(equal(vehicleDataResult));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
index d7833ab2d..b2b2561e0 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
@@ -35,9 +35,9 @@ describe(@"getter/setter tests", ^{
testResponse.emergencyEvent = vehicleDataResult;
testResponse.engineOilLife = vehicleDataResult;
testResponse.engineTorque = vehicleDataResult;
- testResponse.externalTemperature = vehicleDataResult;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testResponse.externalTemperature = vehicleDataResult;
testResponse.fuelLevel = vehicleDataResult;
testResponse.fuelLevel_State = vehicleDataResult;
#pragma clang diagnostic pop
@@ -54,6 +54,7 @@ describe(@"getter/setter tests", ^{
testResponse.prndl = vehicleDataResult;
#pragma clang diagnostic pop
testResponse.rpm = vehicleDataResult;
+ testResponse.seatOccupancy = vehicleDataResult;
testResponse.speed = vehicleDataResult;
testResponse.stabilityControlsStatus = vehicleDataResult;
testResponse.steeringWheelAngle = vehicleDataResult;
@@ -61,6 +62,7 @@ describe(@"getter/setter tests", ^{
testResponse.turnSignal = vehicleDataResult;
testResponse.windowStatus = vehicleDataResult;
testResponse.wiperStatus = vehicleDataResult;
+ testResponse.climateData = vehicleDataResult;
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
@@ -76,9 +78,9 @@ describe(@"getter/setter tests", ^{
expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
@@ -95,6 +97,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.stabilityControlsStatus).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
@@ -102,6 +105,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.windowStatus).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.climateData).to(equal(vehicleDataResult));
});
});
@@ -140,6 +144,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNamePRNDL:vehicleDataResult,
#pragma clang diagnostic pop
SDLRPCParameterNameRPM:vehicleDataResult,
+ SDLRPCParameterNameSeatOccupancy:vehicleDataResult,
SDLRPCParameterNameSpeed:vehicleDataResult,
SDLRPCParameterNameStabilityControlsStatus:vehicleDataResult,
SDLRPCParameterNameSteeringWheelAngle:vehicleDataResult,
@@ -147,6 +152,7 @@ describe(@"getter/setter tests", ^{
SDLRPCParameterNameTurnSignal:vehicleDataResult,
SDLRPCParameterNameWindowStatus:vehicleDataResult,
SDLRPCParameterNameWiperStatus:vehicleDataResult,
+ SDLRPCParameterNameClimateData:vehicleDataResult,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}};
SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithDictionary:dict];
@@ -184,6 +190,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.stabilityControlsStatus).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
@@ -191,6 +198,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.windowStatus).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.climateData).to(equal(vehicleDataResult));
});
});
@@ -230,6 +238,7 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.rpm).to(beNil());
+ expect(testResponse.seatOccupancy).to(beNil());
expect(testResponse.speed).to(beNil());
expect(testResponse.stabilityControlsStatus).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
@@ -237,13 +246,18 @@ describe(@"getter/setter tests", ^{
expect(testResponse.turnSignal).to(beNil());
expect(testResponse.windowStatus).to(beNil());
expect(testResponse.wiperStatus).to(beNil());
+ expect(testResponse.climateData).to(beNil());
});
});
context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:", ^{
- SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult instantFuelConsumption:vehicleDataResult fuelRange:vehicleDataResult externalTemperature:vehicleDataResult turnSignal:vehicleDataResult gearStatus:vehicleDataResult tirePressure:vehicleDataResult odometer:vehicleDataResult beltStatus:vehicleDataResult bodyInformation:vehicleDataResult deviceStatus:vehicleDataResult driverBraking:vehicleDataResult wiperStatus:vehicleDataResult headLampStatus:vehicleDataResult engineTorque:vehicleDataResult accPedalPosition:vehicleDataResult steeringWheelAngle:vehicleDataResult engineOilLife:vehicleDataResult electronicParkBrakeStatus:vehicleDataResult cloudAppVehicleID:vehicleDataResult stabilityControlsStatus:vehicleDataResult eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult handsOffSteering:vehicleDataResult windowStatus:vehicleDataResult];
it(@"expect all properties to be set properly", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult instantFuelConsumption:vehicleDataResult fuelRange:vehicleDataResult externalTemperature:vehicleDataResult turnSignal:vehicleDataResult gearStatus:vehicleDataResult tirePressure:vehicleDataResult odometer:vehicleDataResult beltStatus:vehicleDataResult bodyInformation:vehicleDataResult deviceStatus:vehicleDataResult driverBraking:vehicleDataResult wiperStatus:vehicleDataResult headLampStatus:vehicleDataResult engineTorque:vehicleDataResult accPedalPosition:vehicleDataResult steeringWheelAngle:vehicleDataResult engineOilLife:vehicleDataResult electronicParkBrakeStatus:vehicleDataResult cloudAppVehicleID:vehicleDataResult stabilityControlsStatus:vehicleDataResult eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult handsOffSteering:vehicleDataResult windowStatus:vehicleDataResult];
+#pragma clang diagnostic pop
+
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
expect(testResponse.airbagStatus).to(equal(vehicleDataResult));
expect(testResponse.beltStatus).to(equal(vehicleDataResult));
@@ -276,12 +290,63 @@ describe(@"getter/setter tests", ^{
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(beNil());
+ expect(testResponse.speed).to(equal(vehicleDataResult));
+ expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
+ expect(testResponse.tirePressure).to(equal(vehicleDataResult));
+ expect(testResponse.turnSignal).to(equal(vehicleDataResult));
+ expect(testResponse.windowStatus).to(equal(vehicleDataResult));
+ expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ });
+ });
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult instantFuelConsumption:vehicleDataResult fuelRange:vehicleDataResult climateData:vehicleDataResult turnSignal:vehicleDataResult gearStatus:vehicleDataResult tirePressure:vehicleDataResult odometer:vehicleDataResult beltStatus:vehicleDataResult bodyInformation:vehicleDataResult deviceStatus:vehicleDataResult driverBraking:vehicleDataResult wiperStatus:vehicleDataResult headLampStatus:vehicleDataResult engineTorque:vehicleDataResult accPedalPosition:vehicleDataResult steeringWheelAngle:vehicleDataResult engineOilLife:vehicleDataResult electronicParkBrakeStatus:vehicleDataResult cloudAppVehicleID:vehicleDataResult stabilityControlsStatus:vehicleDataResult eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult windowStatus:vehicleDataResult handsOffSteering:vehicleDataResult seatOccupancy:vehicleDataResult];
+#pragma clang diagnostic pop
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
+ expect(testResponse.airbagStatus).to(equal(vehicleDataResult));
+ expect(testResponse.beltStatus).to(equal(vehicleDataResult));
+ expect(testResponse.bodyInformation).to(equal(vehicleDataResult));
+ expect(testResponse.cloudAppVehicleID).to(equal(vehicleDataResult));
+ expect(testResponse.clusterModes).to(equal(vehicleDataResult));
+ expect(testResponse.deviceStatus).to(equal(vehicleDataResult));
+ expect(testResponse.driverBraking).to(equal(vehicleDataResult));
+ expect(testResponse.eCallInfo).to(equal(vehicleDataResult));
+ expect(testResponse.electronicParkBrakeStatus).to(equal(vehicleDataResult));
+ expect(testResponse.emergencyEvent).to(equal(vehicleDataResult));
+ expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
+ expect(testResponse.engineTorque).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.externalTemperature).to(beNil());
+ expect(testResponse.fuelLevel).to(beNil());
+ expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.fuelRange).to(equal(vehicleDataResult));
+ expect(testResponse.gearStatus).to(equal(vehicleDataResult));
+ expect(testResponse.gps).to(equal(vehicleDataResult));
+ expect(testResponse.handsOffSteering).to(equal(vehicleDataResult));
+ expect(testResponse.headLampStatus).to(equal(vehicleDataResult));
+ expect(testResponse.instantFuelConsumption).to(equal(vehicleDataResult));
+ expect(testResponse.myKey).to(equal(vehicleDataResult));
+ expect(testResponse.odometer).to(equal(vehicleDataResult));
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#pragma clang diagnostic push
+ expect(testResponse.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.rpm).to(equal(vehicleDataResult));
+ expect(testResponse.seatOccupancy).to(equal(vehicleDataResult));
expect(testResponse.speed).to(equal(vehicleDataResult));
expect(testResponse.steeringWheelAngle).to(equal(vehicleDataResult));
expect(testResponse.tirePressure).to(equal(vehicleDataResult));
expect(testResponse.turnSignal).to(equal(vehicleDataResult));
expect(testResponse.windowStatus).to(equal(vehicleDataResult));
expect(testResponse.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.climateData).to(equal(vehicleDataResult));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppCapabilitySpec.m
new file mode 100644
index 000000000..d25d0c281
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppCapabilitySpec.m
@@ -0,0 +1,94 @@
+//
+// SDLOnAppCapabilityUpdatedSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+#import <Nimble/Nimble.h>
+#import <Quick/Quick.h>
+
+#import "SDLAppCapability.h"
+#import "SDLAppCapabilityType.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLVideoStreamingCapability.h"
+
+QuickSpecBegin(SDLAppCapabilitySpec)
+
+describe(@"getter/setter tests", ^{
+ SDLVideoStreamingCapability *videoStreamingCapability = [[SDLVideoStreamingCapability alloc] init];
+ SDLAppCapabilityType appCapabilityType = SDLAppCapabilityTypeVideoStreaming;
+ __block SDLAppCapability *testStruct = nil;
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLAppCapability alloc] init];
+ });
+ it(@"make sure object created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.appCapabilityType).to(beNil());
+ expect(testStruct.videoStreamingCapability).to(beNil());
+ });
+ });
+
+ context(@"init & assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLAppCapability alloc] init];
+ testStruct.appCapabilityType = appCapabilityType;
+ testStruct.videoStreamingCapability = videoStreamingCapability;
+ });
+ it(@"make sure object created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapabilityType).to(equal(appCapabilityType));
+ expect(testStruct.videoStreamingCapability).to(equal(videoStreamingCapability));
+ });
+ });
+
+ context(@"initWithAppCapabilityType:", ^{
+ beforeEach(^{
+ testStruct = [[SDLAppCapability alloc] initWithAppCapabilityType:appCapabilityType];
+ });
+ it(@"make sure object created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapabilityType).to(equal(appCapabilityType));
+ expect(testStruct.videoStreamingCapability).to(beNil());
+ });
+ });
+
+ context(@"initWithVideoStreamingCapability:", ^{
+ beforeEach(^{
+ testStruct = [[SDLAppCapability alloc] initWithAppCapabilityType:appCapabilityType videoStreamingCapability:videoStreamingCapability];
+ });
+ it(@"make sure object created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapabilityType).to(equal(appCapabilityType));
+ expect(testStruct.videoStreamingCapability).to(equal(videoStreamingCapability));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameVideoStreamingCapability: videoStreamingCapability,
+ SDLRPCParameterNameAppCapabilityType: appCapabilityType,
+ };
+ testStruct = [[SDLAppCapability alloc] initWithDictionary:dict];
+ });
+ it(@"make sure object created", ^{
+ expect(testStruct).notTo(beNil());
+ });
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.appCapabilityType).to(equal(appCapabilityType));
+ expect(testStruct.videoStreamingCapability).to(equal(videoStreamingCapability));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m
index 9c8765525..a7fa46263 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m
@@ -9,62 +9,179 @@
#import <Nimble/Nimble.h>
#import "SDLBodyInformation.h"
+#import "SDLDoorStatus.h"
+#import "SDLGateStatus.h"
#import "SDLIgnitionStableStatus.h"
#import "SDLIgnitionStatus.h"
+#import "SDLRoofStatus.h"
#import "SDLRPCParameterNames.h"
QuickSpecBegin(SDLBodyInformationSpec)
-describe(@"Getter/Setter Tests", ^ {
- it(@"Should set and get correctly", ^ {
- SDLBodyInformation* testStruct = [[SDLBodyInformation alloc] init];
-
- testStruct.parkBrakeActive = @YES;
- testStruct.ignitionStableStatus = SDLIgnitionStableStatusStable;
- testStruct.ignitionStatus = SDLIgnitionStatusStart;
- testStruct.driverDoorAjar = @NO;
- testStruct.passengerDoorAjar = @NO;
- testStruct.rearLeftDoorAjar = @NO;
- testStruct.rearRightDoorAjar = @YES;
-
- expect(testStruct.parkBrakeActive).to(equal(@YES));
- expect(testStruct.ignitionStableStatus).to(equal(SDLIgnitionStableStatusStable));
- expect(testStruct.ignitionStatus).to(equal(SDLIgnitionStatusStart));
- expect(testStruct.driverDoorAjar).to(equal(@NO));
- expect(testStruct.passengerDoorAjar).to(equal(@NO));
- expect(testStruct.rearLeftDoorAjar).to(equal(@NO));
- expect(testStruct.rearRightDoorAjar).to(equal(@YES));
+NSArray<SDLDoorStatus *> *doorStatuses = @[[[SDLDoorStatus alloc] init]];
+NSArray<SDLGateStatus *> *gateStatuses = @[[[SDLGateStatus alloc] init]];
+NSArray<SDLRoofStatus *> *roofStatuses = @[[[SDLRoofStatus alloc] init]];
+SDLIgnitionStableStatus ignitionStableStatus = SDLIgnitionStableStatusStable;
+SDLIgnitionStatus ignitionStatus = SDLIgnitionStatusStart;
+__block SDLBodyInformation *testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLBodyInformation alloc] init];
+ testStruct.parkBrakeActive = @YES;
+ testStruct.ignitionStableStatus = SDLIgnitionStableStatusStable;
+ testStruct.ignitionStatus = SDLIgnitionStatusStart;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct.driverDoorAjar = @NO;
+ testStruct.passengerDoorAjar = @NO;
+ testStruct.rearLeftDoorAjar = @NO;
+ testStruct.rearRightDoorAjar = @YES;
+#pragma clang diagnostic pop
+ testStruct.doorStatuses = doorStatuses;
+ testStruct.gateStatuses = gateStatuses;
+ testStruct.roofStatuses = roofStatuses;
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.parkBrakeActive).to(equal(@YES));
+ expect(testStruct.ignitionStableStatus).to(equal(SDLIgnitionStableStatusStable));
+ expect(testStruct.ignitionStatus).to(equal(SDLIgnitionStatusStart));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.driverDoorAjar).to(equal(@NO));
+ expect(testStruct.passengerDoorAjar).to(equal(@NO));
+ expect(testStruct.rearLeftDoorAjar).to(equal(@NO));
+ expect(testStruct.rearRightDoorAjar).to(equal(@YES));
+#pragma clang diagnostic pop
+ expect(testStruct.doorStatuses).to(equal(doorStatuses));
+ expect(testStruct.gateStatuses).to(equal(gateStatuses));
+ expect(testStruct.roofStatuses).to(equal(roofStatuses));
+ });
});
-
- it(@"Should get correctly when initialized", ^ {
- NSMutableDictionary* dict = [@{SDLRPCParameterNameParkBrakeActive:@YES,
- SDLRPCParameterNameIgnitionStableStatus:SDLIgnitionStableStatusNotStable,
- SDLRPCParameterNameIgnitionStatus:SDLIgnitionStatusStart,
- SDLRPCParameterNameDriverDoorAjar:@NO,
- SDLRPCParameterNamePassengerDoorAjar:@NO,
- SDLRPCParameterNameRearLeftDoorAjar:@NO,
- SDLRPCParameterNameRearRightDoorAjar:@YES} mutableCopy];
- SDLBodyInformation* testStruct = [[SDLBodyInformation alloc] initWithDictionary:dict];
-
- expect(testStruct.parkBrakeActive).to(equal(@YES));
- expect(testStruct.ignitionStableStatus).to(equal(SDLIgnitionStableStatusNotStable));
- expect(testStruct.ignitionStatus).to(equal(SDLIgnitionStatusStart));
- expect(testStruct.driverDoorAjar).to(equal(@NO));
- expect(testStruct.passengerDoorAjar).to(equal(@NO));
- expect(testStruct.rearLeftDoorAjar).to(equal(@NO));
- expect(testStruct.rearRightDoorAjar).to(equal(@YES));
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameParkBrakeActive:@YES,
+ SDLRPCParameterNameIgnitionStableStatus:SDLIgnitionStableStatusNotStable,
+ SDLRPCParameterNameIgnitionStatus:SDLIgnitionStatusStart,
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNameDriverDoorAjar:@NO,
+ SDLRPCParameterNamePassengerDoorAjar:@NO,
+ SDLRPCParameterNameRearLeftDoorAjar:@NO,
+ SDLRPCParameterNameRearRightDoorAjar:@YES,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameDoorStatuses:doorStatuses,
+ SDLRPCParameterNameGateStatuses:gateStatuses,
+ SDLRPCParameterNameRoofStatuses:roofStatuses,
+ };
+ testStruct = [[SDLBodyInformation alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.parkBrakeActive).to(equal(@YES));
+ expect(testStruct.ignitionStableStatus).to(equal(SDLIgnitionStableStatusNotStable));
+ expect(testStruct.ignitionStatus).to(equal(SDLIgnitionStatusStart));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.driverDoorAjar).to(equal(@NO));
+ expect(testStruct.passengerDoorAjar).to(equal(@NO));
+ expect(testStruct.rearLeftDoorAjar).to(equal(@NO));
+ expect(testStruct.rearRightDoorAjar).to(equal(@YES));
+#pragma clang diagnostic pop
+ expect(testStruct.doorStatuses).to(equal(doorStatuses));
+ expect(testStruct.gateStatuses).to(equal(gateStatuses));
+ expect(testStruct.roofStatuses).to(equal(roofStatuses));
+ });
});
-
- it(@"Should return nil if not set", ^ {
- SDLBodyInformation* testStruct = [[SDLBodyInformation alloc] init];
-
- expect(testStruct.parkBrakeActive).to(beNil());
- expect(testStruct.ignitionStableStatus).to(beNil());
- expect(testStruct.ignitionStatus).to(beNil());
- expect(testStruct.driverDoorAjar).to(beNil());
- expect(testStruct.passengerDoorAjar).to(beNil());
- expect(testStruct.rearLeftDoorAjar).to(beNil());
- expect(testStruct.rearRightDoorAjar).to(beNil());
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLBodyInformation alloc] init];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.parkBrakeActive).to(beNil());
+ expect(testStruct.ignitionStableStatus).to(beNil());
+ expect(testStruct.ignitionStatus).to(beNil());
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.driverDoorAjar).to(beNil());
+ expect(testStruct.passengerDoorAjar).to(beNil());
+ expect(testStruct.rearLeftDoorAjar).to(beNil());
+ expect(testStruct.rearRightDoorAjar).to(beNil());
+ #pragma clang diagnostic pop
+ expect(testStruct.doorStatuses).to(beNil());
+ expect(testStruct.gateStatuses).to(beNil());
+ expect(testStruct.roofStatuses).to(beNil());
+ });
+ });
+
+ context(@"initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:", ^{
+ beforeEach(^{
+ testStruct = [[SDLBodyInformation alloc] initWithParkBrakeActive:YES ignitionStableStatus:ignitionStableStatus ignitionStatus:ignitionStatus];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.parkBrakeActive).to(equal(@YES));
+ expect(testStruct.ignitionStableStatus).to(equal(ignitionStableStatus));
+ expect(testStruct.ignitionStatus).to(equal(ignitionStatus));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.driverDoorAjar).to(beNil());
+ expect(testStruct.passengerDoorAjar).to(beNil());
+ expect(testStruct.rearLeftDoorAjar).to(beNil());
+ expect(testStruct.rearRightDoorAjar).to(beNil());
+#pragma clang diagnostic pop
+ expect(testStruct.doorStatuses).to(beNil());
+ expect(testStruct.gateStatuses).to(beNil());
+ expect(testStruct.roofStatuses).to(beNil());
+ });
+ });
+
+ context(@"initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:", ^{
+ beforeEach(^{
+ testStruct = [[SDLBodyInformation alloc] initWithParkBrakeActive:YES ignitionStableStatus:ignitionStableStatus ignitionStatus:ignitionStatus doorStatuses:doorStatuses gateStatuses:gateStatuses roofStatuses:roofStatuses];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.parkBrakeActive).to(equal(@YES));
+ expect(testStruct.ignitionStableStatus).to(equal(ignitionStableStatus));
+ expect(testStruct.ignitionStatus).to(equal(ignitionStatus));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.driverDoorAjar).to(beNil());
+ expect(testStruct.passengerDoorAjar).to(beNil());
+ expect(testStruct.rearLeftDoorAjar).to(beNil());
+ expect(testStruct.rearRightDoorAjar).to(beNil());
+#pragma clang diagnostic pop
+ expect(testStruct.doorStatuses).to(equal(doorStatuses));
+ expect(testStruct.gateStatuses).to(equal(gateStatuses));
+ expect(testStruct.roofStatuses).to(equal(roofStatuses));
+ });
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateDataSpec.m
new file mode 100644
index 000000000..22056d2da
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateDataSpec.m
@@ -0,0 +1,73 @@
+//
+// SDLClimateControlDataSpec.m
+// SmartDeviceLink-iOS
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLClimateData.h"
+#import "SDLTemperature.h"
+#import "SDLDefrostZone.h"
+#import "SDLVentilationMode.h"
+#import "SDLRPCParameterNames.h"
+
+QuickSpecBegin(SDLClimateDataSpec)
+
+describe(@"Getter/Setter Tests", ^{
+ SDLTemperature *externalTemperature = [[SDLTemperature alloc] init];
+ SDLTemperature *cabinTemperature = [[SDLTemperature alloc] init];
+ NSNumber<SDLFloat> *atmosphericPressure = @(123.45);
+
+ context(@"allocate new struct", ^{
+ SDLClimateData* testStruct = [[SDLClimateData alloc] init];
+
+ it(@"expect all values to be nil", ^{
+ expect(testStruct.externalTemperature).to(beNil());
+ expect(testStruct.cabinTemperature).to(beNil());
+ expect(testStruct.atmosphericPressure).to(beNil());
+ });
+ });
+
+ context(@"allocate and init new struct", ^{
+ SDLClimateData* testStruct = [[SDLClimateData alloc] initWithExternalTemperature:externalTemperature cabinTemperature:cabinTemperature atmosphericPressure:atmosphericPressure];
+
+ it(@"expect all properties to be equal to their initial values", ^{
+ expect(testStruct.externalTemperature).to(equal(externalTemperature));
+ expect(testStruct.cabinTemperature).to(equal(cabinTemperature));
+ expect(testStruct.atmosphericPressure).to(equal(atmosphericPressure));
+ });
+ });
+
+ context(@"allocate new struct and set it up", ^{
+ SDLClimateData* testStruct = [[SDLClimateData alloc] init];
+ testStruct.externalTemperature = externalTemperature;
+ testStruct.cabinTemperature = cabinTemperature;
+ testStruct.atmosphericPressure = atmosphericPressure;
+
+ it(@"expect all properties to be equal to their initial values", ^{
+ expect(testStruct.externalTemperature).to(equal(externalTemperature));
+ expect(testStruct.cabinTemperature).to(equal(cabinTemperature));
+ expect(testStruct.atmosphericPressure).to(equal(atmosphericPressure));
+ });
+ });
+
+ context(@"allocate and init new struct with a dictionary", ^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameExternalTemperature: externalTemperature,
+ SDLRPCParameterNameCabinTemperature: cabinTemperature,
+ SDLRPCParameterNameAtmosphericPressure: atmosphericPressure,
+ };
+ SDLClimateData* testStruct = [[SDLClimateData alloc] initWithDictionary:dict];
+
+ it(@"expect all properties to be equal to their initial values", ^{
+ expect(testStruct.externalTemperature).to(equal(externalTemperature));
+ expect(testStruct.cabinTemperature).to(equal(cabinTemperature));
+ expect(testStruct.atmosphericPressure).to(equal(atmosphericPressure));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m
new file mode 100644
index 000000000..17eed73b7
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m
@@ -0,0 +1,92 @@
+//
+// SDLDoorStatusSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDoorStatus.h"
+#import "SDLDoorStatusType.h"
+#import "SDLGrid.h"
+#import "SDLRPCParameterNames.h"
+
+QuickSpecBegin(SDLDoorStatusSpec)
+
+SDLGrid *location = [[SDLGrid alloc] init];
+SDLDoorStatusType status = SDLDoorStatusTypeAjar;
+__block SDLDoorStatus *testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLDoorStatus alloc] init];
+ testStruct.location = location;
+ testStruct.status = status;
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameLocation:location,
+ SDLRPCParameterNameStatus:status,
+ };
+ testStruct = [[SDLDoorStatus alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ });
+ });
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLDoorStatus alloc] init];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.location).to(beNil());
+ expect(testStruct.status).to(beNil());
+ });
+ });
+
+ context(@"initWithLocation:status:", ^{
+ beforeEach(^{
+ testStruct = [[SDLDoorStatus alloc] initWithLocation:location status:status];
+ testStruct.location = location;
+ testStruct.status = status;
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m
new file mode 100644
index 000000000..d35517cea
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m
@@ -0,0 +1,93 @@
+//
+// SDLGateStatusSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDoorStatusType.h"
+#import "SDLGateStatus.h"
+#import "SDLGrid.h"
+#import "SDLIgnitionStableStatus.h"
+#import "SDLRPCParameterNames.h"
+
+QuickSpecBegin(SDLGateStatusSpec)
+
+SDLGrid *location = [[SDLGrid alloc] init];
+SDLDoorStatusType status = SDLDoorStatusTypeAjar;
+__block SDLGateStatus *testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLGateStatus alloc] init];
+ testStruct.location = location;
+ testStruct.status = status;
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameLocation:location,
+ SDLRPCParameterNameStatus:status,
+ };
+ testStruct = [[SDLGateStatus alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ });
+ });
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLGateStatus alloc] init];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.location).to(beNil());
+ expect(testStruct.status).to(beNil());
+ });
+ });
+
+ context(@"initWithLocation:status:", ^{
+ beforeEach(^{
+ testStruct = [[SDLGateStatus alloc] initWithLocation:location status:status];
+ testStruct.location = location;
+ testStruct.status = status;
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m
index 8bacdab56..2ff63f919 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m
@@ -6,8 +6,11 @@
QuickSpecBegin(SDLImageResolutionSpec)
-describe(@"Getter/Setter Tests", ^ {
- it(@"Should set and get correctly", ^ {
+const uint16_t width = 234;
+const uint16_t height = 567;
+
+describe(@"Getter/Setter Tests", ^{
+ it(@"Should set and get correctly", ^{
SDLImageResolution *testStruct = [[SDLImageResolution alloc] init];
testStruct.resolutionWidth = @245;
@@ -24,7 +27,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.resolutionWidth).to(equal(@1245));
});
- it(@"Should get correctly when initialized", ^ {
+ it(@"Should get correctly when initialized", ^{
NSDictionary *dict = @{SDLRPCParameterNameResolutionHeight:@69,
SDLRPCParameterNameResolutionWidth:@869,
};
@@ -34,7 +37,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.resolutionHeight).to(equal(@69));
});
- it(@"Should return nil if not set", ^ {
+ it(@"Should return nil if not set", ^{
SDLImageResolution *testStruct = [[SDLImageResolution alloc] init];
expect(testStruct.resolutionHeight).to(beNil());
@@ -42,5 +45,26 @@ describe(@"Getter/Setter Tests", ^ {
});
});
+describe(@"method tests", ^{
+ SDLImageResolution *testStruct = [[SDLImageResolution alloc] initWithWidth:width height:height];
+ SDLImageResolution *copyStruct = [testStruct copy];
+
+ context(@"isEqual:", ^{
+
+ it(@"expect to be equal", ^{
+ expect(testStruct).notTo(beNil());
+ expect(copyStruct).notTo(beNil());
+ expect(copyStruct).to(equal(testStruct));
+ });
+
+ it(@"expect to be not equal", ^{
+ expect(testStruct).notTo(beNil());
+ BOOL isEqual = [testStruct isEqual:nil];
+ expect(isEqual).to(beFalse());
+ isEqual = [testStruct isEqual:[[NSObject alloc] init]];
+ expect(isEqual).to(beFalse());
+ });
+ });
+});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m
new file mode 100644
index 000000000..18abde7e6
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m
@@ -0,0 +1,75 @@
+//
+// SDLKeyboardCapabilitiesSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLKeyboardCapabilities.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLKeyboardLayoutCapability.h"
+
+QuickSpecBegin(SDLKeyboardCapabilitiesSpec)
+
+NSNumber *maskInputCharactersSupported = @YES;
+SDLKeyboardLayoutCapability *keyboardLayoutCapability = [[SDLKeyboardLayoutCapability alloc] init];
+NSArray<SDLKeyboardLayoutCapability *> *supportedKeyboards = @[keyboardLayoutCapability];
+__block SDLKeyboardCapabilities* testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardCapabilities alloc] init];
+ });
+
+ it(@"should return nil if not set", ^{
+ expect(testStruct.maskInputCharactersSupported).to(beNil());
+ expect(testStruct.supportedKeyboards).to(beNil());
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardCapabilities alloc] init];
+ testStruct.maskInputCharactersSupported = maskInputCharactersSupported;
+ testStruct.supportedKeyboards = supportedKeyboards;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.maskInputCharactersSupported).to(equal(maskInputCharactersSupported));
+ expect(testStruct.supportedKeyboards).to(equal(supportedKeyboards));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary<NSString *, id> *dict = @{
+ SDLRPCParameterNameMaskInputCharactersSupported: maskInputCharactersSupported,
+ SDLRPCParameterNameSupportedKeyboards: supportedKeyboards,
+ };
+ testStruct = [[SDLKeyboardCapabilities alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.maskInputCharactersSupported).to(equal(maskInputCharactersSupported));
+ expect(testStruct.supportedKeyboards).to(equal(supportedKeyboards));
+ });
+ });
+
+ context(@"initWithMaskInputCharactersSupported:supportedKeyboards:", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardCapabilities alloc] initWithMaskInputCharactersSupported:maskInputCharactersSupported supportedKeyboards:supportedKeyboards];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct).notTo(beNil());
+ expect(testStruct.maskInputCharactersSupported).to(equal(maskInputCharactersSupported));
+ expect(testStruct.supportedKeyboards).to(equal(supportedKeyboards));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m
new file mode 100644
index 000000000..f938c30a9
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m
@@ -0,0 +1,75 @@
+//
+// SDLKeyboardLayoutCapabilitySpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayout.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLKeyboardLayoutCapability.h"
+
+QuickSpecBegin(SDLKeyboardLayoutCapabilitySpec)
+
+SDLKeyboardLayout keyboardLayout = SDLKeyboardLayoutNumeric;
+UInt8 numConfigurableKeys = 9;
+__block SDLKeyboardLayoutCapability* testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardLayoutCapability alloc] init];
+ });
+
+ it(@"should return nil if not set", ^{
+ expect(testStruct.keyboardLayout).to(beNil());
+ expect(testStruct.numConfigurableKeys).to(beNil());
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardLayoutCapability alloc] init];
+ testStruct.numConfigurableKeys = @(numConfigurableKeys);
+ testStruct.keyboardLayout = keyboardLayout;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.numConfigurableKeys).to(equal(@(numConfigurableKeys)));
+ expect(testStruct.keyboardLayout).to(equal(keyboardLayout));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary<NSString *, id> *dict = @{
+ SDLRPCParameterNameNumConfigurableKeys: @(numConfigurableKeys),
+ SDLRPCParameterNameKeyboardLayout: keyboardLayout,
+ };
+ testStruct = [[SDLKeyboardLayoutCapability alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.numConfigurableKeys).to(equal(@(numConfigurableKeys)));
+ expect(testStruct.keyboardLayout).to(equal(keyboardLayout));
+ });
+ });
+
+ context(@"initWithKeyboardLayout:numConfigurableKeys:", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardLayoutCapability alloc] initWithKeyboardLayout:keyboardLayout numConfigurableKeys:numConfigurableKeys];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct).notTo(beNil());
+ expect(testStruct.numConfigurableKeys).to(equal(@(numConfigurableKeys)));
+ expect(testStruct.keyboardLayout).to(equal(keyboardLayout));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m
index 7b1e28362..8735babca 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m
@@ -8,79 +8,182 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
+#import "SDLKeyboardInputMask.h"
#import "SDLKeyboardLayout.h"
#import "SDLKeypressMode.h"
#import "SDLKeyboardProperties.h"
#import "SDLLanguage.h"
#import "SDLRPCParameterNames.h"
-
QuickSpecBegin(SDLKeyboardPropertiesSpec)
-describe(@"Getter/Setter Tests", ^ {
- __block SDLLanguage testLanguage = SDLLanguageDaDk;
- __block SDLKeyboardLayout testLayout = SDLKeyboardLayoutAZERTY;
- __block SDLKeypressMode testMode = SDLKeypressModeSingleKeypress;
- __block NSArray<NSString *> *testLimitedCharacterList = @[@"s", @"r", @"f"];
- __block NSString *testAutoCompleteText = @"Auto Carrot";
- __block NSArray<NSString *> *testAutoCompleteList = @[@"Hello World", @"How are you"];
-
- it(@"Should set and get correctly", ^ {
- SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] init];
-
- testStruct.language = testLanguage;
- testStruct.keyboardLayout = testLayout;
- testStruct.keypressMode = testMode;
- testStruct.limitedCharacterList = testLimitedCharacterList;
- testStruct.autoCompleteText = testAutoCompleteText;
- testStruct.autoCompleteList = testAutoCompleteList;
-
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
- expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+__block SDLLanguage testLanguage = nil;
+__block SDLKeyboardLayout testLayout = nil;
+__block SDLKeypressMode testMode = nil;
+__block NSArray<NSString *> *testLimitedCharacterList = nil;
+__block NSString *testAutoCompleteText = nil;
+__block NSArray<NSString *> *testAutoCompleteList = nil;
+__block SDLKeyboardInputMask maskInputCharacters = nil;
+__block NSArray<NSString *> *customKeys = nil;
+__block SDLKeyboardProperties* testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ beforeEach(^{
+ testLanguage = SDLLanguageDaDk;
+ testLayout = SDLKeyboardLayoutAZERTY;
+ testMode = SDLKeypressModeSingleKeypress;
+ testLimitedCharacterList = @[@"s", @"r", @"f"];
+ testAutoCompleteText = @"Auto Carrot";
+ testAutoCompleteList = @[@"Hello World", @"How are you"];
+ maskInputCharacters = SDLKeyboardInputMaskEnableInputKeyMask;
+ customKeys = @[@"abc", @"DEF"];
+ });
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardProperties alloc] init];
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.language).to(beNil());
+ expect(testStruct.keyboardLayout).to(beNil());
+ expect(testStruct.keypressMode).to(beNil());
+ expect(testStruct.limitedCharacterList).to(beNil());
+ expect(testStruct.autoCompleteList).to(beNil());
+ expect(testStruct.maskInputCharacters).to(beNil());
+ expect(testStruct.customKeys).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(beNil());
+#pragma clang diagnostic pop
+ });
});
-
- it(@"Should get correctly when initialized with a dictionary", ^ {
- NSDictionary* dict = @{SDLRPCParameterNameLanguage: testLanguage,
- SDLRPCParameterNameKeyboardLayout: testLayout,
- SDLRPCParameterNameKeypressMode: testMode,
- SDLRPCParameterNameLimitedCharacterList: testLimitedCharacterList,
- SDLRPCParameterNameAutoCompleteText: testAutoCompleteText,
- SDLRPCParameterNameAutoCompleteList: testAutoCompleteList
- };
- SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] initWithDictionary:dict];
-
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
- expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardProperties alloc] init];
+ testStruct.language = testLanguage;
+ testStruct.keyboardLayout = testLayout;
+ testStruct.keypressMode = testMode;
+ testStruct.limitedCharacterList = testLimitedCharacterList;
+ testStruct.autoCompleteList = testAutoCompleteList;
+ testStruct.maskInputCharacters = maskInputCharacters;
+ testStruct.customKeys = customKeys;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct.autoCompleteText = testAutoCompleteText;
+#pragma clang diagnostic pop
+ testStruct.maskInputCharacters = maskInputCharacters;
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(equal(maskInputCharacters));
+ expect(testStruct.customKeys).to(equal(customKeys));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
+#pragma clang diagnostic pop
+ });
});
- it(@"Should get correctly when initialized with initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:", ^ {
- SDLKeyboardProperties *testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage layout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteText:testAutoCompleteText autoCompleteList:testAutoCompleteList];
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary* dict = @{SDLRPCParameterNameLanguage: testLanguage,
+ SDLRPCParameterNameKeyboardLayout: testLayout,
+ SDLRPCParameterNameKeypressMode: testMode,
+ SDLRPCParameterNameLimitedCharacterList: testLimitedCharacterList,
+ SDLRPCParameterNameAutoCompleteList: testAutoCompleteList,
+ SDLRPCParameterNameAutoCompleteText: testAutoCompleteText,
+ SDLRPCParameterNameMaskInputCharacters: maskInputCharacters,
+ SDLRPCParameterNameCustomKeys: customKeys,
+ };
+ testStruct = [[SDLKeyboardProperties alloc] initWithDictionary:dict];
+ });
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
- expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(equal(maskInputCharacters));
+ expect(testStruct.customKeys).to(equal(customKeys));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
+#pragma clang diagnostic pop
+ });
});
-
- it(@"Should return nil if not set", ^ {
- SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] init];
-
- expect(testStruct.language).to(beNil());
- expect(testStruct.keyboardLayout).to(beNil());
- expect(testStruct.keypressMode).to(beNil());
- expect(testStruct.limitedCharacterList).to(beNil());
- expect(testStruct.autoCompleteText).to(beNil());
- expect(testStruct.autoCompleteList).to(beNil());
+
+ context(@"initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:", ^{
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage layout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteText:testAutoCompleteText autoCompleteList:testAutoCompleteList];
+#pragma clang diagnostic pop
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(beNil());
+ expect(testStruct.customKeys).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
+#pragma clang diagnostic pop
+ });
+ });
+
+ context(@"initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:", ^{
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage keyboardLayout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteList:testAutoCompleteList];
+#pragma clang diagnostic pop
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(beNil());
+ expect(testStruct.customKeys).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(beNil());
+#pragma clang diagnostic pop
+ });
+ });
+
+ context(@"initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage keyboardLayout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteList:testAutoCompleteList maskInputCharacters:maskInputCharacters customKeys:customKeys];
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(equal(maskInputCharacters));
+ expect(testStruct.customKeys).to(equal(customKeys));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(beNil());
+#pragma clang diagnostic pop
+ });
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m
index d0a63bae5..194b47058 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m
@@ -9,6 +9,7 @@
#import <Nimble/Nimble.h>
#import "SDLMenuParams.h"
+#import "NSMutableDictionary+Store.h"
#import "SDLRPCParameterNames.h"
QuickSpecBegin(SDLMenuParamsSpec)
@@ -17,6 +18,8 @@ describe(@"Initialization tests", ^{
__block UInt32 testParentId = 504320489;
__block UInt16 testPosition = testPosition;
__block NSString *testMenuName = @"Test Menu";
+ __block NSString *testSecondaryText = @"Test text 2";
+ __block NSString *testTertiaryText = @"Test text 3";
it(@"should properly initialize init", ^{
SDLMenuParams* testStruct = [[SDLMenuParams alloc] init];
@@ -24,17 +27,23 @@ describe(@"Initialization tests", ^{
expect(testStruct.parentID).to(beNil());
expect(testStruct.position).to(beNil());
expect(testStruct.menuName).to(beNil());
+ expect(testStruct.secondaryText).to(beNil());
+ expect(testStruct.tertiaryText).to(beNil());
});
it(@"should properly initialize initWithDictionary", ^{
NSDictionary *dict = @{SDLRPCParameterNameParentID:@(testParentId),
SDLRPCParameterNamePosition:@(testPosition),
- SDLRPCParameterNameMenuName:testMenuName};
+ SDLRPCParameterNameMenuName:testMenuName,
+ SDLRPCParameterNameSecondaryText:testSecondaryText,
+ SDLRPCParameterNameTertiaryText:testTertiaryText};
SDLMenuParams* testStruct = [[SDLMenuParams alloc] initWithDictionary:dict];
expect(testStruct.parentID).to(equal(@(testParentId)));
expect(testStruct.position).to(equal(@(testPosition)));
expect(testStruct.menuName).to(equal(testMenuName));
+ expect(testStruct.secondaryText).to(equal(testSecondaryText));
+ expect(testStruct.tertiaryText).to(equal(testTertiaryText));
});
it(@"should properly initialize initWithMenuName", ^{
@@ -46,12 +55,25 @@ describe(@"Initialization tests", ^{
});
it(@"should properly initialize initWithMenuName:parentId:position:", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLMenuParams* testStruct = [[SDLMenuParams alloc] initWithMenuName:testMenuName parentId:testParentId position:testPosition];
+#pragma clang diagnostic pop
expect(testStruct.parentID).to(equal(@(testParentId)));
expect(testStruct.position).to(equal(@(testPosition)));
expect(testStruct.menuName).to(equal(testMenuName));
});
+
+ it(@"should properly initialize initWithMenuName:parentID:position:secondaryText:tertiaryText:", ^{
+ SDLMenuParams* testStruct = [[SDLMenuParams alloc] initWithMenuName:testMenuName parentID:[[NSNumber alloc] initWithInt:testParentId] position:[[NSNumber alloc] initWithInt:testPosition] secondaryText:testSecondaryText tertiaryText:testTertiaryText];
+
+ expect(testStruct.parentID).to(equal(@(testParentId)));
+ expect(testStruct.position).to(equal(@(testPosition)));
+ expect(testStruct.menuName).to(equal(testMenuName));
+ expect(testStruct.secondaryText).to(equal(testSecondaryText));
+ expect(testStruct.tertiaryText).to(equal(testTertiaryText));
+ });
});
describe(@"Getter/Setter Tests", ^ {
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m
index ceb7628e9..30a99be6b 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m
@@ -53,6 +53,21 @@ describe(@"Rectangle Tests", ^{
expect(testStruct.width).to(beNil());
expect(testStruct.height).to(beNil());
});
+
+ context(@"isEqual:", ^{
+ SDLRectangle *testRect = [[SDLRectangle alloc] initWithX:50.5 y:60.2 width:500 height:600];
+ SDLRectangle *copyRect = [testRect copy];
+
+ it(@"expect copy to be equal", ^{
+ expect(testRect).to(equal(copyRect));
+ });
+
+ it(@"expect wrong object to be not equal", ^{
+ id object = [[NSObject alloc] init];
+ expect(testRect).toNot(equal(nil));
+ expect(testRect).toNot(equal(object));
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m
new file mode 100644
index 000000000..933ad1d0c
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m
@@ -0,0 +1,114 @@
+//
+// SDLRoofStatusSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDoorStatusType.h"
+#import "SDLGrid.h"
+#import "SDLRoofStatus.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLWindowState.h"
+
+QuickSpecBegin(SDLRoofStatusSpec)
+
+SDLGrid *location = [[SDLGrid alloc] init];
+SDLDoorStatusType status = SDLDoorStatusTypeAjar;
+SDLWindowState *state = [[SDLWindowState alloc] init];
+__block SDLRoofStatus *testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLRoofStatus alloc] init];
+ testStruct.location = location;
+ testStruct.status = status;
+ testStruct.state = state;
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ expect(testStruct.state).to(equal(state));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary *dict = @{
+ SDLRPCParameterNameLocation:location,
+ SDLRPCParameterNameStatus:status,
+ SDLRPCParameterNameState:state,
+ };
+ testStruct = [[SDLRoofStatus alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ expect(testStruct.state).to(equal(state));
+ });
+ });
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLRoofStatus alloc] init];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.location).to(beNil());
+ expect(testStruct.status).to(beNil());
+ expect(testStruct.state).to(beNil());
+ });
+ });
+
+ context(@"initWithLocation:status:", ^{
+ beforeEach(^{
+ testStruct = [[SDLRoofStatus alloc] initWithLocation:location status:status];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ expect(testStruct.state).to(beNil());
+ });
+ });
+
+ context(@"initWithLocation:status:state:", ^{
+ beforeEach(^{
+ testStruct = [[SDLRoofStatus alloc] initWithLocation:location status:status state:state];
+ });
+
+ it(@"expect struct is not nil", ^{
+ expect(testStruct).notTo(beNil());
+ });
+
+ it(@"expect all properties to be set correctly", ^{
+ expect(testStruct.location).to(equal(location));
+ expect(testStruct.status).to(equal(status));
+ expect(testStruct.state).to(equal(state));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeekStreamingIndicatorSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeekStreamingIndicatorSpec.m
new file mode 100644
index 000000000..7478d366e
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeekStreamingIndicatorSpec.m
@@ -0,0 +1,80 @@
+//
+// SDLSeekStreamingIndicatorSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Frank Elias on 12/8/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLRPCParameterNames.h"
+#import "SDLSeekIndicatorType.h"
+#import "SDLSeekStreamingIndicator.h"
+
+QuickSpecBegin(SDLSeekStreamingIndicatorSpec)
+
+describe(@"Getter/Setter Tests", ^ {
+ __block NSUInteger testSeekTimeInt = 10;
+ __block NSNumber<SDLUInt> *testSeekTime = nil;
+ __block SDLSeekIndicatorType testSeekIndicatorType = nil;
+
+ beforeEach(^{
+ testSeekTime = [[NSNumber alloc] initWithUnsignedInteger:testSeekTimeInt];
+ testSeekIndicatorType = SDLSeekIndicatorTypeTime;
+ });
+
+ it(@"Should set and get correctly", ^ {
+ SDLSeekStreamingIndicator *testStruct = [[SDLSeekStreamingIndicator alloc] init];
+
+ testStruct.seekTime = testSeekTime;
+ testStruct.type = testSeekIndicatorType;
+
+ expect(testStruct.seekTime).to(equal([[NSNumber alloc] initWithUnsignedInteger:testSeekTimeInt]));
+ expect(testStruct.type).to(equal(SDLSeekIndicatorTypeTime));
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSDictionary *dict = @{
+ SDLRPCParameterNameSeekTime: testSeekTime,
+ SDLRPCParameterNameType: testSeekIndicatorType
+ };
+ SDLSeekStreamingIndicator* testStruct = [[SDLSeekStreamingIndicator alloc] initWithDictionary:dict];
+
+ expect(testStruct.seekTime).to(equal([[NSNumber alloc] initWithUnsignedInteger:testSeekTimeInt]));
+ expect(testStruct.type).to(equal(SDLSeekIndicatorTypeTime));
+ });
+
+ it(@"Should set with initWithType: correctly", ^ {
+ SDLSeekStreamingIndicator *testStruct = [[SDLSeekStreamingIndicator alloc] initWithType:testSeekIndicatorType];
+
+ expect(testStruct.seekTime).to(beNil());
+ expect(testStruct.type).to(equal(SDLSeekIndicatorTypeTime));
+ });
+
+ it(@"Should set with initWithType:seekTime: correctly", ^ {
+ SDLSeekStreamingIndicator *testStruct = [[SDLSeekStreamingIndicator alloc] initWithType:testSeekIndicatorType seekTime:testSeekTime];
+
+ expect(testStruct.seekTime).to(equal([[NSNumber alloc] initWithUnsignedInteger:testSeekTimeInt]));
+ expect(testStruct.type).to(equal(SDLSeekIndicatorTypeTime));
+ });
+
+ it(@"Should set with initWithType:seekTime: correctly", ^ {
+ SDLSeekStreamingIndicator *testStruct = [SDLSeekStreamingIndicator seekIndicatorWithSeekTime:testSeekTimeInt];
+
+ expect(testStruct.seekTime).to(equal([[NSNumber alloc] initWithUnsignedInteger:testSeekTimeInt]));
+ expect(testStruct.type).to(equal(SDLSeekIndicatorTypeTime));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ SDLSeekStreamingIndicator *testStruct = [[SDLSeekStreamingIndicator alloc] init];
+
+ expect(testStruct.seekTime).to(beNil());
+ expect(testStruct.type).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m
index 0e3fc67f4..453076aa2 100755
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m
@@ -37,7 +37,7 @@ describe(@"Getter/Setter Tests", ^ {
testNavigationCapability = [[SDLNavigationCapability alloc] initWithSendLocation:YES waypoints:NO];
testPhoneCapability = [[SDLPhoneCapability alloc] initWithDialNumber:YES];
testRemoteControlCapabilities = [[SDLRemoteControlCapabilities alloc] initWithClimateControlCapabilities:nil radioControlCapabilities:nil buttonCapabilities:nil seatControlCapabilities:nil audioControlCapabilities:nil hmiSettingsControlCapabilities:nil lightControlCapabilities:nil];
- testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:[[SDLImageResolution alloc] initWithWidth:50 height:50] maxBitrate:5 supportedFormats:@[] hapticDataSupported:false diagonalScreenSize:23 pixelPerInch:119 scale:1.4];
+ testVideoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:[[SDLImageResolution alloc] initWithWidth:50 height: 50] maxBitrate:@(5) supportedFormats:@[] hapticSpatialDataSupported:@(false) diagonalScreenSize:@(23) pixelPerInch:@(119) scale:@(1.4) preferredFPS:@(15)];
testSeatLocationCapability = [[SDLSeatLocationCapability alloc] init];
testDriverDistractionCapability = [[SDLDriverDistractionCapability alloc] initWithMenuLength:@2 subMenuDepth:@4];
});
@@ -158,7 +158,7 @@ describe(@"Getter/Setter Tests", ^ {
NSArray<SDLVideoStreamingFormat *> *formatArray = @[format1, format2];
- SDLVideoStreamingCapability *testVidStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:maxBitrate supportedFormats:formatArray hapticDataSupported:hapticDataSupported diagonalScreenSize:45 pixelPerInch:112 scale:2.1];
+ SDLVideoStreamingCapability *testVidStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:@(maxBitrate) supportedFormats:formatArray hapticSpatialDataSupported:@(hapticDataSupported) diagonalScreenSize:@(45) pixelPerInch:@(112) scale:@(2.1) preferredFPS:@(15)];
SDLSystemCapability *testStruct = [[SDLSystemCapability alloc] initWithVideoStreamingCapability:testVidStruct];
expect(testStruct.systemCapabilityType).to(equal(SDLSystemCapabilityTypeVideoStreaming));
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m
index a4f3efa0d..207667dd5 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m
@@ -14,41 +14,57 @@
QuickSpecBegin(SDLVehicleTypeSpec)
describe(@"Getter/Setter Tests", ^ {
+ NSString *make = @"make";
+ NSString *model = @"model";
+ NSString *modelYear = @"modelYear";
+ NSString *trim = @"trim";
+
it(@"Should set and get correctly", ^ {
- SDLVehicleType* testStruct = [[SDLVehicleType alloc] init];
+ SDLVehicleType *testStruct = [[SDLVehicleType alloc] init];
- testStruct.make = @"Make";
- testStruct.model = @"Model";
- testStruct.modelYear = @"3.141*10^36";
- testStruct.trim = @"AE";
+ testStruct.make = make;
+ testStruct.model = model;
+ testStruct.modelYear = modelYear;
+ testStruct.trim = trim;
- expect(testStruct.make).to(equal(@"Make"));
- expect(testStruct.model).to(equal(@"Model"));
- expect(testStruct.modelYear).to(equal(@"3.141*10^36"));
- expect(testStruct.trim).to(equal(@"AE"));
+ expect(testStruct.make).to(equal(make));
+ expect(testStruct.model).to(equal(model));
+ expect(testStruct.modelYear).to(equal(modelYear));
+ expect(testStruct.trim).to(equal(trim));
});
- it(@"Should get correctly when initialized", ^ {
- NSMutableDictionary<NSString *, id> *dict = [@{SDLRPCParameterNameMake:@"Make",
- SDLRPCParameterNameModel:@"Model",
- SDLRPCParameterNameModelYear:@"3.141*10^36",
- SDLRPCParameterNameTrim:@"AE"} mutableCopy];
- SDLVehicleType* testStruct = [[SDLVehicleType alloc] initWithDictionary:dict];
+ it(@"Should get correctly when initialized with a dictionary", ^ {
+ NSDictionary *dict = @{
+ SDLRPCParameterNameMake: make,
+ SDLRPCParameterNameModel: model,
+ SDLRPCParameterNameModelYear: modelYear,
+ SDLRPCParameterNameTrim: trim
+ };
+ SDLVehicleType *testStruct = [[SDLVehicleType alloc] initWithDictionary:dict];
- expect(testStruct.make).to(equal(@"Make"));
- expect(testStruct.model).to(equal(@"Model"));
- expect(testStruct.modelYear).to(equal(@"3.141*10^36"));
- expect(testStruct.trim).to(equal(@"AE"));
+ expect(testStruct.make).to(equal(make));
+ expect(testStruct.model).to(equal(model));
+ expect(testStruct.modelYear).to(equal(modelYear));
+ expect(testStruct.trim).to(equal(trim));
});
- it(@"Should return nil if not set", ^ {
- SDLVehicleType* testStruct = [[SDLVehicleType alloc] init];
+ it(@"should initialize correctly with init", ^ {
+ SDLVehicleType *testStruct = [[SDLVehicleType alloc] init];
expect(testStruct.make).to(beNil());
expect(testStruct.model).to(beNil());
expect(testStruct.modelYear).to(beNil());
expect(testStruct.trim).to(beNil());
});
+
+ it(@"should initialize correctly with initWithMake:model:modelYear:trim:", ^{
+ SDLVehicleType *testStruct = [[SDLVehicleType alloc] initWithMake:make model:model modelYear:modelYear trim:trim];
+
+ expect(testStruct.make).to(equal(make));
+ expect(testStruct.model).to(equal(model));
+ expect(testStruct.modelYear).to(equal(modelYear));
+ expect(testStruct.trim).to(equal(trim));
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m
index e4d08951c..9d55055d9 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m
@@ -13,46 +13,236 @@
#import "SDLRPCParameterNames.h"
#import "SDLImageResolution.h"
-#import "SDLVideoStreamingCapability.h"
+#import "SDLVideoStreamingCapability+StreamingVideoExtensions.h"
#import "SDLVideoStreamingCodec.h"
#import "SDLVideoStreamingFormat.h"
#import "SDLVideoStreamingProtocol.h"
+extern BOOL sdl_isNumberEqual(NSNumber *numberL, NSNumber *numberR);
+
QuickSpecBegin(SDLVideoStreamingCapabilitySpec)
+// setup main & additional capabilities
+const int testMaxBitrate = 100;
+const BOOL testHapticDataSupported = NO;
+const float testDiagonalScreenSize = 22.45f;
+const float testPixelPerInch = 96.122f;
+const float testScale = 2.1f;
+const int testMaxBitrate2 = 100500;
+const BOOL testHapticDataSupported2 = YES;
+const float testDiagonalScreenSize2 = 5.5f;
+const float testPixelPerInch2 = 200.0f;
+const float testScale2 = 1.5f;
+const int testMaxBitrate3 = 200300;
+const BOOL testHapticDataSupported3 = YES;
+const float testDiagonalScreenSize3 = 3.5f;
+const float testPixelPerInch3 = 350.5f;
+const float testScale3 = 3.3f;
+const uint testPreferredFPS = 15;
+// setup test objects
+SDLImageResolution *testPreferredResolution = [[SDLImageResolution alloc] initWithWidth:600 height:500];
+
+SDLVideoStreamingFormat *format1 = [[SDLVideoStreamingFormat alloc] init];
+format1.codec = SDLVideoStreamingCodecH264;
+format1.protocol = SDLVideoStreamingProtocolRTP;
+
+SDLVideoStreamingFormat *format2 = [[SDLVideoStreamingFormat alloc] init];
+format2.codec = SDLVideoStreamingCodecH265;
+format2.protocol = SDLVideoStreamingProtocolRTSP;
+
+NSArray<SDLVideoStreamingFormat *> *testVideoStreamingFormats = @[format1, format2];
+
+SDLImageResolution *testPreferredResolution2 = [[SDLImageResolution alloc] initWithWidth:100 height:200];
+SDLVideoStreamingCapability *capability2 = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution2 maxBitrate:@(testMaxBitrate2) supportedFormats:testVideoStreamingFormats hapticSpatialDataSupported:@(testHapticDataSupported2) diagonalScreenSize:@(testDiagonalScreenSize2) pixelPerInch:@(testPixelPerInch2) scale:@(testScale2) preferredFPS:@(testPreferredFPS)];
+ //initWithPreferredResolution:testPreferredResolution2 maxBitrate:testMaxBitrate2 supportedFormats:testVideoStreamingFormats hapticDataSupported:testHapticDataSupported2 diagonalScreenSize:testDiagonalScreenSize2 pixelPerInch:testPixelPerInch2 scale:testScale2];
+
+SDLImageResolution *testPreferredResolution3 = [[SDLImageResolution alloc] initWithWidth:300 height:150];
+SDLVideoStreamingCapability *capability3 = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution3 maxBitrate:@(testMaxBitrate3) supportedFormats:testVideoStreamingFormats hapticSpatialDataSupported:@(testHapticDataSupported3) diagonalScreenSize:@(testDiagonalScreenSize3) pixelPerInch:@(testPixelPerInch3) scale:@(testScale3) preferredFPS:@(testPreferredFPS)];
+ //initWithPreferredResolution:testPreferredResolution3 maxBitrate:testMaxBitrate3 supportedFormats:testVideoStreamingFormats hapticDataSupported:testHapticDataSupported3 diagonalScreenSize:testDiagonalScreenSize3 pixelPerInch:testPixelPerInch3 scale:testScale3];
-describe(@"Initialization tests", ^{
- __block SDLImageResolution *testPreferredResolution = nil;
- __block int testMaxBitrate = 100;
- __block NSArray<SDLVideoStreamingFormat *> *testVideoStreamingFormats = nil;
- __block BOOL testHapticDataSupported = false;
- __block float testDiagonalScreenSize = 22.45;
- __block float testPixelPerInch = 96.122;
- __block float testScale = 2.1;
+NSArray *additionalVideoStreamingCapabilities = @[capability2, capability3];
+describe(@"initialization tests", ^{
+ context(@"initWithDictionary:", ^{
+ __block SDLVideoStreamingCapability* testStruct = nil;
+ beforeEach(^{
+ NSDictionary* dict = @{
+ SDLRPCParameterNamePreferredResolution: testPreferredResolution,
+ SDLRPCParameterNameMaxBitrate: @(testMaxBitrate),
+ SDLRPCParameterNameSupportedFormats: testVideoStreamingFormats,
+ SDLRPCParameterNameHapticSpatialDataSupported: @(testHapticDataSupported),
+ SDLRPCParameterNameDiagonalScreenSize: @(testDiagonalScreenSize),
+ SDLRPCParameterNamePixelPerInch: @(testPixelPerInch),
+ SDLRPCParameterNameScale: @(testScale),
+ SDLRPCParameterNamePreferredFPS: @(testPreferredFPS),
+ };
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct = [[SDLVideoStreamingCapability alloc] initWithDictionary:dict];
+#pragma clang diagnostic pop
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.preferredResolution).to(equal(testPreferredResolution));
+ expect(testStruct.maxBitrate).to(equal(testMaxBitrate));
+ expect(testStruct.supportedFormats).to(equal(testVideoStreamingFormats));
+ expect(testStruct.hapticSpatialDataSupported).to(equal(testHapticDataSupported));
+ expect(testStruct.diagonalScreenSize).to(equal(testDiagonalScreenSize));
+ expect(testStruct.pixelPerInch).to(equal(testPixelPerInch));
+ expect(testStruct.scale).to(equal(testScale));
+ expect(testStruct.preferredFPS).to(equal(testPreferredFPS));
+ });
+ });
+
+ context(@"init", ^{
+ __block SDLVideoStreamingCapability* testStruct = nil;
+ beforeEach(^{
+ testStruct = [[SDLVideoStreamingCapability alloc] init];
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.preferredResolution).to(beNil());
+ expect(testStruct.maxBitrate).to(beNil());
+ expect(testStruct.supportedFormats).to(beNil());
+ expect(testStruct.hapticSpatialDataSupported).to(beNil());
+ expect(testStruct.diagonalScreenSize).to(beNil());
+ expect(testStruct.pixelPerInch).to(beNil());
+ expect(testStruct.scale).to(beNil());
+ expect(testStruct.preferredFPS).to(beNil());
+ });
+ });
+
+ context(@"initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale", ^{
+ __block SDLVideoStreamingCapability* testStruct = nil;
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution maxBitrate:testMaxBitrate supportedFormats:testVideoStreamingFormats hapticDataSupported:testHapticDataSupported diagonalScreenSize:testDiagonalScreenSize pixelPerInch:testPixelPerInch scale:testScale];
+#pragma clang diagnostic pop
+ testStruct.additionalVideoStreamingCapabilities = additionalVideoStreamingCapabilities;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.preferredResolution).to(equal(testPreferredResolution));
+ expect(testStruct.maxBitrate).to(equal(testMaxBitrate));
+ expect(testStruct.supportedFormats).to(equal(testVideoStreamingFormats));
+ expect(testStruct.hapticSpatialDataSupported).to(equal(testHapticDataSupported));
+ expect(testStruct.diagonalScreenSize).to(equal(testDiagonalScreenSize));
+ expect(testStruct.pixelPerInch).to(equal(testPixelPerInch));
+ expect(testStruct.scale).to(equal(testScale));
+ expect(testStruct.preferredFPS).to(beNil());
+ expect(testStruct.additionalVideoStreamingCapabilities).to(haveCount(2));
+ expect(testStruct.additionalVideoStreamingCapabilities).to(equal(additionalVideoStreamingCapabilities));
+ });
+ });
+});
+
+describe(@"additional tests", ^{
+ __block SDLVideoStreamingCapability* testStruct = nil;
+ __block SDLVideoStreamingCapability* testStruct2 = nil;
+ SDLVideoStreamingCapability* testObject = (SDLVideoStreamingCapability*)[[NSObject alloc] init];
beforeEach(^{
- testPreferredResolution = [[SDLImageResolution alloc] initWithWidth:600 height:500];
+ testStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution maxBitrate:@(testMaxBitrate) supportedFormats:testVideoStreamingFormats hapticSpatialDataSupported:@(testHapticDataSupported) diagonalScreenSize:@(testDiagonalScreenSize) pixelPerInch:@(testPixelPerInch) scale:@(testScale) preferredFPS:@(testPreferredFPS)];
+ testStruct.additionalVideoStreamingCapabilities = additionalVideoStreamingCapabilities;
+ testStruct2 = [testStruct copy];
+ });
+
+ context(@"isEqual:", ^{
+ it(@"expect to be equal", ^{
+ expect(testStruct).to(equal(testStruct2));
+ });
+
+ // test selected properties one by one
+ // note: only one property differs at a time
+ it(@"expect to be not equal", ^{
+ id stash = nil;
+ expect(testStruct).toNot(equal(testObject));
+
+ stash = testStruct2.preferredResolution;
+ testStruct2.preferredResolution = [[SDLImageResolution alloc] init];
+ expect(testStruct).toNot(equal(testStruct2));
+ testStruct2.preferredResolution = stash;
+ expect(testStruct).to(equal(testStruct2));
+
+ stash = testStruct2.maxBitrate;
+ testStruct2.maxBitrate = @(222);
+ expect(testStruct).toNot(equal(testStruct2));
+ testStruct2.maxBitrate = stash;
+ expect(testStruct).to(equal(testStruct2));
- SDLVideoStreamingFormat *format1 = [[SDLVideoStreamingFormat alloc] init];
- format1.codec = SDLVideoStreamingCodecH264;
- format1.protocol = SDLVideoStreamingProtocolRTP;
+ stash = testStruct2.diagonalScreenSize;
+ testStruct2.diagonalScreenSize = @(999);
+ expect(testStruct).toNot(equal(testStruct2));
+ testStruct2.diagonalScreenSize = stash;
+ expect(testStruct).to(equal(testStruct2));
- SDLVideoStreamingFormat *format2 = [[SDLVideoStreamingFormat alloc] init];
- format2.codec = SDLVideoStreamingCodecH265;
- format2.protocol = SDLVideoStreamingProtocolRTSP;
+ stash = testStruct2.pixelPerInch;
+ testStruct2.pixelPerInch = @(999.5);
+ expect(testStruct).toNot(equal(testStruct2));
+ testStruct2.pixelPerInch = stash;
+ expect(testStruct).to(equal(testStruct2));
- testVideoStreamingFormats = @[format1, format2];
+ stash = testStruct2.scale;
+ testStruct2.scale = @(2.8);
+ expect(testStruct).toNot(equal(testStruct2));
+ testStruct2.scale = stash;
+ expect(testStruct).to(equal(testStruct2));
+ });
});
- it(@"Should get correctly when initialized with a dictionary", ^ {
- NSDictionary* dict = @{SDLRPCParameterNamePreferredResolution: testPreferredResolution,
- SDLRPCParameterNameMaxBitrate: @(testMaxBitrate),
- SDLRPCParameterNameSupportedFormats: testVideoStreamingFormats,
- SDLRPCParameterNameHapticSpatialDataSupported: @(testHapticDataSupported),
- SDLRPCParameterNameDiagonalScreenSize: @(testDiagonalScreenSize),
- SDLRPCParameterNamePixelPerInch: @(testPixelPerInch),
- SDLRPCParameterNameScale: @(testScale)};
+ context(@"allImageResolutions", ^{
+ __block SDLImageResolution *imgResolution2 = nil;
+ __block SDLVideoStreamingCapability* capability2 = nil;
+ __block SDLImageResolution *imgResolution3 = nil;
+ __block SDLVideoStreamingCapability* capability3 = nil;
+ __block SDLImageResolution *imgResolution4 = nil;
+ __block SDLVideoStreamingCapability* capability4 = nil;
+ __block SDLVideoStreamingCapability* testStructX = nil;
+ __block SDLImageResolution *imgResolution1 = nil;
- SDLVideoStreamingCapability* testStruct = [[SDLVideoStreamingCapability alloc] initWithDictionary:dict];
+ beforeEach(^{
+ imgResolution2 = [[SDLImageResolution alloc] initWithWidth:200 height:500];
+ capability2 = [testStruct copy];
+ capability2.preferredResolution = imgResolution2;
+
+ imgResolution3 = [[SDLImageResolution alloc] initWithWidth:300 height:500];
+ capability3 = [testStruct copy];
+ capability3.preferredResolution = imgResolution3;
+
+ imgResolution4 = [[SDLImageResolution alloc] initWithWidth:400 height:500];
+ capability4 = [testStruct copy];
+ capability4.preferredResolution = imgResolution4;
+
+
+ testStructX = [testStruct copy];
+ imgResolution1 = [[SDLImageResolution alloc] initWithWidth:100 height:500];
+ testStructX.preferredResolution = imgResolution1;
+ });
+
+ it(@"expect result array to contain proper objects where order matters", ^{
+ testStructX.additionalVideoStreamingCapabilities = @[capability2, capability3, capability4];
+ NSArray<SDLImageResolution *> *allImageResolutions1 = [testStructX allImageResolutions];
+ NSArray<SDLImageResolution *> *allImageResolutions2 = @[imgResolution1, imgResolution2, imgResolution3, imgResolution4];
+ expect(allImageResolutions1).to(equal(allImageResolutions2));
+ // test in backward order
+ testStructX.additionalVideoStreamingCapabilities = @[capability4, capability3, capability2];
+ allImageResolutions1 = [testStructX allImageResolutions];
+ expect(allImageResolutions1).toNot(equal(allImageResolutions2));
+ expect(testStruct.preferredResolution).to(equal(testPreferredResolution));
+ expect(testStruct.maxBitrate).to(equal(testMaxBitrate));
+ expect(testStruct.supportedFormats).to(equal(testVideoStreamingFormats));
+ expect(testStruct.hapticSpatialDataSupported).to(equal(testHapticDataSupported));
+ expect(testStruct.diagonalScreenSize).to(equal(testDiagonalScreenSize));
+ expect(testStruct.pixelPerInch).to(equal(testPixelPerInch));
+ expect(testStruct.scale).to(equal(testScale));
+ expect(testStruct.preferredFPS).to(equal(testPreferredFPS));
+ });
+ });
+
+ it(@"Should initialize correctly with initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale", ^ {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLVideoStreamingCapability *testStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution maxBitrate:testMaxBitrate supportedFormats:testVideoStreamingFormats hapticDataSupported:testHapticDataSupported diagonalScreenSize:testDiagonalScreenSize pixelPerInch:testPixelPerInch scale:testScale];
+#pragma clang diagnostic pop
expect(testStruct.preferredResolution).to(equal(testPreferredResolution));
expect(testStruct.maxBitrate).to(equal(testMaxBitrate));
@@ -61,22 +251,11 @@ describe(@"Initialization tests", ^{
expect(testStruct.diagonalScreenSize).to(equal(testDiagonalScreenSize));
expect(testStruct.pixelPerInch).to(equal(testPixelPerInch));
expect(testStruct.scale).to(equal(testScale));
+ expect(testStruct.preferredFPS).to(beNil());
});
- it(@"Should return nil if not set", ^ {
- SDLVideoStreamingCapability* testStruct = [[SDLVideoStreamingCapability alloc] init];
-
- expect(testStruct.preferredResolution).to(beNil());
- expect(testStruct.maxBitrate).to(beNil());
- expect(testStruct.supportedFormats).to(beNil());
- expect(testStruct.hapticSpatialDataSupported).to(beNil());
- expect(testStruct.diagonalScreenSize).to(beNil());
- expect(testStruct.pixelPerInch).to(beNil());
- expect(testStruct.scale).to(beNil());
- });
-
- it(@"Should initialize correctly with initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale", ^ {
- SDLVideoStreamingCapability *testStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution maxBitrate:testMaxBitrate supportedFormats:testVideoStreamingFormats hapticDataSupported:testHapticDataSupported diagonalScreenSize:testDiagonalScreenSize pixelPerInch:testPixelPerInch scale:testScale];
+ it(@"Should initialize correctly with initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS", ^ {
+ SDLVideoStreamingCapability *testStruct = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:testPreferredResolution maxBitrate:@(testMaxBitrate) supportedFormats:testVideoStreamingFormats hapticSpatialDataSupported:@(testHapticDataSupported) diagonalScreenSize:@(testDiagonalScreenSize) pixelPerInch:@(testPixelPerInch) scale:@(testScale) preferredFPS:@(testPreferredFPS)];
expect(testStruct.preferredResolution).to(equal(testPreferredResolution));
expect(testStruct.maxBitrate).to(equal(testMaxBitrate));
@@ -85,6 +264,40 @@ describe(@"Initialization tests", ^{
expect(testStruct.diagonalScreenSize).to(equal(testDiagonalScreenSize));
expect(testStruct.pixelPerInch).to(equal(testPixelPerInch));
expect(testStruct.scale).to(equal(testScale));
+ expect(testStruct.preferredFPS).to(equal(testPreferredFPS));
+ });
+});
+
+describe(@"sdl_isNumberEqual", ^{
+ it(@"expect to be equal", ^{
+ NSNumber *numberL = @(1.5);
+ NSNumber *numberR = @(1.5);
+ const BOOL equal = sdl_isNumberEqual(numberL, numberR);
+ expect(equal).to(beTrue());
+ });
+ it(@"expect to be not equal", ^{
+ NSNumber *numberL = @(1.5);
+ NSNumber *numberR = @(2.5);
+ const BOOL equal = sdl_isNumberEqual(numberL, numberR);
+ expect(equal).to(beFalse());
+ });
+ it(@"expect to be equal", ^{
+ NSNumber *numberL = nil;
+ NSNumber *numberR = nil;
+ const BOOL equal = sdl_isNumberEqual(numberL, numberR);
+ expect(equal).to(beTrue());
+ });
+ it(@"expect to be not equal", ^{
+ NSNumber *numberL = nil;
+ NSNumber *numberR = @(1.5);
+ const BOOL equal = sdl_isNumberEqual(numberL, numberR);
+ expect(equal).to(beFalse());
+ });
+ it(@"expect to be not equal", ^{
+ NSNumber *numberL = @(1.5);
+ NSNumber *numberR = nil;
+ const BOOL equal = sdl_isNumberEqual(numberL, numberR);
+ expect(equal).to(beFalse());
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m
index e8c2514b4..7543826eb 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m
@@ -5,16 +5,19 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
-#import "SDLWindowCapability.h"
-
#import "SDLButtonCapabilities.h"
#import "SDLDynamicUpdateCapabilities.h"
#import "SDLImageField.h"
#import "SDLImageType.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLKeyboardProperties.h"
#import "SDLRPCParameterNames.h"
#import "SDLSoftButtonCapabilities.h"
#import "SDLTextField.h"
#import "SDLTextFieldName.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+
QuickSpecBegin(SDLWindowCapabilitySpec)
@@ -30,89 +33,360 @@ __block NSString *testImageName = nil;
__block NSString *testTemplateAvailable = nil;
__block SDLMenuLayout testMenuLayout = SDLMenuLayoutTiles;
__block SDLDynamicUpdateCapabilities *testDynamicUpdates = nil;
+__block NSArray<SDLTextField *> *textFields = nil;
+__block NSArray<SDLImageField *> *imageFields = nil;
+__block NSArray<SDLButtonCapabilities *> *buttonCapabilities = nil;
+__block SDLKeyboardCapabilities *keyboardCapabilities = nil;
+__block id windowID = nil;
+__block id numCustomPresetsAvailable = nil;
+__block NSArray<SDLImageType> *imageTypeSupported = nil;
+__block NSArray<NSString *> *templatesAvailable = nil;
+__block NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities = nil;
+__block NSArray<SDLMenuLayout> *menuLayoutsAvailable = nil;
-describe(@"Getter/Setter Tests", ^ {
+describe(@"getter/setter tests", ^{
beforeEach(^{
testImageType = SDLImageTypeDynamic;
testTextName = @"test Text field";
testImageName = @"test Image field";
-
+
testTextField = [[SDLTextField alloc] init];
testTextField.name = SDLTextFieldNameTertiaryText;
testImageField = [[SDLImageField alloc] init];
testImageField.name = testImageName;
-
+
testButtonCapabilities = [[SDLButtonCapabilities alloc] init];
testButtonCapabilities.name = SDLButtonNameOk;
testButtonCapabilities.shortPressAvailable = @YES;
testButtonCapabilities.longPressAvailable = @YES;
testButtonCapabilities.upDownAvailable = @YES;
-
+
testSoftButtonsCapabilities = [[SDLSoftButtonCapabilities alloc] init];
testSoftButtonsCapabilities.imageSupported = @YES;
testTemplateAvailable = @"myTemplate";
testDynamicUpdates = [[SDLDynamicUpdateCapabilities alloc] initWithSupportedDynamicImageFieldNames:@[SDLImageFieldNameSubMenuIcon] supportsDynamicSubMenus:@YES];
+
+ textFields = @[testTextField];
+ imageFields = @[testImageField];
+ buttonCapabilities = @[testButtonCapabilities];
+ keyboardCapabilities = [[SDLKeyboardCapabilities alloc] init];
+ windowID = @444;
+ numCustomPresetsAvailable = @10;
+ imageTypeSupported = @[testImageType];
+ templatesAvailable = @[testTemplateAvailable];
+ softButtonCapabilities = @[testSoftButtonsCapabilities];
+ menuLayoutsAvailable = @[testMenuLayout];
});
-
- it(@"Should set and get correctly", ^ {
- testStruct = [[SDLWindowCapability alloc] init];
- testStruct.windowID = @444;
- testStruct.numCustomPresetsAvailable = @10;
- testStruct.textFields = @[testTextField];
- testStruct.imageFields = @[testImageField];
- testStruct.imageTypeSupported = @[testImageType];
- testStruct.buttonCapabilities = @[testButtonCapabilities];
- testStruct.softButtonCapabilities = @[testSoftButtonsCapabilities];
- testStruct.menuLayoutsAvailable = @[testMenuLayout];
- testStruct.templatesAvailable = @[testTemplateAvailable];
- testStruct.dynamicUpdateCapabilities = testDynamicUpdates;
-
- expect(testStruct.windowID).to(equal(@444));
- expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
- expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
- expect(testStruct.numCustomPresetsAvailable).to(equal(@10));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
- expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
- expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
- expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLWindowCapability alloc] init];
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.windowID).to(beNil());
+ expect(testStruct.textFields.firstObject.name).to(beNil());
+ expect(testStruct.imageFields.firstObject.name).to(beNil());
+ expect(testStruct.numCustomPresetsAvailable).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.name).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.name).to(beNil());
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(beNil());
+ expect(testStruct.menuLayoutsAvailable).to(beNil());
+ expect(testStruct.templatesAvailable).to(beNil());
+ expect(testStruct.dynamicUpdateCapabilities).to(beNil());
+ expect(testStruct.imageTypeSupported).to(beNil());
+ expect(testStruct.keyboardCapabilities).to(beNil());
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLWindowCapability alloc] init];
+ testStruct.windowID = windowID;
+ testStruct.numCustomPresetsAvailable = numCustomPresetsAvailable;
+ testStruct.textFields = @[testTextField];
+ testStruct.imageFields = @[testImageField];
+ testStruct.imageTypeSupported = @[testImageType];
+ testStruct.buttonCapabilities = @[testButtonCapabilities];
+ testStruct.softButtonCapabilities = @[testSoftButtonsCapabilities];
+ testStruct.menuLayoutsAvailable = @[testMenuLayout];
+ testStruct.templatesAvailable = @[testTemplateAvailable];
+ testStruct.dynamicUpdateCapabilities = testDynamicUpdates;
+ testStruct.keyboardCapabilities = keyboardCapabilities;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.windowID).to(equal(windowID));
+ expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
+ expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
+ expect(testStruct.numCustomPresetsAvailable).to(equal(numCustomPresetsAvailable));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
+ expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
+ expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
+ expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ expect(testStruct.imageTypeSupported).to(equal(@[testImageType]));
+ expect(testStruct.keyboardCapabilities).to(equal(keyboardCapabilities));
+ });
+ });
+
+ context(@"initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:", ^{
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct = [[SDLWindowCapability alloc] initWithWindowID:windowID textFields:textFields imageFields:imageFields imageTypeSupported:imageTypeSupported templatesAvailable:templatesAvailable numCustomPresetsAvailable:numCustomPresetsAvailable buttonCapabilities:buttonCapabilities softButtonCapabilities:softButtonCapabilities menuLayoutsAvailable:menuLayoutsAvailable dynamicUpdateCapabilities:testDynamicUpdates];
+#pragma clang diagnostic pop
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.windowID).to(equal(windowID));
+ expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
+ expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
+ expect(testStruct.numCustomPresetsAvailable).to(equal(numCustomPresetsAvailable));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
+ expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
+ expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
+ expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ expect(testStruct.imageTypeSupported).to(equal(@[testImageType]));
+ expect(testStruct.keyboardCapabilities).to(beNil());
+ });
+ });
+
+ context(@"initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:", ^{
+ beforeEach(^{
+ testStruct = [[SDLWindowCapability alloc] initWithWindowID:windowID textFields:textFields imageFields:imageFields imageTypeSupported:imageTypeSupported templatesAvailable:templatesAvailable numCustomPresetsAvailable:numCustomPresetsAvailable buttonCapabilities:buttonCapabilities softButtonCapabilities:softButtonCapabilities menuLayoutsAvailable:menuLayoutsAvailable dynamicUpdateCapabilities:testDynamicUpdates keyboardCapabilities:keyboardCapabilities];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.windowID).to(equal(windowID));
+ expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
+ expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
+ expect(testStruct.numCustomPresetsAvailable).to(equal(numCustomPresetsAvailable));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
+ expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
+ expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
+ expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ expect(testStruct.imageTypeSupported).to(equal(@[testImageType]));
+ expect(testStruct.keyboardCapabilities).to(equal(keyboardCapabilities));
+ });
});
});
-describe(@"initializing with ", ^{
+describe(@"creating a valid keyboard configuration based on keyboard capabilities", ^{
+ UInt8 numConfigurableKeys = 7;
+
beforeEach(^{
- testStruct = [[SDLWindowCapability alloc] initWithWindowID:@444 textFields:@[testTextField] imageFields:@[testImageField] imageTypeSupported:@[testImageType] templatesAvailable:@[testTemplateAvailable] numCustomPresetsAvailable:@10 buttonCapabilities:@[testButtonCapabilities] softButtonCapabilities:@[testSoftButtonsCapabilities] menuLayoutsAvailable:@[testMenuLayout] dynamicUpdateCapabilities:testDynamicUpdates];
+ testStruct = [[SDLWindowCapability alloc] init];
+ testStruct.keyboardCapabilities = nil;
});
- it(@"Should set and get correctly", ^ {
- testStruct = [[SDLWindowCapability alloc] init];
- testStruct.windowID = @444;
- testStruct.numCustomPresetsAvailable = @10;
- testStruct.textFields = @[testTextField];
- testStruct.imageFields = @[testImageField];
- testStruct.imageTypeSupported = @[testImageType];
- testStruct.buttonCapabilities = @[testButtonCapabilities];
- testStruct.softButtonCapabilities = @[testSoftButtonsCapabilities];
- testStruct.menuLayoutsAvailable = @[testMenuLayout];
- testStruct.templatesAvailable = @[testTemplateAvailable];
- testStruct.dynamicUpdateCapabilities = testDynamicUpdates;
-
- expect(testStruct.windowID).to(equal(@444));
- expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
- expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
- expect(testStruct.numCustomPresetsAvailable).to(equal(@10));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
- expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
- expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
- expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ context(@"when keyboardCapabilities is nil or empty", ^{
+ it(@"result should be nil when the argument is nil", ^{
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:nil];
+ expect(resultProperties).to(beNil());
+ });
+
+ it(@"result should be equal to the argument when keyboardLayout is nil", ^{
+ SDLKeyboardProperties *testKeyboardProperties = [[SDLKeyboardProperties alloc] init];
+ testKeyboardProperties.maskInputCharacters = SDLKeyboardInputMaskUserChoiceInputKeyMask;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties).to(equal(testKeyboardProperties));
+ expect(resultProperties.maskInputCharacters).to(equal(SDLKeyboardInputMaskUserChoiceInputKeyMask));
+ });
+
+ it(@"result should be nil when the argument is not nil and keyboardCapabilities is empty", ^{
+ testStruct.keyboardCapabilities = [[SDLKeyboardCapabilities alloc] init];
+ SDLKeyboardProperties *testKeyboardProperties = [[SDLKeyboardProperties alloc] init];
+ testKeyboardProperties.keyboardLayout = SDLKeyboardLayoutNumeric;
+ testKeyboardProperties.maskInputCharacters = SDLKeyboardInputMaskUserChoiceInputKeyMask;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).to(beNil());
+ });
+
+ context(@"when keyboardCapabilities is not empty", ^{
+ __block SDLKeyboardProperties *testKeyboardProperties = nil;
+ __block SDLKeyboardCapabilities *keyboardCapabilities = nil;
+ __block NSArray *testCustomKeysLong = nil;
+
+ beforeEach(^{
+ // create a long array that contains more custom keys than <numConfigurableKeys>
+ testCustomKeysLong = [@"a ä æ b c d e ê f j h i j k l m n o p q r s ß t u v w x y z" componentsSeparatedByString:@" "];
+ NSArray *arrayLayouts = @[SDLKeyboardLayoutQWERTY, SDLKeyboardLayoutQWERTZ, SDLKeyboardLayoutAZERTY, SDLKeyboardLayoutNumeric];
+ NSMutableArray *arrayLayoutCapability = [[NSMutableArray alloc] initWithCapacity:arrayLayouts.count];
+ for (SDLKeyboardLayout layout in arrayLayouts) {
+ SDLKeyboardLayoutCapability *layoutCapability = [[SDLKeyboardLayoutCapability alloc] initWithKeyboardLayout:layout numConfigurableKeys:numConfigurableKeys];
+ [arrayLayoutCapability addObject:layoutCapability];
+ }
+ keyboardCapabilities = [[SDLKeyboardCapabilities alloc] init];
+ keyboardCapabilities.supportedKeyboards = arrayLayoutCapability;
+ testStruct.keyboardCapabilities = keyboardCapabilities;
+
+ testKeyboardProperties = [[SDLKeyboardProperties alloc] init];
+ testKeyboardProperties.keyboardLayout = SDLKeyboardLayoutNumeric;
+ // create custom keys array longer than <numConfigurableKeys>
+ testKeyboardProperties.customKeys = testCustomKeysLong;
+ testKeyboardProperties.maskInputCharacters = SDLKeyboardInputMaskUserChoiceInputKeyMask;
+ testKeyboardProperties.keyboardLayout = SDLKeyboardLayoutAZERTY;
+ });
+
+ it(@"maskInputCharacters should not be nil when maskInputCharactersSupported = YES", ^{
+ keyboardCapabilities.maskInputCharactersSupported = @YES;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties).notTo(equal(testKeyboardProperties));
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.maskInputCharacters).to(equal(SDLKeyboardInputMaskUserChoiceInputKeyMask));
+ });
+
+ it(@"maskInputCharacters should be nil when maskInputCharactersSupported = NO", ^{
+ keyboardCapabilities.maskInputCharactersSupported = @NO;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties).notTo(equal(testKeyboardProperties));
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.maskInputCharacters).to(beNil());
+ });
+
+ it(@"customKeys should be trimmed to contain <numConfigurableKeys> items", ^{
+ NSArray *expectedCustomKeys = [testCustomKeysLong subarrayWithRange:NSMakeRange(0, numConfigurableKeys)];
+ testKeyboardProperties.customKeys = testCustomKeysLong;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.customKeys).to(equal(expectedCustomKeys));
+ });
+
+ it(@"customKeys should not be trimmed and should be equal to the initial array", ^{
+ NSArray *testCustomKeys = [testCustomKeysLong subarrayWithRange:NSMakeRange(0, numConfigurableKeys)];
+ testKeyboardProperties.customKeys = testCustomKeys;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.customKeys).to(equal(testCustomKeys));
+ });
+ });
+ });
+});
+
+describe(@"extensions", ^{
+ describe(@"getting the max number of main field lines", ^{
+ __block SDLTextField *testTextField1 = nil;
+ __block SDLTextField *testTextField2 = nil;
+ __block SDLTextField *testTextField3 = nil;
+ __block SDLTextField *testTextField4 = nil;
+
+ beforeEach(^{
+ testTextField1 = [[SDLTextField alloc] init];
+ testTextField1.name = SDLTextFieldNameMainField1;
+
+ testTextField2 = [[SDLTextField alloc] init];
+ testTextField2.name = SDLTextFieldNameMainField2;
+
+ testTextField3 = [[SDLTextField alloc] init];
+ testTextField3.name = SDLTextFieldNameMainField3;
+
+ testTextField4 = [[SDLTextField alloc] init];
+ testTextField4.name = SDLTextFieldNameMainField4;
+
+ testStruct = [[SDLWindowCapability alloc] init];
+ });
+
+ it(@"should return 0 if none of the text fields are supported", ^ {
+ testStruct.textFields = @[];
+ NSUInteger maxNumberOfMainFieldLines = [testStruct maxNumberOfMainFieldLines];
+
+ expect(maxNumberOfMainFieldLines).to(equal(0));
+ });
+
+ it(@"should return 1 if only one text field is supported", ^ {
+ testStruct.textFields = @[testTextField1];
+ NSUInteger maxNumberOfMainFieldLines = [testStruct maxNumberOfMainFieldLines];
+
+ expect(maxNumberOfMainFieldLines).to(equal(1));
+ });
+
+ it(@"should return 2 if two text fields are supported", ^ {
+ testStruct.textFields = @[testTextField2, testTextField1];
+ NSUInteger maxNumberOfMainFieldLines = [testStruct maxNumberOfMainFieldLines];
+
+ expect(maxNumberOfMainFieldLines).to(equal(2));
+ });
+
+ it(@"should return 3 if all the text fields are supported", ^ {
+ testStruct.textFields = @[testTextField2, testTextField1, testTextField3];
+ NSUInteger maxNumberOfMainFieldLines = [testStruct maxNumberOfMainFieldLines];
+
+ expect(maxNumberOfMainFieldLines).to(equal(3));
+ });
+
+ it(@"should return 4 if all the text fields are supported", ^ {
+ testStruct.textFields = @[testTextField1, testTextField2, testTextField3, testTextField4];
+ NSUInteger maxNumberOfMainFieldLines = [testStruct maxNumberOfMainFieldLines];
+
+ expect(maxNumberOfMainFieldLines).to(equal(4));
+ });
+ });
+
+ describe(@"getting the max number of alert text field lines", ^{
+ __block SDLTextField *testAlertTextField1 = nil;
+ __block SDLTextField *testAlertTextField2 = nil;
+ __block SDLTextField *testAlertTextField3 = nil;
+
+ beforeEach(^{
+ testAlertTextField1 = [[SDLTextField alloc] init];
+ testAlertTextField1.name = SDLTextFieldNameAlertText1;
+
+ testAlertTextField2 = [[SDLTextField alloc] init];
+ testAlertTextField2.name = SDLTextFieldNameAlertText2;
+
+ testAlertTextField3 = [[SDLTextField alloc] init];
+ testAlertTextField3.name = SDLTextFieldNameAlertText3;
+
+ testStruct = [[SDLWindowCapability alloc] init];
+ });
+
+ it(@"should return 0 if none of the text fields are supported", ^ {
+ testStruct.textFields = @[];
+ NSUInteger maxNumberOfAlertMainFieldLines = [testStruct maxNumberOfAlertFieldLines];
+
+ expect(maxNumberOfAlertMainFieldLines).to(equal(0));
+ });
+
+ it(@"should return 1 if only one text field is supported", ^ {
+ testStruct.textFields = @[testAlertTextField1];
+ NSUInteger maxNumberOfAlertMainFieldLines = [testStruct maxNumberOfAlertFieldLines];
+
+ expect(maxNumberOfAlertMainFieldLines).to(equal(1));
+ });
+
+ it(@"should return 2 if two text fields are supported", ^ {
+ testStruct.textFields = @[testAlertTextField1, testAlertTextField2];
+ NSUInteger maxNumberOfAlertMainFieldLines = [testStruct maxNumberOfAlertFieldLines];
+
+ expect(maxNumberOfAlertMainFieldLines).to(equal(2));
+ });
+
+ it(@"should return 3 if all the text fields are supported", ^ {
+ testStruct.textFields = @[testAlertTextField1, testAlertTextField2, testAlertTextField3];
+ NSUInteger maxNumberOfAlertMainFieldLines = [testStruct maxNumberOfAlertFieldLines];
+
+ expect(maxNumberOfAlertMainFieldLines).to(equal(3));
+ });
});
});
diff --git a/SmartDeviceLinkTests/SDLAlertAudioDataSpec.m b/SmartDeviceLinkTests/SDLAlertAudioDataSpec.m
new file mode 100644
index 000000000..33aab3d0d
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLAlertAudioDataSpec.m
@@ -0,0 +1,98 @@
+//
+// SDLAlertAudioDataSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 11/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAlertAudioData.h"
+#import "SDLFile.h"
+#import "SDLTTSChunk.h"
+
+
+@interface SDLAlertAudioData()
+
+@property (nullable, copy, nonatomic, readonly) NSDictionary<NSString *, SDLFile *> *audioFileData;
+
+@end
+
+QuickSpecBegin(SDLAlertAudioDataSpec)
+
+describe(@"SDLAlertAudioData", ^{
+ __block NSString *testSpeechSynthesizerString = nil;
+ __block SDLFile *testAudioFile = nil;
+ __block SDLFile *testAudioFile2 = nil;
+
+ beforeEach(^{
+ testSpeechSynthesizerString = @"testSpeechSynthesizerString";
+
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testAudioFile = [[SDLFile alloc] initWithFileURL:[testBundle URLForResource:@"testAudio" withExtension:@"mp3"] name:@"testAudioFile" persistent:YES];
+ testAudioFile2 = [[SDLFile alloc] initWithFileURL:[testBundle URLForResource:@"testAudio" withExtension:@"mp3"] name:@"testAudioFile2" persistent:YES];
+ });
+
+ describe(@"Initialization", ^{
+ it(@"Should get and set playTone correctly", ^{
+ SDLAlertAudioData *testAlertAudioData = [[SDLAlertAudioData alloc] initWithAudioFile:testAudioFile];
+ testAlertAudioData.playTone = YES;
+
+ expect(testAlertAudioData.playTone).to(beTrue());
+ expect(testAlertAudioData.audioData).to(haveCount(1));
+ expect(testAlertAudioData.audioFileData).to(haveCount(1));
+ });
+ });
+
+ describe(@"Copying alert audio data", ^{
+ __block SDLAlertAudioData *testAlertAudioData = nil;
+ __block SDLAlertAudioData *copiedTestAlertAudioData = nil;
+ __block NSString *testSpeechSynthesizerString1 = @"testSpeechSynthesizerString1";
+ __block NSString *testSpeechSynthesizerString2 = @"testSpeechSynthesizerString2";
+
+ beforeEach(^{
+ testAlertAudioData = [[SDLAlertAudioData alloc] initWithAudioFile:testAudioFile];
+ [testAlertAudioData addSpeechSynthesizerStrings:@[testSpeechSynthesizerString1]];
+ testAlertAudioData.playTone = YES;
+
+ copiedTestAlertAudioData = [testAlertAudioData copy];
+ });
+
+ it(@"Should copy correctly", ^{
+ expect(testAlertAudioData == copiedTestAlertAudioData).to(beFalse());
+ expect(testAlertAudioData.audioData).to(equal(copiedTestAlertAudioData.audioData));
+ expect(testAlertAudioData.audioFileData).to(equal(copiedTestAlertAudioData.audioFileData));
+ expect(testAlertAudioData.playTone).to(equal(copiedTestAlertAudioData.playTone));
+ });
+
+ it(@"Should not update the copy if changes are made to the original", ^{
+ [testAlertAudioData addSpeechSynthesizerStrings:@[testSpeechSynthesizerString2]];
+ [testAlertAudioData addAudioFiles:@[testAudioFile2]];
+ testAlertAudioData.playTone = NO;
+
+ expect(testAlertAudioData.audioData).to(haveCount(4));
+ expect(testAlertAudioData.audioData[0].text).to(equal(testAudioFile.name));
+ expect(testAlertAudioData.audioData[1].text).to(equal(testSpeechSynthesizerString1));
+ expect(testAlertAudioData.audioData[2].text).to(equal(testSpeechSynthesizerString2));
+ expect(testAlertAudioData.audioData[3].text).to(equal(testAudioFile2.name));
+
+ expect(copiedTestAlertAudioData.audioData).to(haveCount(2));
+ expect(copiedTestAlertAudioData.audioData[0].text).to(equal(testAudioFile.name));
+ expect(copiedTestAlertAudioData.audioData[1].text).to(equal(testSpeechSynthesizerString1));
+
+ expect(testAlertAudioData.audioFileData).to(haveCount(2));
+ expect(testAlertAudioData.audioFileData[testAudioFile.name]).to(equal(testAudioFile));
+ expect(testAlertAudioData.audioFileData[testAudioFile2.name]).to(equal(testAudioFile2));
+
+ expect(copiedTestAlertAudioData.audioFileData).to(haveCount(1));
+ expect(testAlertAudioData.audioFileData[testAudioFile.name]).to(equal(testAudioFile));
+
+ expect(testAlertAudioData.playTone).to(beFalse());
+ expect(copiedTestAlertAudioData.playTone).to(beTrue());
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLAlertManagerSpec.m b/SmartDeviceLinkTests/SDLAlertManagerSpec.m
new file mode 100644
index 000000000..a4df0e7f2
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLAlertManagerSpec.m
@@ -0,0 +1,316 @@
+//
+// SDLAlertManagerSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 11/18/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLAlertManager.h"
+#import "SDLAlertView.h"
+#import "SDLFileManager.h"
+#import "SDLPermissionElement.h"
+#import "SDLPermissionManager.h"
+#import "SDLPresentAlertOperation.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLWindowCapability.h"
+#import "TestConnectionManager.h"
+
+@interface SDLAlertManager()
+
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (assign, nonatomic) UInt16 nextCancelId;
+@property (copy, nonatomic, nullable) SDLWindowCapability *currentWindowCapability;
+
+- (void)sdl_displayCapabilityDidUpdate;
+
+@end
+
+@interface SDLPresentAlertOperation()
+
+@property (copy, nonatomic, nullable) NSError *internalError;
+@property (assign, nonatomic) UInt16 cancelId;
+
+@end
+
+QuickSpecBegin(SDLAlertManagerSpec)
+
+describe(@"alert manager tests", ^{
+ __block SDLAlertManager *testAlertManager = nil;
+ __block id mockConnectionManager = nil;
+ __block id mockFileManager = nil;
+ __block id mockSystemCapabilityManager = nil;
+ __block id mockCurrentWindowCapability = nil;
+ __block id mockPermissionManager = nil;
+ __block SDLWindowCapability *testWindowCapability = nil;
+
+ beforeEach(^{
+ mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ mockFileManager = OCMClassMock([SDLFileManager class]);
+ mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
+ mockCurrentWindowCapability = OCMClassMock([SDLWindowCapability class]);
+ mockPermissionManager = OCMClassMock([SDLPermissionManager class]);
+
+ testWindowCapability = [[SDLWindowCapability alloc] init];
+ testWindowCapability.numCustomPresetsAvailable = @10;
+ testWindowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
+ });
+
+ describe(@"when initialized", ^{
+ it(@"the transaction queue should be suspended", ^{
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+
+ expect(testAlertManager.transactionQueue.suspended).toEventually(beTrue());
+ });
+ });
+
+ describe(@"when started", ^{
+ it(@"should subscribe to capability and permission updates", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wundeclared-selector"
+ SEL testSelector = @selector(sdl_displayCapabilityDidUpdate);
+#pragma clang diagnostic pop
+
+ OCMExpect([mockSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:[OCMArg any] selector:testSelector]);
+ OCMExpect([mockPermissionManager subscribeToRPCPermissions:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLPermissionElement *> *permissionElements = (NSArray<SDLPermissionElement *> *)value;
+ SDLPermissionElement *permissionElement = permissionElements[0];
+ expect(permissionElement.rpcName).to(equal(SDLRPCFunctionNameAlert));
+ return [permissionElement isKindOfClass:[SDLPermissionElement class]];
+ }] groupType:SDLPermissionGroupTypeAny withHandler:[OCMArg any]]);
+
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+
+ OCMVerifyAll(mockSystemCapabilityManager);
+ OCMVerifyAll(mockPermissionManager);
+ });
+
+ describe(@"transaction queue state", ^{
+ it(@"should not start the transaction queue until the alert rpc has the correct permissions to be sent", ^{
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ OCMExpect([mockPermissionManager subscribeToRPCPermissions:[OCMArg any] groupType:SDLPermissionGroupTypeAny withHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], @(SDLPermissionGroupStatusDisallowed), nil])]);
+
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+
+ expect(testAlertManager.transactionQueue.suspended).to(beTrue());
+ });
+
+ it(@"should start the transaction queue if the alert rpc has the correct permissions and the currentWindowCapability has been set", ^{
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ OCMExpect([mockPermissionManager subscribeToRPCPermissions:[OCMArg any] groupType:SDLPermissionGroupTypeAny withHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], @(SDLPermissionGroupStatusAllowed), nil])]);
+
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+
+ expect(testAlertManager.transactionQueue.suspended).toEventually(beFalse());
+ });
+
+ it(@"should not start the transaction queue until the currentWindowCapability has been set", ^{
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(nil);
+ OCMExpect([mockPermissionManager subscribeToRPCPermissions:[OCMArg any] groupType:SDLPermissionGroupTypeAny withHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], @(SDLPermissionGroupStatusAllowed), nil])]);
+
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+
+ expect(testAlertManager.transactionQueue.suspended).toEventually(beTrue());
+ });
+ });
+ });
+
+ describe(@"When the display capability updates", ^{
+ __block SDLAlertView *testAlertView = nil;
+ __block SDLAlertView *testAlertView2 = nil;
+
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"alert text" secondaryText:nil tertiaryText:nil timeout:@(5.0) showWaitIndicator:@(NO) audioIndication:nil buttons:nil icon:nil];
+ testAlertView2 = [[SDLAlertView alloc] initWithText:@"alert 2 text" secondaryText:nil tertiaryText:nil timeout:@(5.0) showWaitIndicator:@(NO) audioIndication:nil buttons:nil icon:nil];
+ });
+
+ it(@"should suspend the queue if the new capability is nil and it should not update operations that are currently excecuting with the new capability", ^{
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ OCMExpect([mockPermissionManager subscribeToRPCPermissions:[OCMArg any] groupType:SDLPermissionGroupTypeAny withHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], @(SDLPermissionGroupStatusAllowed), nil])]);
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+
+ expect(testAlertManager.transactionQueue.suspended).to(beFalse());
+
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+ [testAlertManager presentAlert:testAlertView2 withCompletionHandler:nil];
+ expect(testAlertManager.transactionQueue.operationCount).to(equal(2));
+
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(nil);
+ [testAlertManager sdl_displayCapabilityDidUpdate];
+
+ OCMVerifyAllWithDelay(mockSystemCapabilityManager, 0.5);
+
+ expect(testAlertManager.transactionQueue.suspended).to(beTrue());
+ expect(testAlertManager.transactionQueue.operationCount).to(equal(2));
+
+ SDLPresentAlertOperation *presentAlertOp1 = testAlertManager.transactionQueue.operations[0];
+ SDLPresentAlertOperation *presentAlertOp2 = testAlertManager.transactionQueue.operations[1];
+ expect(presentAlertOp1.isExecuting).to(beTrue());
+ expect(presentAlertOp2.isExecuting).to(beFalse());
+ expect(presentAlertOp1.currentWindowCapability).toEventually(equal(testWindowCapability));
+ expect(presentAlertOp2.currentWindowCapability).toEventually(beNil());
+ });
+
+ it(@"should start the queue if the new capability is not nil and update the pending operations with the new capability", ^{
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(nil);
+ OCMExpect([mockPermissionManager subscribeToRPCPermissions:[OCMArg any] groupType:SDLPermissionGroupTypeAny withHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], @(SDLPermissionGroupStatusAllowed), nil])]);
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+
+ expect(testAlertManager.transactionQueue.suspended).to(beTrue());
+
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+ [testAlertManager presentAlert:testAlertView2 withCompletionHandler:nil];
+ expect(testAlertManager.transactionQueue.operationCount).to(equal(2));
+
+ OCMExpect([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
+ [testAlertManager sdl_displayCapabilityDidUpdate];
+
+ OCMVerifyAllWithDelay(mockSystemCapabilityManager, 0.5);
+
+ expect(testAlertManager.transactionQueue.suspended).toEventually(beFalse());
+ expect(testAlertManager.transactionQueue.operationCount).to(equal(2));
+
+ SDLPresentAlertOperation *presentAlertOp1 = testAlertManager.transactionQueue.operations[0];
+ SDLPresentAlertOperation *presentAlertOp2 = testAlertManager.transactionQueue.operations[1];
+ expect(presentAlertOp1.isExecuting).to(beTrue());
+ expect(presentAlertOp2.isExecuting).to(beFalse());
+ expect(presentAlertOp2.currentWindowCapability).toEventually(equal(testWindowCapability));
+ expect(presentAlertOp1.currentWindowCapability).toEventually(equal(testWindowCapability));
+ });
+ });
+
+ describe(@"generating a cancel id", ^{
+ __block SDLAlertView *testAlertView = nil;
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"alert text" secondaryText:nil tertiaryText:nil timeout:@(5.0) showWaitIndicator:@(NO) audioIndication:nil buttons:nil icon:nil];
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+ });
+
+ it(@"should set the first cancelID correctly", ^{
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+
+ expect(testAlertManager.transactionQueue.operations.count).to(equal(1));
+
+ SDLPresentAlertOperation *testPresentOp = (SDLPresentAlertOperation *)testAlertManager.transactionQueue.operations.firstObject;
+ expect(@(testPresentOp.cancelId)).to(equal(1));
+ });
+
+ it(@"should reset the cancelID correctly once the max has been reached", ^{
+ testAlertManager.nextCancelId = 100;
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+
+ expect(testAlertManager.transactionQueue.operations.count).to(equal(1));
+
+ SDLPresentAlertOperation *testPresentOp = (SDLPresentAlertOperation *)testAlertManager.transactionQueue.operations[0];
+ expect(@(testPresentOp.cancelId)).to(equal(100));
+
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+
+ expect(testAlertManager.transactionQueue.operations.count).to(equal(2));
+
+ SDLPresentAlertOperation *testPresentOp2 = (SDLPresentAlertOperation *)testAlertManager.transactionQueue.operations[1];
+ expect(@(testPresentOp2.cancelId)).to(equal(1));
+ });
+ });
+
+ describe(@"presenting an alert", ^{
+ __block SDLAlertView *testAlertView = nil;
+ __block SDLAlertView *testAlertView2 = nil;
+
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"alert text" secondaryText:nil tertiaryText:nil timeout:@(5.0) showWaitIndicator:@(NO) audioIndication:nil buttons:nil icon:nil];
+ testAlertView2 = [[SDLAlertView alloc] initWithText:@"alert 2 text" secondaryText:nil tertiaryText:nil timeout:@(5.0) showWaitIndicator:@(NO) audioIndication:nil buttons:nil icon:nil];
+ testAlertManager = [[SDLAlertManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
+ [testAlertManager start];
+ });
+
+ it(@"should add the alert operation to the queue", ^{
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+
+ expect(testAlertManager.transactionQueue.operations.count).to(equal(1));
+ expect(testAlertManager.transactionQueue.operations.firstObject).to(beAKindOf([SDLPresentAlertOperation class]));
+ });
+
+ describe(@"when the completion handler is called", ^{
+ __block BOOL completionHandlerCalled = NO;
+ __block NSError *completionHandlerError = nil;
+
+ beforeEach(^{
+ completionHandlerCalled = NO;
+ completionHandlerError = nil;
+
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:^(NSError * _Nullable error) {
+ completionHandlerCalled = YES;
+ completionHandlerError = error;
+ }];
+ });
+
+ context(@"without an error", ^{
+ it(@"should call the handler", ^{
+ SDLPresentAlertOperation *op = testAlertManager.transactionQueue.operations.lastObject;
+ op.internalError = nil;
+ op.completionBlock();
+
+ expect(completionHandlerCalled).to(beTrue());
+ expect(completionHandlerError).to(beNil());
+ });
+ });
+
+ context(@"with an error", ^{
+ __block NSError *testError;
+
+ beforeEach(^{
+ testError = [NSError errorWithDomain:@"com.sdl.testConnectionManager" code:-1 userInfo:nil];
+ });
+
+ it(@"should call the handler with the error", ^{
+ SDLPresentAlertOperation *op = testAlertManager.transactionQueue.operations.lastObject;
+ op.internalError = testError;
+ op.completionBlock();
+
+ expect(completionHandlerCalled).to(beTrue());
+ expect(completionHandlerError).to(equal(testError));
+ });
+ });
+ });
+
+ describe(@"when the manager shuts down during presentation", ^{
+ beforeEach(^{
+ [testAlertManager presentAlert:testAlertView withCompletionHandler:nil];
+ [testAlertManager presentAlert:testAlertView2 withCompletionHandler:nil];
+ });
+
+ it(@"should cancel any pending operations and unsubscribe to capability and permission updates", ^{
+ SDLPresentAlertOperation *presentAlertOp1 = testAlertManager.transactionQueue.operations[0];
+ SDLPresentAlertOperation *presentAlertOp2 = testAlertManager.transactionQueue.operations[1];
+
+ OCMExpect([mockSystemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:[OCMArg any]]);
+ OCMExpect([mockPermissionManager removeAllObservers]);
+
+ [testAlertManager stop];
+
+ expect(presentAlertOp1.isCancelled).to(beTrue());
+ expect(presentAlertOp2.isCancelled).to(beTrue());
+ expect(testAlertManager.transactionQueue.operationCount).to(equal(0));
+
+ OCMVerifyAll(mockSystemCapabilityManager);
+ OCMVerifyAll(mockPermissionManager);
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLAlertViewSpec.m b/SmartDeviceLinkTests/SDLAlertViewSpec.m
new file mode 100644
index 000000000..2e5e0a381
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLAlertViewSpec.m
@@ -0,0 +1,307 @@
+//
+// SDLAlertViewSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 11/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAlertView.h"
+#import "SDLAlertAudioData.h"
+#import "SDLArtwork.h"
+#import "SDLSoftButtonObject.h"
+#import "SDLSoftButtonState.h"
+#import "SDLStaticIconName.h"
+#import "SDLTTSChunk.h"
+
+@interface SDLAlertView()
+
+@property (nullable, copy, nonatomic) SDLAlertCanceledHandler canceledHandler;
+
+@end
+
+QuickSpecBegin(SDLAlertViewSpec)
+
+describe(@"An SDLAlertView", ^{
+ __block NSString *testTextField1 = nil;
+ __block NSString *testTextField2 = nil;
+ __block NSString *testTextField3 = nil;
+ __block NSTimeInterval testTimeout = 0;
+ __block SDLAlertAudioData *testAudio = nil;
+ __block BOOL testShowWaitIndicator = NO;
+ __block NSArray<SDLSoftButtonObject *> *testSoftButtons = nil;
+ __block SDLArtwork *testIcon = nil;
+ __block SDLArtwork *testIcon2 = nil;
+
+ beforeEach(^{
+ testTextField1 = @"testTextField1";
+ testTextField2 = @"testTextField2";
+ testTextField3 = @"testTextField3";
+ testAudio = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"test speech synthesizer string"];
+ testSoftButtons = @[[[SDLSoftButtonObject alloc] initWithName:@"test soft button" text:@"test soft button text" artwork:nil handler:nil]];
+
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ UIImage *testImage = [[UIImage alloc] initWithContentsOfFile:[testBundle pathForResource:@"testImageJPEG" ofType:@"jpeg"]];
+ testIcon = [SDLArtwork artworkWithImage:testImage asImageFormat:SDLArtworkImageFormatJPG];
+ UIImage *testImage2 = [[UIImage alloc] initWithContentsOfFile:[testBundle pathForResource:@"testImagePNG" ofType:@"png"]];
+ testIcon2 = [SDLArtwork artworkWithImage:testImage2 asImageFormat:SDLArtworkImageFormatPNG];
+ });
+
+ it(@"should get and set correctly", ^{
+ SDLAlertView *testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.text = testTextField1;
+ testAlertView.secondaryText = testTextField2;
+ testAlertView.tertiaryText = testTextField3;
+ testAlertView.timeout = testTimeout;
+ testAlertView.audio = testAudio;
+ testAlertView.showWaitIndicator = testShowWaitIndicator;
+ testAlertView.softButtons = testSoftButtons;
+ testAlertView.icon = testIcon;
+
+ expect(testAlertView.text).to(equal(testTextField1));
+ expect(testAlertView.secondaryText).to(equal(testTextField2));
+ expect(testAlertView.tertiaryText).to(equal(testTextField3));
+ expect(testAlertView.timeout).to(equal(5.0));
+
+ expect(testAlertView.audio == testAudio).to(beFalse());
+ expect(testAlertView.audio.audioData[0].text).to(equal(testAudio.audioData[0].text));
+ expect(testAlertView.audio.playTone).to(equal(testAudio.playTone));
+
+ expect(testAlertView.showWaitIndicator).to(beFalse());
+ expect(testAlertView.softButtons).to(equal(testSoftButtons));
+
+ expect(testAlertView.icon == testIcon).to(beFalse());
+ expect(testAlertView.icon.name).to(equal(testIcon.name));
+ });
+
+ describe(@"initializing", ^{
+ it(@"should initialize correctly with initWithText:buttons:", ^{
+ SDLAlertView *testAlertView = [[SDLAlertView alloc] initWithText:testTextField1 buttons:testSoftButtons];
+
+ expect(testAlertView.text).to(equal(testTextField1));
+ expect(testAlertView.secondaryText).to(beNil());
+ expect(testAlertView.tertiaryText).to(beNil());
+ expect(testAlertView.timeout).to(equal(5.0));
+ expect(testAlertView.audio).to(beNil());
+ expect(testAlertView.showWaitIndicator).to(beFalse());
+ expect(testAlertView.softButtons).to(equal(testSoftButtons));
+ expect(testAlertView.icon).to(beNil());
+ });
+
+ it(@"should initialize correctly with initWithText:secondaryText:tertiaryText:timeout: showWaitIndicator:audioIndication:buttons:icon:", ^{
+ SDLAlertView *testAlertView = [[SDLAlertView alloc] initWithText:testTextField1 secondaryText:testTextField2 tertiaryText:testTextField3 timeout:@(testTimeout) showWaitIndicator:@(testShowWaitIndicator) audioIndication:testAudio buttons:testSoftButtons icon:testIcon];
+
+ expect(testAlertView.text).to(equal(testTextField1));
+ expect(testAlertView.secondaryText).to(equal(testTextField2));
+ expect(testAlertView.tertiaryText).to(equal(testTextField3));
+ expect(testAlertView.timeout).to(equal(5.0));
+ expect(testAlertView.audio).toNot(beNil());
+
+ expect(testAlertView.audio == testAudio).to(beFalse());
+ expect(testAlertView.audio.audioData[0].text).to(equal(testAudio.audioData[0].text));
+ expect(testAlertView.audio.playTone).to(equal(testAudio.playTone));
+
+ expect(testAlertView.showWaitIndicator).to(beFalse());
+ expect(testAlertView.softButtons).to(equal(testSoftButtons));
+
+ expect(testAlertView.icon == testIcon).to(beFalse());
+ expect(testAlertView.icon.name).to(equal(testIcon.name));
+ });
+
+ it(@"should set a default value for timeout and set nil for all other properties", ^{
+ SDLAlertView *testAlertView = [[SDLAlertView alloc] init];
+
+ expect(testAlertView.text).to(beNil());
+ expect(testAlertView.secondaryText).to(beNil());
+ expect(testAlertView.tertiaryText).to(beNil());
+ expect(testAlertView.timeout).to(equal(5.0));
+ expect(testAlertView.audio).to(beNil());
+ expect(testAlertView.showWaitIndicator).to(beFalse());
+ expect(testAlertView.softButtons).to(beNil());
+ expect(testAlertView.icon).to(beNil());
+ });
+ });
+
+ describe(@"setting invalid data", ^{
+ __block NSArray<SDLSoftButtonObject *> *testInvalidSoftButtons = nil;
+
+ beforeEach(^{
+ SDLSoftButtonState *state1 = [[SDLSoftButtonState alloc] initWithStateName:@"state1" text:@"state 1" image:nil];
+ SDLSoftButtonState *state2 = [[SDLSoftButtonState alloc] initWithStateName:@"state2" text:@"state 2" image:nil];
+ SDLSoftButtonObject *testInvalidSoftButton = [[SDLSoftButtonObject alloc] initWithName:@"invalid soft button" states:@[state1, state2] initialStateName:state1.name handler:nil];
+ SDLSoftButtonObject *testValidSoftButton = [[SDLSoftButtonObject alloc] initWithName:@"valid soft button" text:@"state 3" artwork:nil handler:nil];
+ testInvalidSoftButtons = @[testValidSoftButton, testInvalidSoftButton];
+ });
+
+ it(@"should throw an exception if any button has multiple states", ^{
+ SDLAlertView *testAlertView = [[SDLAlertView alloc] init];
+
+ expectAction(^{
+ [testAlertView setSoftButtons:testInvalidSoftButtons];
+ }).to(raiseException().named(@"InvalidSoftButtonStates"));
+ });
+
+ it(@"should throw an exception if any button has multiple states when the property is set via a convenience init", ^{
+ expectAction(^{
+ (void)[[SDLAlertView alloc] initWithText:@"test" buttons:testInvalidSoftButtons];
+ }).to(raiseException().named(@"InvalidSoftButtonStates"));
+ });
+ });
+
+ describe(@"setting the default timeout", ^{
+ __block SDLAlertView *testAlertView = nil;
+
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] init];
+ });
+
+ it(@"should return 10 if a value greater than 10 has been set", ^{
+ SDLAlertView.defaultTimeout = 15.0;
+ expect(SDLAlertView.defaultTimeout).to(equal(10.0));
+ expect(testAlertView.timeout).to(equal(10.0));
+ });
+
+ it(@"should return 3 if a value less than 3 has been set", ^{
+ SDLAlertView.defaultTimeout = -2.0;
+ expect(SDLAlertView.defaultTimeout).to(equal(3.0));
+ expect(testAlertView.timeout).to(equal(3.0));
+ });
+
+ it(@"should return the set value if a value between 3 and 10 has been set", ^{
+ SDLAlertView.defaultTimeout = 4.5;
+ expect(SDLAlertView.defaultTimeout).to(equal(4.5));
+ expect(testAlertView.timeout).to(equal(4.5));
+ });
+
+ it(@"should return the set value if it is between 3 and 10", ^{
+ SDLAlertView.defaultTimeout = 3.0;
+ expect(SDLAlertView.defaultTimeout).to(equal(3.0));
+ expect(testAlertView.timeout).to(equal(3.0));
+ });
+ });
+
+ describe(@"setting the timeout", ^{
+ __block SDLAlertView *testAlertView = nil;
+ __block NSTimeInterval testDefaultTimeout = 5.0;
+
+ beforeEach(^{
+ SDLAlertView.defaultTimeout = testDefaultTimeout;
+ testAlertView = [[SDLAlertView alloc] init];
+ });
+
+ it(@"should return the default timeout if it has not been set", ^{
+ expect(testAlertView.timeout).to(equal(SDLAlertView.defaultTimeout));
+ });
+
+ it(@"should return the default timeout if 0 has been set", ^{
+ testAlertView.timeout = 0.0;
+ expect(testAlertView.timeout).to(equal(testDefaultTimeout));
+ });
+
+ it(@"should return 10 if a value greater than 10 has been set", ^{
+ testAlertView.timeout = 15.0;
+ expect(testAlertView.timeout).to(equal(10.0));
+ });
+
+ it(@"should return 3 if a value less than 3 has been set", ^{
+ testAlertView.timeout = 2.25;
+ expect(testAlertView.timeout).to(equal(3.0));
+ });
+
+ it(@"should return the set value if a value between 3 and 10 has been set", ^{
+ testAlertView.timeout = 9.5;
+ expect(testAlertView.timeout).to(equal(9.5));
+ });
+ });
+
+ describe(@"canceling the alert", ^{
+ __block SDLAlertView *testAlertView = nil;
+ __block BOOL canceledHandlerCalled = NO;
+
+ context(@"the cancel handler is set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.canceledHandler = ^{
+ canceledHandlerCalled = YES;
+ };
+ });
+
+ it(@"should call the cancelled handler", ^{
+ [testAlertView cancel];
+ expect(canceledHandlerCalled).to(beTrue());
+ });
+ });
+
+ context(@"the cancel handler is not set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.canceledHandler = nil;
+ });
+
+ it(@"should not crash", ^{
+ [testAlertView cancel];
+ });
+ });
+ });
+
+ describe(@"copying the alert", ^{
+ __block SDLAlertView *testAlertView = nil;
+ __block SDLAlertView *copiedTestAlertView = nil;
+
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:testTextField1 secondaryText:testTextField2 tertiaryText:testTextField3 timeout:@(testTimeout) showWaitIndicator:@(testShowWaitIndicator) audioIndication:testAudio buttons:testSoftButtons icon:testIcon];
+ testAlertView.canceledHandler = ^{};
+ copiedTestAlertView = [testAlertView copy];
+ });
+
+ it(@"should correctly copy the alert view", ^{
+ expect(testAlertView == copiedTestAlertView).to(beFalse());
+
+ expect(copiedTestAlertView.text).to(equal(testAlertView.text));
+ expect(copiedTestAlertView.secondaryText).to(equal(testAlertView.secondaryText));
+ expect(copiedTestAlertView.tertiaryText).to(equal(testAlertView.tertiaryText));
+ expect(copiedTestAlertView.timeout).to(equal(testAlertView.timeout));
+
+ expect(copiedTestAlertView.audio == testAlertView.audio).to(beFalse());
+ expect(copiedTestAlertView.audio.audioData).to(haveCount(1));
+ expect(copiedTestAlertView.audio.audioData[0]).to(equal(testAlertView.audio.audioData[0]));
+ expect(copiedTestAlertView.audio.playTone).to(equal(testAlertView.audio.playTone));
+
+ expect(copiedTestAlertView.showWaitIndicator).to(equal(testAlertView.showWaitIndicator));
+ expect(copiedTestAlertView.softButtons).to(equal(testAlertView.softButtons));
+
+ expect(copiedTestAlertView.icon == testAlertView.icon).to(beFalse());
+ expect(copiedTestAlertView.icon.name).to(equal(testAlertView.icon.name));
+
+ expect((id)copiedTestAlertView.canceledHandler).to(equal((id)testAlertView.canceledHandler));
+ });
+
+ it(@"Should not update the copy if changes are made to the original", ^{
+ testAlertView.text = @"changedText";
+ testAlertView.secondaryText = @"changedSecondaryText";
+ testAlertView.tertiaryText = @"changedTertiaryText";
+ testAlertView.timeout = 45;
+ testAlertView.audio = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"changedAudio"];
+ testAlertView.showWaitIndicator = YES;
+ testAlertView.softButtons = @[];
+ testAlertView.icon = testIcon2;
+ testAlertView.canceledHandler = ^{};
+
+ expect(copiedTestAlertView.text).toNot(equal(testAlertView.text));
+ expect(copiedTestAlertView.secondaryText).toNot(equal(testAlertView.secondaryText));
+ expect(copiedTestAlertView.tertiaryText).toNot(equal(testAlertView.tertiaryText));
+ expect(copiedTestAlertView.timeout).toNot(equal(testAlertView.timeout));
+ expect(copiedTestAlertView.audio).toNot(equal(testAlertView.audio));
+ expect(copiedTestAlertView.showWaitIndicator).toNot(equal(testAlertView.showWaitIndicator));
+ expect(copiedTestAlertView.softButtons).to(haveCount(1));
+ expect(copiedTestAlertView.softButtons).toNot(equal(testAlertView.softButtons));
+ expect(copiedTestAlertView.icon).toNot(equal(testAlertView.icon));
+ expect((id)copiedTestAlertView.canceledHandler).toNot(equal((id)testAlertView.canceledHandler));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m b/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m
index 952efd471..1ae8c65fd 100644
--- a/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m
+++ b/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m
@@ -40,9 +40,7 @@ describe(@"sending responses and notifications", ^{
it(@"should correctly send the rpc", ^{
testOperation = [[SDLAsynchronousRPCOperation alloc] initWithConnectionManager:testConnectionManager rpc:sendRPC];
-
[testOperationQueue addOperation:testOperation];
- [NSThread sleepForTimeInterval:0.1];
expect(testConnectionManager.receivedRequests).toEventually(contain(sendRPC));
});
@@ -85,9 +83,7 @@ describe(@"sending responses and notifications", ^{
[testOperationQueue cancelAllOperations];
[testOperationQueue setSuspended:NO];
- [NSThread sleepForTimeInterval:0.5];
-
- expect(testConnectionManager.receivedRequests).toEventually(beEmpty());
+ expect(testConnectionManager.receivedRequests).withTimeout(3.0).toEventually(beEmpty());
});
});
});
diff --git a/SmartDeviceLinkTests/SDLAudioDataSpec.m b/SmartDeviceLinkTests/SDLAudioDataSpec.m
new file mode 100644
index 000000000..74d46a063
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLAudioDataSpec.m
@@ -0,0 +1,301 @@
+//
+// SDLAudioDataSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 11/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAudioData.h"
+#import "SDLFile.h"
+#import "SDLFileManagerConstants.h"
+#import "SDLTTSChunk.h"
+
+@interface SDLAudioData()
+
+@property (nullable, copy, nonatomic, readonly) NSDictionary<SDLFileName *, SDLFile *> *audioFileData;
+
+@end
+
+QuickSpecBegin(SDLAudioDataSpec)
+
+describe(@"SDLAudioData", ^{
+ __block NSString *testSpeechSynthesizerString = nil;
+ __block SDLFile *testAudioFile1 = nil;
+ __block SDLFile *testAudioFile2 = nil;
+ __block SDLFile *testAudioFile3 = nil;
+
+ beforeEach(^{
+ testSpeechSynthesizerString = @"testSpeechSynthesizerString";
+
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testAudioFile1 = [[SDLFile alloc] initWithFileURL:[testBundle URLForResource:@"testAudio" withExtension:@"mp3"] name:@"testAudioFile1" persistent:YES];
+ testAudioFile2 = [[SDLFile alloc] initWithFileURL:[testBundle URLForResource:@"testAudio" withExtension:@"mp3"] name:@"testAudioFile2" persistent:YES];
+ testAudioFile3 = [[SDLFile alloc] initWithFileURL:[testBundle URLForResource:@"testAudio" withExtension:@"mp3"] name:@"testAudioFile3" persistent:YES];
+ });
+
+ describe(@"Initialization", ^{
+ it(@"Should get correctly when initialized with initWithAudioFile:", ^{
+ SDLAudioData *testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ });
+
+ it(@"Should get correctly when initialized with initWithSpeechSynthesizerString:", ^{
+ SDLAudioData *testAudioData = [[SDLAudioData alloc] initWithSpeechSynthesizerString:testSpeechSynthesizerString];
+
+ expect(testAudioData.audioFileData).to(beEmpty());
+
+ expect(testAudioData.audioData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testSpeechSynthesizerString));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesText));
+ });
+
+ it(@"Should get correctly when initialized with initWithPhoneticSpeechSynthesizerString:phoneticType:", ^{
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesLHPlusPhonemes;
+ SDLAudioData *testAudioData = [[SDLAudioData alloc] initWithPhoneticSpeechSynthesizerString:testSpeechSynthesizerString phoneticType:testSpeechCapabilities];
+
+ expect(testAudioData.audioFileData).to(beEmpty());
+
+ expect(testAudioData.audioData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testSpeechSynthesizerString));
+ expect(testAudioData.audioData[0].type).to(equal(testSpeechCapabilities));
+ });
+
+ it(@"Should fail if initialized with an invalid phoneticType in initWithPhoneticSpeechSynthesizerString:phoneticType:", ^{
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesSilence;
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-value"
+ expectAction(^{ [[SDLAudioData alloc] initWithPhoneticSpeechSynthesizerString:testSpeechSynthesizerString phoneticType:testSpeechCapabilities]; }).to(raiseException().named(@"InvalidTTSSpeechCapabilities"));
+#pragma clang diagnostic pop
+ });
+ });
+
+ describe(@"Adding additional audio data", ^{
+ __block SDLAudioData *testAudioData = nil;
+ __block NSString *testSpeechSynthesizerString1 = @"testSpeechSynthesizerString1";
+ __block NSString *testSpeechSynthesizerString2 = @"testSpeechSynthesizerString2";
+ __block NSString *testSpeechSynthesizerString3 = @"testSpeechSynthesizerString3";
+ __block NSString *testEmptySpeechSynthesizerString = @"";
+
+ context(@"If adding audio files", ^{
+ it(@"Should append the audio file data to the current existing lists if the first added item was an audio file", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ [testAudioData addAudioFiles:@[testAudioFile2, testAudioFile3]];
+
+ expect(testAudioData.audioData).to(haveCount(3));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[1].text).to(equal(testAudioFile2.name));
+ expect(testAudioData.audioData[2].text).to(equal(testAudioFile3.name));
+
+ expect(testAudioData.audioFileData).to(haveCount(3));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+ expect(testAudioData.audioFileData[testAudioFile2.name]).to(equal(testAudioFile2));
+ expect(testAudioData.audioFileData[testAudioFile3.name]).to(equal(testAudioFile3));
+ });
+
+ it(@"Should append the audio file data to the current existing lists if the first added item was a prompt", ^{
+ testAudioData = [[SDLAudioData alloc] initWithSpeechSynthesizerString:testSpeechSynthesizerString];
+ [testAudioData addAudioFiles:@[testAudioFile1]];
+
+ expect(testAudioData.audioData).to(haveCount(2));
+ expect(testAudioData.audioData[0].text).to(equal(testSpeechSynthesizerString));
+ expect(testAudioData.audioData[1].text).to(equal(testAudioFile1.name));
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+ });
+
+ it(@"Should replace audio file data with duplicate file names", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ [testAudioData addAudioFiles:@[testAudioFile1, testAudioFile2, testAudioFile2]];
+
+ expect(testAudioData.audioData).to(haveCount(4));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[1].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[2].text).to(equal(testAudioFile2.name));
+ expect(testAudioData.audioData[3].text).to(equal(testAudioFile2.name));
+
+ expect(testAudioData.audioFileData).to(haveCount(2));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+ expect(testAudioData.audioFileData[testAudioFile2.name]).to(equal(testAudioFile2));
+ });
+ });
+
+ context(@"If adding speech synthesizer strings", ^{
+ it(@"Should append the additional speech synthesizer strings to the existing audio data", ^{
+ testAudioData = [[SDLAudioData alloc] initWithSpeechSynthesizerString:testSpeechSynthesizerString1];
+ [testAudioData addSpeechSynthesizerStrings:@[testSpeechSynthesizerString2, testSpeechSynthesizerString3]];
+
+ expect(testAudioData.audioFileData).to(beEmpty());
+
+ expect(testAudioData.audioData).to(haveCount(3));
+ expect(testAudioData.audioData[0].text).to(equal(testSpeechSynthesizerString1));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesText));
+ expect(testAudioData.audioData[1].text).to(equal(testSpeechSynthesizerString2));
+ expect(testAudioData.audioData[1].type).to(equal(SDLSpeechCapabilitiesText));
+ expect(testAudioData.audioData[2].text).to(equal(testSpeechSynthesizerString3));
+ expect(testAudioData.audioData[2].type).to(equal(SDLSpeechCapabilitiesText));
+ });
+
+ it(@"Should not append any additional speech synthesizer strings that are empty", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ [testAudioData addSpeechSynthesizerStrings:@[testSpeechSynthesizerString1, testEmptySpeechSynthesizerString, testSpeechSynthesizerString2]];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioData).to(haveCount(3));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ expect(testAudioData.audioData[1].text).to(equal(testSpeechSynthesizerString1));
+ expect(testAudioData.audioData[1].type).to(equal(SDLSpeechCapabilitiesText));
+ expect(testAudioData.audioData[2].text).to(equal(testSpeechSynthesizerString2));
+ expect(testAudioData.audioData[2].type).to(equal(SDLSpeechCapabilitiesText));
+ });
+
+ it(@"Should not append an array with only empty additional speech synthesizer strings", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ [testAudioData addSpeechSynthesizerStrings:@[testEmptySpeechSynthesizerString]];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ });
+
+ it(@"Should not append an empty array of speech synthesizer strings", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ [testAudioData addSpeechSynthesizerStrings:@[]];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ });
+ });
+
+ context(@"If adding phonetic speech synthesizer strings", ^{
+ it(@"Should append the additional phonetic speech synthesizer strings to the existing audio data", ^{
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesSAPIPhonemes;
+ testAudioData = [[SDLAudioData alloc] initWithPhoneticSpeechSynthesizerString:testSpeechSynthesizerString1 phoneticType:testSpeechCapabilities];
+ [testAudioData addPhoneticSpeechSynthesizerStrings:@[testSpeechSynthesizerString2] phoneticType:testSpeechCapabilities];
+
+ expect(testAudioData.audioFileData).to(beEmpty());
+
+ expect(testAudioData.audioData).to(haveCount(2));
+ expect(testAudioData.audioData[0].text).to(equal(testSpeechSynthesizerString1));
+ expect(testAudioData.audioData[0].type).to(equal(testSpeechCapabilities));
+ expect(testAudioData.audioData[1].text).to(equal(testSpeechSynthesizerString2));
+ expect(testAudioData.audioData[1].type).to(equal(testSpeechCapabilities));
+ });
+
+ it(@"Should not append any additional phonetic speech synthesizer strings that are empty", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesText;
+ [testAudioData addPhoneticSpeechSynthesizerStrings:@[testSpeechSynthesizerString1, testSpeechSynthesizerString2, testEmptySpeechSynthesizerString] phoneticType:testSpeechCapabilities];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioData).to(haveCount(3));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ expect(testAudioData.audioData[1].text).to(equal(testSpeechSynthesizerString1));
+ expect(testAudioData.audioData[1].type).to(equal(testSpeechCapabilities));
+ expect(testAudioData.audioData[2].text).to(equal(testSpeechSynthesizerString2));
+ expect(testAudioData.audioData[2].type).to(equal(testSpeechCapabilities));
+ });
+
+ it(@"Should not append an array with only empty additional phonetic speech synthesizer strings", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesText;
+ [testAudioData addPhoneticSpeechSynthesizerStrings:@[testEmptySpeechSynthesizerString] phoneticType:testSpeechCapabilities];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ });
+
+ it(@"Should not append an empty array of phonetic speech synthesizer strings", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesText;
+ [testAudioData addPhoneticSpeechSynthesizerStrings:@[] phoneticType:testSpeechCapabilities];
+
+ expect(testAudioData.audioFileData).to(haveCount(1));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+
+ expect(testAudioData.audioData).to(haveCount(1));
+ expect(testAudioData.audioData[0].text).to(equal(testAudioFile1.name));
+ expect(testAudioData.audioData[0].type).to(equal(SDLSpeechCapabilitiesFile));
+ });
+
+ it(@"Should not append additional phonetic speech synthesizer strings with an invalid phonetic type", ^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ SDLSpeechCapabilities testSpeechCapabilities = SDLSpeechCapabilitiesFile;
+
+ expectAction(^{ [testAudioData addPhoneticSpeechSynthesizerStrings:@[testSpeechSynthesizerString1] phoneticType:testSpeechCapabilities]; }).to(raiseException().named(@"InvalidTTSSpeechCapabilities"));
+ });
+ });
+ });
+
+ describe(@"Copying audio data", ^{
+ __block SDLAudioData *testAudioData = nil;
+ __block SDLAudioData *copiedTestAudioData = nil;
+ __block NSString *testSpeechSynthesizerString1 = @"testSpeechSynthesizerString1";
+ __block NSString *testSpeechSynthesizerString2 = @"testSpeechSynthesizerString2";
+ __block NSString *testSpeechSynthesizerString3 = @"testSpeechSynthesizerString3";
+
+ beforeEach(^{
+ testAudioData = [[SDLAudioData alloc] initWithAudioFile:testAudioFile1];
+ [testAudioData addSpeechSynthesizerStrings:@[testSpeechSynthesizerString1, testSpeechSynthesizerString2]];
+
+ copiedTestAudioData = [testAudioData copy];
+ });
+
+ it(@"Should copy correctly", ^{
+ expect(testAudioData == copiedTestAudioData).to(beFalse());
+ expect(testAudioData.audioData).to(equal(copiedTestAudioData.audioData));
+ expect(testAudioData.audioFileData).to(equal(copiedTestAudioData.audioFileData));
+ });
+
+ it(@"Should not update the copy if changes are made to the original", ^{
+ [testAudioData addSpeechSynthesizerStrings:@[testSpeechSynthesizerString3]];
+ [testAudioData addAudioFiles:@[testAudioFile2]];
+
+ expect(testAudioData.audioData).to(haveCount(5));
+ expect(testAudioData.audioData[0].text).to(contain(testAudioFile1.name));
+ expect(testAudioData.audioData[1].text).to(contain(testSpeechSynthesizerString1));
+ expect(testAudioData.audioData[2].text).to(contain(testSpeechSynthesizerString2));
+ expect(testAudioData.audioData[3].text).to(contain(testSpeechSynthesizerString3));
+ expect(testAudioData.audioData[4].text).to(contain(testAudioFile2.name));
+
+ expect(testAudioData.audioFileData).to(haveCount(2));
+ expect(testAudioData.audioFileData[testAudioFile1.name]).to(equal(testAudioFile1));
+ expect(testAudioData.audioFileData[testAudioFile2.name]).to(equal(testAudioFile2));
+
+ expect(copiedTestAudioData.audioData).to(haveCount(3));
+ expect(copiedTestAudioData.audioFileData).to(haveCount(1));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLCarWindowSpec.m b/SmartDeviceLinkTests/SDLCarWindowSpec.m
new file mode 100644
index 000000000..f90dd4d53
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLCarWindowSpec.m
@@ -0,0 +1,172 @@
+//
+// SDLSDLCarWindowSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <AVFoundation/AVFoundation.h>
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLCarWindow.h"
+#import "SDLStreamingVideoLifecycleManager.h"
+#import "SDLStreamingMediaConfiguration.h"
+#import "SDLVideoStreamingCapability.h"
+#import "SDLStreamingVideoScaleManager.h"
+#import "TestSmartConnectionManager.h"
+#import "SDLStateMachine.h"
+
+@interface SDLCarWindow (discover_internals)
++ (nullable CVPixelBufferRef)sdl_createPixelBufferForImageRef:(CGImageRef)imageRef usingPool:(CVPixelBufferPoolRef)pool;
+@end
+
+@interface SDLStreamingVideoLifecycleManager(discover_internals)
+@property (strong, nonatomic, readonly) SDLStateMachine *videoStreamStateMachine;
+- (void)sdl_applyVideoCapability:(SDLVideoStreamingCapability *)capability;
+@end
+
+@interface SDLStreamingVideoLifecycleExtendedTestManager : SDLStreamingVideoLifecycleManager
+@property (assign) BOOL isVideoConnectedTest;
+@property (assign) BOOL isVideoStreamingPausedTest;
+@property (assign) BOOL sendVideoDataDidCall;
+@end
+
+
+@implementation SDLStreamingVideoLifecycleExtendedTestManager {
+ VTCompressionSessionRef session;
+ CVPixelBufferPoolRef pool;
+}
+
+- (BOOL)isVideoConnected {
+ return self.isVideoConnectedTest;
+}
+
+- (BOOL)isVideoStreamingPaused {
+ return self.isVideoStreamingPausedTest;
+}
+
+- (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer {
+ self.sendVideoDataDidCall = YES;
+ return YES;
+}
+
+- (CVPixelBufferPoolRef)pixelBufferPool {
+ if (pool) {
+ return pool;
+ }
+ OSStatus status = VTCompressionSessionCreate(NULL, 64, 64, kCMVideoCodecType_H264, NULL, NULL, NULL, NULL, NULL, &session);
+ if (0 != status) {
+ NSLog(@"Cannot create compression session");
+ return NULL;
+ }
+ pool = VTCompressionSessionGetPixelBufferPool(session);
+ return pool;
+}
+
+@end
+
+QuickSpecBegin(SDLCarWindowSpec)
+
+describe(@"test car window", ^{
+ UIViewController *rootViewController = [[UIViewController alloc] init];
+
+ context(@"init and assign", ^{
+ SDLCarWindow *carWindow = [[SDLCarWindow alloc] init];
+ carWindow.rootViewController = rootViewController;
+ it(@"make sure object created and all set", ^{
+ expect(carWindow).toNot(beNil());
+ expect(carWindow.rootViewController).toEventually(equal(rootViewController));
+ });
+ });
+
+ context(@"initWithStreamManager:configuration:", ^{
+ SDLStreamingVideoLifecycleManager *videoManager = OCMClassMock([SDLStreamingVideoLifecycleManager class]);
+ SDLStreamingMediaConfiguration *config = OCMClassMock([SDLStreamingMediaConfiguration class]);
+ SDLCarWindow *carWindow = [[SDLCarWindow alloc] initWithStreamManager:videoManager configuration:config];
+ carWindow.rootViewController = rootViewController;
+ it(@"make sure object created and all set", ^{
+ expect(carWindow).toNot(beNil());
+ expect(carWindow.rootViewController).toEventually(equal(rootViewController));
+ });
+ });
+
+ context(@"compression session and pixel buffer", ^{
+ UInt8 pixelData[64 * 64 * 3] = {0};
+ CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
+ CFDataRef rgbData = CFDataCreate(NULL, pixelData, 64 * 64 * 3);
+ CGDataProviderRef provider = CGDataProviderCreateWithCFData(rgbData);
+ CGImageRef rgbImageRef = CGImageCreate(64, 64, 8, 24, 64 * 3, colorspace, kCGBitmapByteOrderDefault, provider, NULL, true, kCGRenderingIntentDefault);
+ CFRelease(rgbData);
+ CGDataProviderRelease(provider);
+ CGColorSpaceRelease(colorspace);
+
+ VTCompressionSessionRef session;
+ OSStatus status = VTCompressionSessionCreate(NULL, 64, 64, kCMVideoCodecType_H264, NULL, NULL, NULL, NULL, NULL, &session);
+ CVPixelBufferPoolRef pool = VTCompressionSessionGetPixelBufferPool(session);
+ CVPixelBufferRef pxBuffer = [SDLCarWindow sdl_createPixelBufferForImageRef:rgbImageRef usingPool:pool];
+
+ it(@"expect pixel buffer to be created", ^{
+ expect(status).to(equal(0));
+ expect((id)CFBridgingRelease(pxBuffer)).toNot(beNil());
+ CGImageRelease(rgbImageRef);
+ });
+ });
+
+ context(@"initWithStreamManager:configuration:", ^{
+ id<SDLConnectionManagerType> mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ SDLConfiguration *configuration = [[SDLConfiguration alloc] init];
+ SDLStreamingVideoLifecycleExtendedTestManager *streamingLifecycleManager = [[SDLStreamingVideoLifecycleExtendedTestManager alloc] initWithConnectionManager:mockConnectionManager configuration:configuration systemCapabilityManager:nil];
+ SDLStreamingMediaConfiguration *config = [SDLStreamingMediaConfiguration autostreamingInsecureConfigurationWithInitialViewController:rootViewController];
+ SDLCarWindow *carWindow = [[SDLCarWindow alloc] initWithStreamManager:streamingLifecycleManager configuration:config];
+ carWindow.rootViewController = rootViewController;
+ const CGRect frame = CGRectMake(0, 0, 200, 400);
+ rootViewController.view.frame = frame;
+
+ streamingLifecycleManager.videoScaleManager.displayViewportResolution = CGSizeMake(100, 200);
+ SDLImageResolution *imgResolution = [[SDLImageResolution alloc] initWithWidth:200 height:300];
+ const float scale = 2.0;
+ SDLVideoStreamingCapability *videoStreamingCapability = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:imgResolution maxBitrate:nil supportedFormats:nil hapticSpatialDataSupported:nil diagonalScreenSize:@(2.5) pixelPerInch:@(300) scale:@(scale) preferredFPS:nil];
+ [streamingLifecycleManager sdl_applyVideoCapability:videoStreamingCapability];
+
+
+ it(@"make sure object created and all set", ^{
+ expect(carWindow).toNot(beNil());
+
+ SDLVideoStreamingCapability *videoStreamingCapability = nil;
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ // keep weak ref to streamingLifecycleManager alive
+ expect(streamingLifecycleManager).notTo(beNil());
+ expect(carWindow.rootViewController).to(equal(rootViewController));
+ expect(CGSizeEqualToSize(frame.size, rootViewController.view.frame.size)).to(beTrue());
+ [carWindow updateVideoStreamingCapability:videoStreamingCapability];
+
+ const CGSize scaledSize = CGSizeMake(imgResolution.resolutionWidth.floatValue/scale, imgResolution.resolutionHeight.floatValue/scale);
+ expect(CGSizeEqualToSize(scaledSize, rootViewController.view.frame.size)).to(beTrue());
+
+ SDLImageResolution *resolution = nil;
+ SDLVideoStreamingCapability *videoStreamingCapability2 = [[SDLVideoStreamingCapability alloc] initWithPreferredResolution:resolution maxBitrate:@(999) supportedFormats:nil hapticSpatialDataSupported:@YES diagonalScreenSize:@(2.2) pixelPerInch:@(100) scale:@(1) preferredFPS:nil];
+ [carWindow updateVideoStreamingCapability:videoStreamingCapability2];
+ // the size should not change
+ expect(CGSizeEqualToSize(scaledSize, rootViewController.view.frame.size)).to(beTrue());
+
+ // make sure pixel data gets sent (fake send is being called)
+ [carWindow syncFrame];
+ streamingLifecycleManager.isVideoConnectedTest = YES;
+ expect(streamingLifecycleManager.sendVideoDataDidCall).to(beFalse());
+ [carWindow syncFrame];
+ expect(streamingLifecycleManager.sendVideoDataDidCall).to(beTrue());
+
+ streamingLifecycleManager.sendVideoDataDidCall = NO;
+ streamingLifecycleManager.videoScaleManager.displayViewportResolution = CGSizeMake(-1, -1);
+
+ // should not get called with wrong resolution
+ expect(streamingLifecycleManager.sendVideoDataDidCall).to(beFalse());
+ [carWindow syncFrame];
+ expect(streamingLifecycleManager.sendVideoDataDidCall).to(beFalse());
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m b/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m
index 15295118b..d1559b136 100644
--- a/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m
@@ -45,6 +45,7 @@ describe(@"the encryption lifecycle manager", ^{
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
+ testConnectionManager.systemInfo = [[SDLSystemInfo alloc] initWithMake:@"Make" model:@"Model" trim:@"Trim" modelYear:@"Model Year" softwareVersion:@"1.1.1.1" hardwareVersion:@"2.2.2.2"];
testFakeSecurityManager = [[SDLFakeSecurityManager alloc] init];
SDLEncryptionConfiguration *encryptionConfig = [[SDLEncryptionConfiguration alloc] initWithSecurityManagers:@[testFakeSecurityManager.class] delegate:nil];
@@ -63,122 +64,123 @@ describe(@"the encryption lifecycle manager", ^{
describe(@"when started", ^{
__block BOOL readyHandlerSuccess = NO;
__block NSError *readyHandlerError = nil;
-
__block SDLProtocol *protocolMock = OCMClassMock([SDLProtocol class]);
-
- beforeEach(^{
- readyHandlerSuccess = NO;
- readyHandlerError = nil;
-
- [encryptionLifecycleManager startWithProtocol:protocolMock];
- });
-
- it(@"should not be ready to encrypt", ^{
- expect(encryptionLifecycleManager.isEncryptionReady).to(beFalse());
- });
-
- describe(@"after receiving an RPC Start ACK", ^{
- __block SDLProtocolHeader *testRPCHeader = nil;
- __block SDLProtocolMessage *testRPCMessage = nil;
-
- beforeEach(^{
- [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStarting fromOldState:nil callEnterTransition:YES];
-
- testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testRPCHeader.frameType = SDLFrameTypeSingle;
- testRPCHeader.frameData = SDLFrameInfoStartServiceACK;
- testRPCHeader.encrypted = YES;
- testRPCHeader.serviceType = SDLServiceTypeRPC;
-
- testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testRPCMessage];
- });
-
- it(@"should have set all the right properties", ^{
- expect(encryptionLifecycleManager.isEncryptionReady).to(equal(YES));
- expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateReady));
- });
- });
-
- describe(@"after receiving an RPC Start NAK", ^{
- __block SDLProtocolHeader *testRPCHeader = nil;
- __block SDLProtocolMessage *testRPCMessage = nil;
-
+
+ context(@"when system info doesn't match", ^{
beforeEach(^{
- [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStarting fromOldState:nil callEnterTransition:NO];
-
- testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testRPCHeader.frameType = SDLFrameTypeSingle;
- testRPCHeader.frameData = SDLFrameInfoStartServiceNACK;
- testRPCHeader.encrypted = NO;
- testRPCHeader.serviceType = SDLServiceTypeRPC;
-
- testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testRPCMessage];
+ readyHandlerSuccess = NO;
+ readyHandlerError = nil;
+
+ [encryptionLifecycleManager startWithProtocol:protocolMock];
});
-
- it(@"should have set all the right properties", ^{
- expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+
+ it(@"should not be ready to encrypt", ^{
+ OCMVerify([protocolMock setSecurityManager:[OCMArg isNil]]);
+ expect(encryptionLifecycleManager.isEncryptionReady).to(beFalse());
});
});
-
- describe(@"after receiving a RPC end ACK", ^{
- __block SDLProtocolHeader *testRPCHeader = nil;
- __block SDLProtocolMessage *testRPCMessage = nil;
-
+
+ context(@"when security managers are available", ^{
beforeEach(^{
- [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStopped fromOldState:nil callEnterTransition:NO];
-
- testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testRPCHeader.frameType = SDLFrameTypeSingle;
- testRPCHeader.frameData = SDLFrameInfoEndServiceACK;
- testRPCHeader.encrypted = NO;
- testRPCHeader.serviceType = SDLServiceTypeRPC;
-
- testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testRPCMessage];
+ testConnectionManager.systemInfo.vehicleType.make = @"SDL";
+ readyHandlerSuccess = NO;
+ readyHandlerError = nil;
+
+ [encryptionLifecycleManager startWithProtocol:protocolMock];
});
-
- it(@"should have set all the right properties", ^{
- expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+
+ it(@"should not be ready to encrypt", ^{
+ OCMVerify([protocolMock setSecurityManager:[OCMArg isNotNil]]);
+ expect(encryptionLifecycleManager.isEncryptionReady).to(beFalse());
});
- });
-
- describe(@"after receiving a RPC end NAK", ^{
- __block SDLProtocolHeader *testRPCHeader = nil;
- __block SDLProtocolMessage *testRPCMessage = nil;
-
- beforeEach(^{
- [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStopped fromOldState:nil callEnterTransition:NO];
-
- testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- testRPCHeader.frameType = SDLFrameTypeSingle;
- testRPCHeader.frameData = SDLFrameInfoEndServiceNACK;
- testRPCHeader.encrypted = NO;
- testRPCHeader.serviceType = SDLServiceTypeRPC;
-
- testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testRPCMessage];
+
+ describe(@"after receiving an RPC Start ACK", ^{
+ __block SDLProtocolHeader *testRPCHeader = nil;
+ __block SDLProtocolMessage *testRPCMessage = nil;
+
+ beforeEach(^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStarting fromOldState:nil callEnterTransition:YES];
+
+ testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testRPCHeader.frameType = SDLFrameTypeSingle;
+ testRPCHeader.frameData = SDLFrameInfoStartServiceACK;
+ testRPCHeader.encrypted = YES;
+ testRPCHeader.serviceType = SDLServiceTypeRPC;
+
+ testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testRPCMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(encryptionLifecycleManager.isEncryptionReady).to(equal(YES));
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateReady));
+ });
});
-
- it(@"should have set all the right properties", ^{
- expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+
+ describe(@"after receiving an RPC Start NAK", ^{
+ __block SDLProtocolHeader *testRPCHeader = nil;
+ __block SDLProtocolMessage *testRPCMessage = nil;
+
+ beforeEach(^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStarting fromOldState:nil callEnterTransition:NO];
+
+ testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testRPCHeader.frameType = SDLFrameTypeSingle;
+ testRPCHeader.frameData = SDLFrameInfoStartServiceNACK;
+ testRPCHeader.encrypted = NO;
+ testRPCHeader.serviceType = SDLServiceTypeRPC;
+
+ testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testRPCMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+ });
});
- });
- describe(@"when a register app interface response is received", ^{
- beforeEach(^{
- OCMExpect([protocolMock setSecurityManager:[OCMArg any]]);
+ describe(@"after receiving a RPC end ACK", ^{
+ __block SDLProtocolHeader *testRPCHeader = nil;
+ __block SDLProtocolMessage *testRPCMessage = nil;
+
+ beforeEach(^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStopped fromOldState:nil callEnterTransition:NO];
+
+ testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testRPCHeader.frameType = SDLFrameTypeSingle;
+ testRPCHeader.frameData = SDLFrameInfoEndServiceACK;
+ testRPCHeader.encrypted = NO;
+ testRPCHeader.serviceType = SDLServiceTypeRPC;
- SDLRegisterAppInterfaceResponse *rair = [[SDLRegisterAppInterfaceResponse alloc] init];
- rair.vehicleType = [[SDLVehicleType alloc] init];
- rair.vehicleType.make = @"SDL";
- SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:nil rpcResponse:rair];
- [[NSNotificationCenter defaultCenter] postNotification:notification];
+ testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testRPCMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+ });
});
- it(@"should set the protocol's security manager", ^{
- OCMVerifyAll((id)protocolMock);
+ describe(@"after receiving a RPC end NAK", ^{
+ __block SDLProtocolHeader *testRPCHeader = nil;
+ __block SDLProtocolMessage *testRPCMessage = nil;
+
+ beforeEach(^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStopped fromOldState:nil callEnterTransition:NO];
+
+ testRPCHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ testRPCHeader.frameType = SDLFrameTypeSingle;
+ testRPCHeader.frameData = SDLFrameInfoEndServiceNACK;
+ testRPCHeader.encrypted = NO;
+ testRPCHeader.serviceType = SDLServiceTypeRPC;
+
+ testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testRPCMessage];
+ });
+
+ it(@"should have set all the right properties", ^{
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+ });
});
});
});
diff --git a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m
index a8a666fb6..63eb97f95 100644
--- a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m
+++ b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m
@@ -42,19 +42,19 @@ describe(@"menuUpdateAlgorithm", ^{
// 0 = Delete 1 = Add 2 = Keep
describe(@"compare old and new menu cells", ^{
beforeEach(^{
- oldCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- oldCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- oldCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- oldCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- oldCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- oldCell6 = [[SDLMenuCell alloc] initWithTitle:@"Cell 6" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
-
- newCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- newCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- newCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- newCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- newCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- newCell6 = [[SDLMenuCell alloc] initWithTitle:@"Cell 6" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ oldCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ oldCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ oldCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ oldCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ oldCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ oldCell6 = [[SDLMenuCell alloc] initWithTitle:@"Cell 6" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+
+ newCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ newCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ newCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ newCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ newCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ newCell6 = [[SDLMenuCell alloc] initWithTitle:@"Cell 6" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
});
it(@"should have a new menu status of 22221 and an old menu status of 2222 on best run", ^{
diff --git a/SmartDeviceLinkTests/SDLPresentAlertOperationSpec.m b/SmartDeviceLinkTests/SDLPresentAlertOperationSpec.m
new file mode 100644
index 000000000..599afa415
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLPresentAlertOperationSpec.m
@@ -0,0 +1,1147 @@
+//
+// SDLPresentAlertOperationSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 11/18/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLAlert.h"
+#import "SDLAlertResponse.h"
+#import "SDLAlertView.h"
+#import "SDLAlertAudioData.h"
+#import "SDLCancelInteraction.h"
+#import "SDLCancelInteractionResponse.h"
+#import "SDLError.h"
+#import "SDLFileManager.h"
+#import "SDLFunctionID.h"
+#import "SDLGlobals.h"
+#import "SDLImage.h"
+#import "SDLPresentAlertOperation.h"
+#import "SDLPutFile.h"
+#import "SDLWindowCapability.h"
+#import "SDLSoftButton.h"
+#import "SDLSoftButtonCapabilities.h"
+#import "SDLSoftButtonObject.h"
+#import "SDLSoftButtonState.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLTTSChunk.h"
+#import "SDLVersion.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+#import "TestConnectionManager.h"
+
+@interface SDLPresentAlertOperation()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (strong, nonatomic, readwrite) SDLAlertView *alertView;
+@property (assign, nonatomic) UInt16 cancelId;
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+- (nullable NSError *)sdl_isValidAlertViewData:(SDLAlertView *)alertView;
+- (SDLAlert *)alertRPC;
+
+@end
+
+QuickSpecBegin(SDLPresentAlertOperationSpec)
+
+describe(@"SDLPresentAlertOperation", ^{
+ __block SDLPresentAlertOperation *testPresentAlertOperation = nil;
+ __block id mockConnectionManager = nil;
+ __block id mockFileManager = nil;
+ __block id mockSystemCapabilityManager = nil;
+ __block id mockCurrentWindowCapability = nil;
+ __block SDLAlertView *testAlertView = nil;
+ __block UInt16 testCancelID = 45;
+ __block BOOL hasCalledOperationCompletionHandler = NO;
+
+ __block SDLAlertAudioData *testAlertAudioData = nil;
+ __block SDLFile *testAudioFile = nil;
+ __block SDLAlertAudioData *testAlertAudioFileData = nil;
+ __block SDLSoftButtonObject *testAlertSoftButton1 = nil;
+ __block SDLSoftButtonObject *testAlertSoftButton2 = nil;
+ __block SDLSoftButtonObject *testAlertSoftButton3 = nil;
+ __block SDLSoftButtonObject *testAlertSoftButton4 = nil;
+ __block SDLSoftButtonObject *testAlertSoftButton5 = nil;
+ __block SDLSoftButtonObject *testAlertSoftButton6 = nil;
+ __block SDLArtwork *testAlertIcon = nil;
+ __block SDLArtwork *testButton1Icon = nil;
+ __block SDLArtwork *testButton2Icon = nil;
+
+ __block SDLVersion *alertAudioFileSupportedSpecVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ __block SDLVersion *alertAudioFileNotSupportedSpecVersion = [SDLVersion versionWithMajor:4 minor:8 patch:0];
+
+ beforeEach(^{
+ mockConnectionManager = OCMProtocolMock(@protocol(SDLConnectionManagerType));
+ mockFileManager = OCMClassMock([SDLFileManager class]);
+ mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
+ mockCurrentWindowCapability = OCMClassMock([SDLWindowCapability class]);
+
+ testAlertAudioData = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"test synthesizer string"];
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ NSURL *testAudioFileURL = [testBundle URLForResource:@"testAudio" withExtension:@"mp3"];
+ NSString *testAudioFileName = @"testAudioFile";
+ testAudioFile = [[SDLFile alloc] initWithFileURL:testAudioFileURL name:testAudioFileName persistent:YES];
+ testAlertAudioFileData = [[SDLAlertAudioData alloc] initWithAudioFile:testAudioFile];
+
+ UIImage *testButton1Image = [[UIImage alloc] initWithContentsOfFile:[testBundle pathForResource:@"testImageJPEG" ofType:@"jpeg"]];
+ testButton1Icon = [SDLArtwork artworkWithImage:testButton1Image asImageFormat:SDLArtworkImageFormatJPG];
+ UIImage *testButton2Image = [[UIImage alloc] initWithContentsOfFile:[testBundle pathForResource:@"testImagePNG" ofType:@"png"]];
+ testButton2Icon = [SDLArtwork artworkWithImage:testButton2Image asImageFormat:SDLArtworkImageFormatPNG];
+
+ testAlertSoftButton1 = [[SDLSoftButtonObject alloc] initWithName:@"button1" text:@"button1" artwork:testButton1Icon handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ testAlertSoftButton2 = [[SDLSoftButtonObject alloc] initWithName:@"button2" text:@"button2" artwork:testButton2Icon handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ testAlertSoftButton3 = [[SDLSoftButtonObject alloc] initWithName:@"button3" text:@"button3" artwork:testButton2Icon handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ testAlertSoftButton4 = [[SDLSoftButtonObject alloc] initWithName:@"button4" text:@"button4" artwork:testButton2Icon handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ testAlertSoftButton5 = [[SDLSoftButtonObject alloc] initWithName:@"button5" text:@"button5" artwork:testButton2Icon handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ testAlertSoftButton6 = [[SDLSoftButtonObject alloc] initWithName:@"button6" text:@"button6" artwork:testButton2Icon handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+
+ UIImage *testImage = [[UIImage alloc] initWithContentsOfFile:[testBundle pathForResource:@"testImageJPEG" ofType:@"jpeg"]];
+ testAlertIcon = [SDLArtwork artworkWithImage:testImage asImageFormat:SDLArtworkImageFormatPNG];
+
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ });
+
+ it(@"should be initialized correctly", ^{
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ expect(@(testPresentAlertOperation.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
+ expect(testPresentAlertOperation.connectionManager).to(equal(mockConnectionManager));
+ expect(testPresentAlertOperation.fileManager).to(equal(mockFileManager));
+ expect(testPresentAlertOperation.alertView).toNot(equal(testAlertView));
+ expect(@(testPresentAlertOperation.cancelId)).to(equal(@(testCancelID)));
+ expect(testPresentAlertOperation.currentWindowCapability).to(equal(mockCurrentWindowCapability));
+ expect(testPresentAlertOperation.internalError).to(beNil());
+ });
+
+ describe(@"creating the alert", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
+ });
+
+ describe(@"setting the text fields", ^{
+ describe(@"with all three text fields set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set all textfields if all textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(equal(testAlertView.secondaryText));
+ expect(testAlert.alertText3).to(equal(testAlertView.tertiaryText));
+ });
+
+ it(@"should set textfields correctly if only two textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(2);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(equal([NSString stringWithFormat:@"%@ - %@", testAlertView.secondaryText, testAlertView.tertiaryText]));
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only one textfield is supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(1);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal([NSString stringWithFormat:@"%@ - %@ - %@", testAlertView.text, testAlertView.secondaryText, testAlertView.tertiaryText]));
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+ });
+
+ describe(@"with two text fields set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:nil timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set all textfields if all textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(equal(testAlertView.secondaryText));
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only two textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(2);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(equal(testAlertView.secondaryText));
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only one textfield is supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(1);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal([NSString stringWithFormat:@"%@ - %@", testAlertView.text, testAlertView.secondaryText]));
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+ });
+
+ describe(@"with one text field set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:nil tertiaryText:nil timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set all textfields if all textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only two textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(2);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only one textfield is supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(1);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+ });
+
+ describe(@"with no text fields set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:nil secondaryText:nil tertiaryText:nil timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set all textfields if all textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(beNil());
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only two textfields are supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(2);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(beNil());
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+
+ it(@"should set textfields correctly if only one textfield is supported", ^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(1);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(beNil());
+ expect(testAlert.alertText2).to(beNil());
+ expect(testAlert.alertText3).to(beNil());
+ });
+ });
+
+ describe(@"with a nil currentWindowCapability", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:nil alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should assume all textfields are supported", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertText1).to(equal(testAlertView.text));
+ expect(testAlert.alertText2).to(equal(testAlertView.secondaryText));
+ expect(testAlert.alertText3).to(equal(testAlertView.tertiaryText));
+ });
+ });
+ });
+
+ describe(@"setting the audio data", ^{
+ context(@"only audio prompts set", ^{
+ beforeEach(^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+
+ SDLAlertAudioData *audioData = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"test synthesizer string"];
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:audioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set the tts chunks correctly", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.ttsChunks.count).to(equal(1));
+ expect(testAlert.ttsChunks[0].text).to(equal(testAlertView.audio.audioData.firstObject.text));
+ });
+ });
+
+ context(@"only audio file data set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioFileData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ context(@"the negotiated RPC spec version does not support the audio file feature", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileNotSupportedSpecVersion;
+ });
+
+ it(@"should set the `ttsChunks` to nil (and not an empty array) if only an audio file was set", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.ttsChunks).to(beNil());
+ });
+ });
+
+ context(@"the negotiated RPC spec version supports the audio file feature", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileSupportedSpecVersion;
+ });
+
+ context(@"the module does not support the speech capability of type `file`", ^{
+ beforeEach(^{
+ OCMStub([mockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesSilence]));
+ });
+
+ it(@"should set the `ttsChunks` to nil (and not an empty array) if only an audio file was set", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.ttsChunks).to(beNil());
+ });
+ });
+
+ context(@"the module supports the speech capability of type `file`", ^{
+ beforeEach(^{
+ OCMStub([mockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesFile, SDLSpeechCapabilitiesText]));
+ });
+
+ it(@"should set the tts chunks correctly", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.ttsChunks.count).to(equal(1));
+ expect(testAlert.ttsChunks[0].text).to(equal(testAlertView.audio.audioData.firstObject.text));
+ });
+ });
+ });
+ });
+
+ context(@"both audio prompts and audio file data set", ^{
+ beforeEach(^{
+ SDLAlertAudioData *audioData = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"test synthesizer string"];
+ [audioData addAudioFiles:@[testAudioFile]];
+
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:audioData buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set the tts chunks correctly", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.ttsChunks.count).to(equal(2));
+ expect(testAlert.ttsChunks[0].text).to(equal(testAlertView.audio.audioData[0].text));
+ expect(testAlert.ttsChunks[1].text).to(equal(testAlertView.audio.audioData[1].text));
+ });
+ });
+
+ context(@"no audio data set", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:nil buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set the `ttsChunks` to nil (and not an empty array)", ^{
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.ttsChunks).to(beNil());
+ });
+ });
+ });
+
+ describe(@"setting the icon", ^{
+ beforeEach(^{
+ testAlertView = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:nil buttons:@[testAlertSoftButton1, testAlertSoftButton2] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ });
+
+ it(@"should set the image if icons are supported on the module", ^{
+ OCMStub([mockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertIcon.value).to(equal(testAlertView.icon.name));
+ });
+
+ it(@"should not set the image if icons are not supported on the module", ^{
+ OCMStub([mockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(NO);
+ SDLAlert *testAlert = testPresentAlertOperation.alertRPC;
+ expect(testAlert.alertIcon).to(beNil());
+ });
+ });
+ });
+
+ describe(@"uploading", ^{
+ __block id strictMockFileManager = nil;
+ __block id strictMockSystemCapabilityManager = nil;
+ __block id strictMockCurrentWindowCapability = nil;
+
+ beforeEach(^{
+ strictMockFileManager = OCMStrictClassMock([SDLFileManager class]);
+ strictMockSystemCapabilityManager = OCMStrictClassMock([SDLSystemCapabilityManager class]);
+ strictMockCurrentWindowCapability = OCMStrictClassMock([SDLWindowCapability class]);
+ });
+
+ describe(@"audio files", ^{
+ beforeEach(^{
+ testAlertView.audio = testAlertAudioFileData;
+ testAlertView.softButtons = @[];
+ testAlertView.icon = nil;
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:strictMockFileManager systemCapabilityManager:strictMockSystemCapabilityManager currentWindowCapability:strictMockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ OCMStub([strictMockFileManager fileNeedsUpload:nil]).andReturn(NO);
+ OCMStub([strictMockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(2);
+ OCMStub([strictMockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ });
+
+ context(@"the negotiated RPC spec version does not support the audio file feature", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileNotSupportedSpecVersion;
+ OCMStub([strictMockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesFile, SDLSpeechCapabilitiesText]));
+ });
+
+ it(@"should not attempt to upload audio files", ^{
+ OCMReject([strictMockFileManager fileNeedsUpload:testAudioFile]);
+ OCMReject([strictMockFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+ });
+
+ context(@"the negotiated RPC spec version supports the audio file feature", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileSupportedSpecVersion;
+ });
+
+ context(@"the module does not support the speech capability of type `file`", ^{
+ beforeEach(^{
+ OCMStub([strictMockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesText]));
+ });
+
+ it(@"should not attempt to upload audio files", ^{
+ OCMReject([strictMockFileManager fileNeedsUpload:testAudioFile]);
+ OCMReject([strictMockFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+ });
+
+ context(@"the module supports the speech capability of type `file`", ^{
+ beforeEach(^{
+ OCMStub([strictMockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesText, SDLSpeechCapabilitiesFile]));
+ });
+
+ it(@"should not upload the audio file if it has already been uploaded", ^{
+ OCMExpect([strictMockFileManager fileNeedsUpload:testAudioFile]).andReturn(NO);
+ OCMReject([strictMockFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+
+ it(@"should upload the audio file if it has not yet been uploaded", ^{
+ OCMExpect([strictMockFileManager fileNeedsUpload:testAudioFile]).andReturn(YES);
+ OCMExpect([strictMockFileManager uploadFiles:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLPutFile *> *files = (NSArray<SDLPutFile *> *)value;
+ expect(files.count).to(equal(1));
+ expect(files.firstObject.name).to(equal(testAlertAudioFileData.audioData.firstObject.text));
+ return [value isKindOfClass:[NSArray class]];
+ }] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+
+ it(@"should re-upload an audio file if `overwrite` has been set to true", ^{
+ testAudioFile.overwrite = YES;
+ OCMStub([strictMockFileManager fileNeedsUpload:testAudioFile]).andReturn(YES);;
+ OCMExpect([strictMockFileManager uploadFiles:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLPutFile *> *files = (NSArray<SDLPutFile *> *)value;
+ expect(files.count).to(equal(1));
+ expect(files.firstObject.name).to(equal(testAlertAudioFileData.audioData.firstObject.text));
+ return [value isKindOfClass:[NSArray class]];
+ }] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+ });
+ });
+ });
+
+ describe(@"image files", ^{
+ beforeEach(^{
+ OCMStub([strictMockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(2);
+ OCMStub([strictMockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesFile, SDLSpeechCapabilitiesText]));
+ });
+
+ it(@"should upload the alert icons and soft button images if they are supported on the module", ^{
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:strictMockFileManager systemCapabilityManager:strictMockSystemCapabilityManager currentWindowCapability:strictMockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ OCMStub([strictMockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @YES;
+ OCMStub([strictMockCurrentWindowCapability softButtonCapabilities]).andReturn((@[testSoftButtonCapabilities]));
+ OCMStub([strictMockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+
+ OCMExpect([strictMockFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLArtwork *> *files = (NSArray<SDLArtwork *> *)value;
+ expect(files.count).to(equal(3));
+ expect(files[0].name).to(equal(testAlertView.icon.name));
+ expect(files[1].name).to(equal(testAlertView.softButtons[0].currentState.artwork.name));
+ expect(files[2].name).to(equal(testAlertView.softButtons[1].currentState.artwork.name));
+ return [value isKindOfClass:[NSArray class]];
+ }] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+
+ it(@"should only upload a max of 4 soft button images if soft button images supported on the module", ^{
+ SDLAlertView *testAlertViewWithExtraSoftButtons = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2, testAlertSoftButton3, testAlertSoftButton4, testAlertSoftButton5, testAlertSoftButton6] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:strictMockFileManager systemCapabilityManager:strictMockSystemCapabilityManager currentWindowCapability:strictMockCurrentWindowCapability alertView:testAlertViewWithExtraSoftButtons cancelID:testCancelID];
+
+ OCMStub([strictMockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @YES;
+ OCMStub([strictMockCurrentWindowCapability softButtonCapabilities]).andReturn((@[testSoftButtonCapabilities]));
+ OCMStub([strictMockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+
+ OCMExpect([strictMockFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLArtwork *> *files = (NSArray<SDLArtwork *> *)value;
+ expect(files).to(haveCount(5));
+ expect(files[0].name).to(equal(testAlertViewWithExtraSoftButtons.icon.name));
+ expect(files[1].name).to(equal(testAlertViewWithExtraSoftButtons.softButtons[0].currentState.artwork.name));
+ expect(files[2].name).to(equal(testAlertViewWithExtraSoftButtons.softButtons[1].currentState.artwork.name));
+ expect(files[3].name).to(equal(testAlertViewWithExtraSoftButtons.softButtons[2].currentState.artwork.name));
+ expect(files[4].name).to(equal(testAlertViewWithExtraSoftButtons.softButtons[3].currentState.artwork.name));
+ return [value isKindOfClass:[NSArray class]];
+ }] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+
+ it(@"should not upload the soft button images if soft button images are not supported on the module", ^{
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:strictMockFileManager systemCapabilityManager:strictMockSystemCapabilityManager currentWindowCapability:strictMockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ OCMStub([strictMockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @(NO);
+ OCMStub([strictMockCurrentWindowCapability softButtonCapabilities]).andReturn(@[testSoftButtonCapabilities]);
+ OCMStub([strictMockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+
+ OCMExpect([strictMockFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLArtwork *> *files = (NSArray<SDLArtwork *> *)value;
+ expect(files.count).to(equal(1));
+ expect(files[0].name).to(equal(testAlertView.icon.name));
+ return [value isKindOfClass:[NSArray class]];
+ }] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+
+ it(@"should upload the alert icon if the alert icon is not supported on the module", ^{
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:strictMockFileManager systemCapabilityManager:strictMockSystemCapabilityManager currentWindowCapability:strictMockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ OCMStub([strictMockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(NO);
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @(YES);
+ OCMStub([strictMockCurrentWindowCapability softButtonCapabilities]).andReturn((@[testSoftButtonCapabilities]));
+ OCMStub([strictMockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+
+ OCMExpect([strictMockFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id value) {
+ NSArray<SDLArtwork *> *files = (NSArray<SDLArtwork *> *)value;
+ expect(files.count).to(equal(2));
+ expect(files[0].name).to(equal(testAlertView.softButtons[0].currentState.artwork.name));
+ expect(files[1].name).to(equal(testAlertView.softButtons[1].currentState.artwork.name));
+ return [value isKindOfClass:[NSArray class]];
+ }] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+
+ it(@"should not upload any images if the alert icon and soft button graphics are not supported on the module", ^{
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:strictMockFileManager systemCapabilityManager:strictMockSystemCapabilityManager currentWindowCapability:strictMockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ OCMStub([strictMockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(NO);
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @NO;
+ OCMStub([strictMockCurrentWindowCapability softButtonCapabilities]).andReturn(@[testSoftButtonCapabilities]);
+ OCMStub([strictMockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+
+ OCMReject([strictMockFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAll(strictMockFileManager);
+ OCMVerifyAll(strictMockSystemCapabilityManager);
+ OCMVerifyAll(strictMockCurrentWindowCapability);
+ });
+ });
+ });
+
+ describe(@"presenting the alert", ^{
+ describe(@"checking if alert data is valid", ^{
+ context(@"the module does not support audio data uploads", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileSupportedSpecVersion;
+ });
+
+ it(@"should be valid if at least the first text field was set", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.text = @"test text";
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ NSError *testAlertValidError = [testPresentAlertOperation sdl_isValidAlertViewData:testAlertView];
+ expect(testAlertValidError).to(beNil());
+ });
+
+ it(@"should be valid if at least the second text field was set", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.secondaryText = @"test text";
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ NSError *testAlertValidError = [testPresentAlertOperation sdl_isValidAlertViewData:testAlertView];
+ expect(testAlertValidError).to(beNil());
+ });
+
+ it(@"should be valid if at least the audio data was set", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.audio = [[SDLAlertAudioData alloc] initWithSpeechSynthesizerString:@"test audio"];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ NSError *testAlertValidError = [testPresentAlertOperation sdl_isValidAlertViewData:testAlertView];
+ expect(testAlertValidError).to(beNil());
+ });
+
+ it(@"should be invalid if the first two text fields or the audio data was not set", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.tertiaryText = @"test text";
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ NSError *testAlertValidError = [testPresentAlertOperation sdl_isValidAlertViewData:testAlertView];
+ expect(testAlertValidError).to(equal([NSError sdl_alertManager_alertDataInvalid]));
+ });
+ });
+
+ context(@"the module does not support audio data uploads", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileNotSupportedSpecVersion;
+ });
+
+ it(@"should be invalid if only audio data was set but audio data is not supported on the module", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.audio = [[SDLAlertAudioData alloc] initWithAudioFile:testAudioFile];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ NSError *testAlertValidError = [testPresentAlertOperation sdl_isValidAlertViewData:testAlertView];
+ expect(testAlertValidError).to(equal([NSError sdl_alertManager_alertAudioFileNotSupported]));
+ });
+ });
+ });
+
+ context(@"with invalid data", ^{
+ context(@"the module supports audio data uploads", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileSupportedSpecVersion;
+ });
+
+ it(@"should return an error if invalid data was set", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.tertiaryText = @"test text";
+
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+
+ [testPresentAlertOperation start];
+
+ expect(testPresentAlertOperation.internalError).toEventually(equal([NSError sdl_alertManager_alertDataInvalid]));
+ expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
+ expect(testPresentAlertOperation.isFinished).toEventually(beTrue());
+ });
+ });
+
+ context(@"the module does not support audio data uploads", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = alertAudioFileNotSupportedSpecVersion;
+ });
+
+ it(@"should return an error if valid audio data was set but the module does not support audio files", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.audio = [[SDLAlertAudioData alloc] initWithAudioFile:testAudioFile];
+
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+
+ [testPresentAlertOperation start];
+
+ expect(testPresentAlertOperation.internalError).to(equal([NSError sdl_alertManager_alertAudioFileNotSupported]));
+ expect(hasCalledOperationCompletionHandler).to(beTrue());
+ expect(testPresentAlertOperation.isFinished).toEventually(beTrue());
+ });
+
+ it(@"should return an error if invalid data was set", ^{
+ testAlertView = [[SDLAlertView alloc] init];
+ testAlertView.tertiaryText = @"test text";
+
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+
+ [testPresentAlertOperation start];
+
+ expect(testPresentAlertOperation.internalError).to(equal([NSError sdl_alertManager_alertDataInvalid]));
+ expect(hasCalledOperationCompletionHandler).to(beTrue());
+ expect(testPresentAlertOperation.isFinished).toEventually(beTrue());
+ });
+ });
+ });
+
+ context(@"with too many soft buttons", ^{
+ __block SDLAlertView *testAlertViewWithExtraSoftButtons = nil;
+
+ beforeEach(^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ OCMStub([mockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ OCMStub([mockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesText, SDLSpeechCapabilitiesFile]));;
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @YES;
+ OCMStub([mockCurrentWindowCapability softButtonCapabilities]).andReturn(@[testSoftButtonCapabilities]);
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(NO);
+ OCMStub([mockFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ OCMStub([mockFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ SDLVersion *supportedVersion = [SDLVersion versionWithMajor:6 minor:3 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(supportedVersion);
+
+ testAlertViewWithExtraSoftButtons = [[SDLAlertView alloc] initWithText:@"text" secondaryText:@"secondaryText" tertiaryText:@"tertiaryText" timeout:@(4) showWaitIndicator:@(YES) audioIndication:testAlertAudioData buttons:@[testAlertSoftButton1, testAlertSoftButton2, testAlertSoftButton3, testAlertSoftButton4, testAlertSoftButton5, testAlertSoftButton6] icon:testAlertIcon];
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertViewWithExtraSoftButtons cancelID:testCancelID];
+
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+ });
+
+ it(@"should send the alert but only allow 4 soft buttons to be sent", ^{
+ OCMExpect([mockConnectionManager sendConnectionRequest:[OCMArg checkWithBlock:^BOOL(id value) {
+ SDLAlert *alertRequest = (SDLAlert *)value;
+ expect(alertRequest.alertText1).to(equal(testAlertView.text));
+ expect(alertRequest.alertText2).to(equal(testAlertView.secondaryText));
+ expect(alertRequest.alertText3).to(equal(testAlertView.tertiaryText));
+ expect(alertRequest.ttsChunks.count).to(equal(1));
+ expect(alertRequest.ttsChunks[0].text).to(equal(testAlertView.audio.audioData.firstObject.text));
+ expect(alertRequest.duration).to(equal(testAlertView.timeout * 1000));
+ expect(alertRequest.playTone).to(equal(testAlertView.audio.playTone));
+ expect(alertRequest.progressIndicator).to(equal(testAlertView.showWaitIndicator));
+ expect(alertRequest.softButtons.count).to(equal(4));
+ expect(alertRequest.softButtons[0].text).to(equal(testAlertViewWithExtraSoftButtons.softButtons[0].currentState.text));
+ expect(alertRequest.softButtons[1].text).to(equal(testAlertViewWithExtraSoftButtons.softButtons[1].currentState.text));
+ expect(alertRequest.softButtons[2].text).to(equal(testAlertViewWithExtraSoftButtons.softButtons[2].currentState.text));
+ expect(alertRequest.softButtons[3].text).to(equal(testAlertViewWithExtraSoftButtons.softButtons[3].currentState.text));
+ expect(alertRequest.softButtons[0].softButtonID).to(equal(10));
+ expect(alertRequest.softButtons[1].softButtonID).to(equal(11));
+ expect(alertRequest.softButtons[2].softButtonID).to(equal(12));
+ expect(alertRequest.softButtons[3].softButtonID).to(equal(13));
+
+ expect(alertRequest.cancelID).to(equal(testCancelID));
+ expect(alertRequest.alertIcon.value).to(equal(testAlertView.icon.name));
+ return [value isKindOfClass:[SDLAlert class]];
+ }] withResponseHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(mockConnectionManager, 1.0);
+ });
+ });
+
+ context(@"with a failed alert icon upload", ^{
+ beforeEach(^{
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ OCMStub([mockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ OCMStub([mockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesText, SDLSpeechCapabilitiesFile]));;
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @YES;
+ OCMStub([mockCurrentWindowCapability softButtonCapabilities]).andReturn(@[testSoftButtonCapabilities]);
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+ OCMStub([mockFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:([OCMArg invokeBlockWithArgs: @[testAlertView.icon.name], [NSNull null], nil])]);
+ OCMStub([mockFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ SDLVersion *supportedVersion = [SDLVersion versionWithMajor:6 minor:3 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(supportedVersion);
+
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+ });
+
+ it(@"should send the alert but not set the SDLImage for icon", ^{
+ OCMExpect([mockConnectionManager sendConnectionRequest:[OCMArg checkWithBlock:^BOOL(id value) {
+ SDLAlert *alertRequest = (SDLAlert *)value;
+ expect(alertRequest.alertText1).to(equal(testAlertView.text));
+ expect(alertRequest.alertText2).to(equal(testAlertView.secondaryText));
+ expect(alertRequest.alertText3).to(equal(testAlertView.tertiaryText));
+ expect(alertRequest.ttsChunks.count).to(equal(1));
+ expect(alertRequest.ttsChunks[0].text).to(equal(testAlertView.audio.audioData.firstObject.text));
+ expect(alertRequest.duration).to(equal(testAlertView.timeout * 1000));
+ expect(alertRequest.playTone).to(equal(testAlertView.audio.playTone));
+ expect(alertRequest.progressIndicator).to(equal(testAlertView.showWaitIndicator));
+ expect(alertRequest.softButtons.count).to(equal(2));
+ expect(alertRequest.softButtons[0].text).to(equal(testAlertView.softButtons[0].currentState.text));
+ expect(alertRequest.softButtons[1].text).to(equal(testAlertView.softButtons[1].currentState.text));
+ expect(alertRequest.softButtons[0].softButtonID).to(equal(10));
+ expect(alertRequest.softButtons[1].softButtonID).to(equal(11));
+ expect(alertRequest.cancelID).to(equal(testCancelID));
+ expect(alertRequest.alertIcon).to(beNil());
+ return [value isKindOfClass:[SDLAlert class]];
+ }] withResponseHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(mockConnectionManager, 0.5);
+ });
+ });
+
+ context(@"with valid data", ^{
+ __block id strictMockConnectionManager = nil;
+
+ beforeEach(^{
+ strictMockConnectionManager = OCMStrictProtocolMock(@protocol(SDLConnectionManagerType));
+
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+ OCMStub([mockCurrentWindowCapability hasImageFieldOfName:SDLImageFieldNameAlertIcon]).andReturn(YES);
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ OCMStub([mockSystemCapabilityManager speechCapabilities]).andReturn((@[SDLSpeechCapabilitiesText, SDLSpeechCapabilitiesFile]));;
+ SDLSoftButtonCapabilities *testSoftButtonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonCapabilities.imageSupported = @YES;
+ OCMStub([mockCurrentWindowCapability softButtonCapabilities]).andReturn(@[testSoftButtonCapabilities]);
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(NO);
+ OCMStub([mockFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ OCMStub([mockFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ SDLVersion *supportedVersion = [SDLVersion versionWithMajor:6 minor:3 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(supportedVersion);
+
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:strictMockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testAlertView cancelID:testCancelID];
+
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+ });
+
+ it(@"should send the alert if the operation has not been cancelled", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg checkWithBlock:^BOOL(id value) {
+ SDLAlert *alertRequest = (SDLAlert *)value;
+ expect(alertRequest.alertText1).to(equal(testAlertView.text));
+ expect(alertRequest.alertText2).to(equal(testAlertView.secondaryText));
+ expect(alertRequest.alertText3).to(equal(testAlertView.tertiaryText));
+ expect(alertRequest.ttsChunks.count).to(equal(1));
+ expect(alertRequest.ttsChunks[0].text).to(equal(testAlertView.audio.audioData.firstObject.text));
+ expect(alertRequest.duration).to(equal(testAlertView.timeout * 1000));
+ expect(alertRequest.playTone).to(equal(testAlertView.audio.playTone));
+ expect(alertRequest.progressIndicator).to(equal(testAlertView.showWaitIndicator));
+ expect(alertRequest.softButtons.count).to(equal(2));
+ expect(alertRequest.softButtons[0].text).to(equal(testAlertView.softButtons[0].currentState.text));
+ expect(alertRequest.softButtons[1].text).to(equal(testAlertView.softButtons[1].currentState.text));
+ expect(alertRequest.softButtons[0].softButtonID).to(equal(10));
+ expect(alertRequest.softButtons[1].softButtonID).to(equal(11));
+ expect(alertRequest.cancelID).to(equal(testCancelID));
+ expect(alertRequest.alertIcon.value).to(equal(testAlertView.icon.name));
+ return [value isKindOfClass:[SDLAlert class]];
+ }] withResponseHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+
+ it(@"should not send the alert if the operation has been cancelled", ^{
+ [testPresentAlertOperation cancel];
+ OCMReject([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:[OCMArg any]]);
+
+ [testPresentAlertOperation start];
+
+ expect(testPresentAlertOperation.internalError).to(beNil());
+ expect(hasCalledOperationCompletionHandler).to(beTrue());
+ expect(testPresentAlertOperation.isFinished).toEventually(beTrue());
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+
+ describe(@"Getting a response from the module", ^{
+ __block SDLAlertResponse *response = nil;
+
+ it(@"should call the completion handler and finish the operation after a successful alert response", ^{
+ response = [[SDLAlertResponse alloc] init];
+ response.tryAgainTime = nil;
+ response.success = @YES;
+ response.resultCode = SDLResultSuccess;
+
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], response, [NSNull null], nil])]);
+
+ [testPresentAlertOperation start];
+
+ expect(testPresentAlertOperation.internalError).toEventually(beNil());
+ expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
+ expect(testPresentAlertOperation.isFinished).toEventually(beTrue());
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+
+ it(@"should save the error, call the completion handler and finish the operation after an unsuccessful alert response", ^{
+ response = [[SDLAlertResponse alloc] init];
+ response.tryAgainTime = @5;
+ response.success = @NO;
+ response.resultCode = SDLResultAborted;
+ NSError *defaultError = [NSError errorWithDomain:@"com.sdl.testConnectionManager" code:-1 userInfo:nil];
+
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], response, defaultError, nil])]);
+
+ [testPresentAlertOperation start];
+
+ expect(testPresentAlertOperation.internalError.userInfo[@"tryAgainTime"]).toEventually(equal(response.tryAgainTime));
+ expect(testPresentAlertOperation.internalError.userInfo[@"error"]).toEventually(equal(defaultError));
+ expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
+ expect(testPresentAlertOperation.isFinished).toEventually(beTrue());
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+ });
+ });
+ });
+
+ describe(@"canceling the alert", ^{
+ __block SDLAlertView *testCancelAlertView = nil;
+ __block SDLVersion *cancelInteractionSupportedSpecVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
+ __block SDLVersion *cancelInteractionNotSupportedSpecVersion = [SDLVersion versionWithMajor:5 minor:10 patch:0];
+ __block id strictMockConnectionManager = nil;
+
+ beforeEach(^{
+ testCancelAlertView = [[SDLAlertView alloc] init];
+ testCancelAlertView.text = @"Alert view to be canceled";
+
+ OCMStub([mockCurrentWindowCapability maxNumberOfAlertFieldLines]).andReturn(3);
+
+ strictMockConnectionManager = OCMStrictProtocolMock(@protocol(SDLConnectionManagerType));
+ testPresentAlertOperation = [[SDLPresentAlertOperation alloc] initWithConnectionManager:strictMockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager currentWindowCapability:mockCurrentWindowCapability alertView:testCancelAlertView cancelID:testCancelID];
+ testPresentAlertOperation.completionBlock = ^{
+ hasCalledOperationCompletionHandler = YES;
+ };
+ });
+
+ context(@"Module supports the CancelInteration RPC", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = cancelInteractionSupportedSpecVersion;
+ });
+
+ describe(@"If the operation is executing", ^{
+ it(@"should attempt to send a cancel interaction", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg checkWithBlock:^BOOL(id value) {
+ return [value isKindOfClass:[SDLAlert class]];
+ }] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ expect(testPresentAlertOperation.isExecuting).to(beTrue());
+ expect(testPresentAlertOperation.isFinished).to(beFalse());
+ expect(testPresentAlertOperation.isCancelled).to(beFalse());
+
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg checkWithBlock:^BOOL(id value) {
+ SDLCancelInteraction *cancelRequest = (SDLCancelInteraction *)value;
+ expect(cancelRequest).to(beAnInstanceOf([SDLCancelInteraction class]));
+ expect(cancelRequest.cancelID).to(equal(testCancelID));
+ expect(cancelRequest.functionID).to(equal([SDLFunctionID.sharedInstance functionIdForName:SDLRPCFunctionNameAlert]));
+ return [value isKindOfClass:[SDLCancelInteraction class]];
+ }] withResponseHandler:[OCMArg any]]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+
+ context(@"If the cancel interaction was successful", ^{
+ it(@"should not save an error", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+
+ SDLCancelInteractionResponse *testResponse = [[SDLCancelInteractionResponse alloc] init];
+ testResponse.success = @YES;
+ testResponse.resultCode = SDLResultSuccess;
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], testResponse, [NSNull null], nil])]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 1.0);
+ expect(testPresentAlertOperation.error).to(beNil());
+ });
+ });
+
+ context(@"If the cancel interaction was not successful", ^{
+ it(@"should save an error", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 1.0);
+
+ SDLCancelInteractionResponse *testResponse = [[SDLCancelInteractionResponse alloc] init];
+ testResponse.success = @NO;
+ testResponse.resultCode = SDLResultAborted;
+ NSError *defaultError = [NSError errorWithDomain:@"com.sdl.testConnectionManager" code:-1 userInfo:nil];
+
+ OCMStub([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:([OCMArg invokeBlockWithArgs:[OCMArg any], testResponse, defaultError, nil])]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 1.0);
+ expect(testPresentAlertOperation.error).to(equal(defaultError));
+ });
+ });
+ });
+
+ describe(@"If the operation has already finished", ^{
+ beforeEach(^{
+ [testPresentAlertOperation finishOperation];
+ });
+
+ it(@"should not attempt to send a cancel interaction", ^{
+ OCMReject([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+ });
+
+ describe(@"If the started operation has been canceled", ^{
+ it(@"should not attempt to send a cancel interaction", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+
+ [testPresentAlertOperation cancel];
+
+ OCMReject([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+ });
+
+ context(@"If the operation has not started", ^{
+ it(@"should not attempt to send a cancel interaction", ^{
+ OCMReject([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+
+ context(@"Once the operation has started after being canceled", ^{
+ it(@"should not attempt to send a cancel interaction", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+
+ [testPresentAlertOperation cancel];
+
+ OCMReject([mockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+ [testCancelAlertView cancel];
+
+ OCMReject([mockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+ });
+ });
+ });
+
+ context(@"Module does not support the CancelInteration RPC", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = cancelInteractionNotSupportedSpecVersion;
+ });
+
+ it(@"should not attempt to send a cancel interaction if the operation is executing", ^{
+ OCMExpect([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLAlert.class] withResponseHandler:[OCMArg any]]);
+ [testPresentAlertOperation start];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+
+ OCMReject([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+
+ [testCancelAlertView cancel];
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+
+ it(@"should cancel the operation if it has not yet been run", ^{
+ OCMReject([strictMockConnectionManager sendConnectionRequest:[OCMArg isKindOfClass:SDLCancelInteraction.class] withResponseHandler:[OCMArg any]]);
+
+ [testCancelAlertView cancel];
+
+ expect(testPresentAlertOperation.isCancelled).to(beTrue());
+
+ OCMVerifyAllWithDelay(strictMockConnectionManager, 0.5);
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLScreenManagerSpec.m b/SmartDeviceLinkTests/SDLScreenManagerSpec.m
index 9f137a5b2..5982109ce 100644
--- a/SmartDeviceLinkTests/SDLScreenManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLScreenManagerSpec.m
@@ -2,11 +2,13 @@
#import <Nimble/Nimble.h>
#import <OCMock/OCMock.h>
+#import "SDLAlertManager.h"
#import "SDLFileManager.h"
#import "SDLHMILevel.h"
#import "SDLGlobals.h"
#import "SDLMenuCell.h"
#import "SDLMenuManager.h"
+#import "SDLPermissionManager.h"
#import "SDLScreenManager.h"
#import "SDLShow.h"
#import "SDLSoftButtonManager.h"
@@ -18,6 +20,16 @@
#import "SDLVersion.h"
#import "TestConnectionManager.h"
+@interface SDLAlertManager()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
+@property (weak, nonatomic, nullable) SDLPermissionManager *permissionManager;
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+
+@end
+
@interface SDLSoftButtonManager()
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@@ -41,6 +53,7 @@
@property (strong, nonatomic) SDLTextAndGraphicManager *textAndGraphicManager;
@property (strong, nonatomic) SDLSoftButtonManager *softButtonManager;
@property (strong, nonatomic) SDLMenuManager *menuManager;
+@property (strong, nonatomic) SDLAlertManager *alertManager;
@end
@@ -50,6 +63,7 @@ describe(@"screen manager", ^{
__block TestConnectionManager *mockConnectionManager = nil;
__block SDLFileManager *mockFileManager = nil;
__block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
+ __block SDLPermissionManager *mockPermissionManager = nil;
__block SDLScreenManager *testScreenManager = nil;
__block NSString *testString1 = @"test1";
@@ -77,8 +91,9 @@ describe(@"screen manager", ^{
mockConnectionManager = [[TestConnectionManager alloc] init];
mockFileManager = OCMClassMock([SDLFileManager class]);
mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
+ mockPermissionManager = OCMClassMock([SDLPermissionManager class]);
- testScreenManager = [[SDLScreenManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager];
+ testScreenManager = [[SDLScreenManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager permissionManager:mockPermissionManager];
});
// should set up the sub-managers correctly
@@ -87,6 +102,10 @@ describe(@"screen manager", ^{
expect(testScreenManager.textAndGraphicManager.fileManager).to(equal(mockFileManager));
expect(testScreenManager.softButtonManager.connectionManager).to(equal(mockConnectionManager));
expect(testScreenManager.softButtonManager.fileManager).to(equal(mockFileManager));
+ expect(testScreenManager.alertManager.connectionManager).to(equal(mockConnectionManager));
+ expect(testScreenManager.alertManager.fileManager).to(equal(mockFileManager));
+ expect(testScreenManager.alertManager.systemCapabilityManager).to(equal(mockSystemCapabilityManager));
+ expect(testScreenManager.alertManager.permissionManager).to(equal(mockPermissionManager));
});
// batching updates
@@ -170,6 +189,17 @@ describe(@"screen manager", ^{
expect(testScreenManager.textAndGraphicManager.transactionQueue.operationCount).to(equal(1));
});
});
+
+ // presenting an alert
+ describe(@"presenting an alert", ^{
+ it(@"should pass the call to the alert manager", ^{
+ SDLAlertView *testAlertView = [[SDLAlertView alloc] initWithText:@"Test" buttons:@[[[SDLSoftButtonObject alloc] initWithName:@"Test Button" text:@"Test Button" artwork:nil handler:nil]]];
+
+ [testScreenManager presentAlert:testAlertView withCompletionHandler:nil];
+
+ expect(testScreenManager.alertManager.transactionQueue.operationCount).to(equal(1));
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
index 623ec427c..3b4669d78 100644
--- a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
+++ b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
@@ -44,6 +44,7 @@ describe(@"a soft button replace operation", ^{
__block NSString *object2State2ArtworkName = @"O2S2 Artwork";
__block SDLArtwork *object2State1Art = nil;
__block SDLArtwork *object2State2Art = nil;
+ __block SDLArtwork *object2State11Art = nil;
__block SDLSoftButtonState *object2State1 = nil;
__block SDLSoftButtonState *object2State2 = nil;
__block SDLSoftButtonObject *buttonWithTextAndImage = nil;
@@ -97,6 +98,8 @@ describe(@"a soft button replace operation", ^{
object2State1Art = [[SDLArtwork alloc] initWithData:[@"TestData" dataUsingEncoding:NSUTF8StringEncoding] name:object2State1ArtworkName fileExtension:@"png" persistent:YES];
object2State2Art = [[SDLArtwork alloc] initWithData:[@"TestData2" dataUsingEncoding:NSUTF8StringEncoding] name:object2State2ArtworkName fileExtension:@"png" persistent:YES];
+ object2State11Art = [[SDLArtwork alloc] initWithData:[@"TestData11" dataUsingEncoding:NSUTF8StringEncoding] name:object2State1ArtworkName fileExtension:@"png" persistent:YES];
+ object2State11Art.overwrite = YES;
object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State1Art];
object2State2 = [[SDLSoftButtonState alloc] initWithStateName:object2State2Name text:object2State2Text artwork:object2State2Art];
buttonWithTextAndImage = [[SDLSoftButtonObject alloc] initWithName:object2Name states:@[object2State1, object2State2] initialStateName:object2State1.name handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
@@ -162,6 +165,7 @@ describe(@"a soft button replace operation", ^{
context(@"When a response is received to the upload", ^{
beforeEach(^{
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg any]]);
[testOp start];
});
@@ -278,7 +282,7 @@ describe(@"a soft button replace operation", ^{
it(@"should not upload artworks", ^{
OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:nil completionHandler:nil]);
-
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg any]]).andReturn(NO);
[testOp start];
OCMVerifyAllWithDelay(testFileManager, 0.5);
@@ -296,8 +300,22 @@ describe(@"a soft button replace operation", ^{
expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeBoth));
});
+ it(@"should properly overwrite artwork", ^{
+ OCMExpect([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg any]]);
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
+ object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State11Art];
+ buttonWithTextAndImage = [[SDLSoftButtonObject alloc] initWithName:object2Name states:@[object2State1, object2State2] initialStateName:object2State1.name handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ testSoftButtonObjects = @[buttonWithText, buttonWithTextAndImage];
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg any]]);
+ [testOp start];
+ OCMVerify([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+ });
+
context(@"When a response is received to the upload", ^{
beforeEach(^{
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg any]]).andReturn(NO);
[testOp start];
});
@@ -324,6 +342,7 @@ describe(@"a soft button replace operation", ^{
context(@"when artworks are static icons", ^{
beforeEach(^{
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(NO);
testSoftButtonObjects = @[buttonWithTextAndStaticImage];
testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
@@ -371,8 +390,11 @@ describe(@"a soft button replace operation", ^{
it(@"should upload all artworks", ^{
// Check that the artworks in the initial button states are uploaded
OCMExpect([testFileManager uploadArtworks:@[buttonWithTextAndImage.states[0].artwork] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg any]]);
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
testSoftButtonObjects = @[buttonWithText, buttonWithTextAndImage];
testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg any]]);
[testOp start];
OCMVerifyAllWithDelay(testFileManager, 0.5);
@@ -407,14 +429,19 @@ describe(@"a soft button replace operation", ^{
it(@"should upload all artworks even if the initial state does not have artworks", ^{
OCMReject([testFileManager uploadFiles:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(NO);
+ OCMExpect([testFileManager fileNeedsUpload:[OCMArg isNil]]).andReturn(NO);
// buttonWithTextAndImage2 has text in the first state and an text and image in the second & third states
testSoftButtonObjects = @[buttonWithTextAndStaticImage, buttonWithTextAndImage2];
testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
+
[testOp start];
OCMVerifyAllWithDelay(testFileManager, 0.5);
NSArray<SDLArtwork *> *testArtworkUploads = @[buttonWithTextAndImage2.states[1].artwork, buttonWithTextAndImage2.states[2].artwork];
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
OCMExpect([testFileManager uploadArtworks:testArtworkUploads progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
[testConnectionManager respondToLastRequestWithResponse:successResponse];
OCMVerifyAllWithDelay(testFileManager, 0.5);
@@ -445,6 +472,7 @@ describe(@"a soft button replace operation", ^{
context(@"When a response is received to the upload", ^{
beforeEach(^{
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
OCMExpect([testFileManager uploadArtworks:[OCMArg isNotNil] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
testSoftButtonObjects = @[buttonWithTextAndImage];
diff --git a/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m b/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m
index cfab13eec..a1620fd3c 100644
--- a/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m
@@ -36,7 +36,6 @@ QuickSpecBegin(SDLStreamingMediaManagerSpec)
describe(@"the streaming media manager", ^{
__block SDLStreamingMediaManager *testStreamingMediaManager = nil;
- __block TestConnectionManager *testConnectionManager = nil;
__block SDLConfiguration *testConfiguration = nil;
__block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
@@ -45,10 +44,17 @@ describe(@"the streaming media manager", ^{
__block id mockVideoLifecycleManager = nil;
__block id mockAudioLifecycleManager = nil;
+ // quick fix to keep test objects alive, it fixes the crash when an object is recreated in beforeEach block (usually on the 2nd pass) and the dealloc method gets called internally
+ NSMutableSet *allTestObjects = [NSMutableSet new];
+ TestConnectionManager *testConnectionManager = [[TestConnectionManager alloc] init];
+ [allTestObjects addObject:testConnectionManager];
+
beforeEach(^{
mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
- testConnectionManager = [[TestConnectionManager alloc] init];
+ [allTestObjects addObject:mockSystemCapabilityManager];
+
testStreamingMediaManager = [[SDLStreamingMediaManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfiguration systemCapabilityManager:mockSystemCapabilityManager];
+ [allTestObjects addObject:testStreamingMediaManager];
mockVideoLifecycleManager = OCMClassMock([SDLStreamingVideoLifecycleManager class]);
testStreamingMediaManager.videoLifecycleManager = mockVideoLifecycleManager;
diff --git a/SmartDeviceLinkTests/SDLStreamingVideoScaleManagerSpec.m b/SmartDeviceLinkTests/SDLStreamingVideoScaleManagerSpec.m
index ae12d46cb..dd3887011 100644
--- a/SmartDeviceLinkTests/SDLStreamingVideoScaleManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLStreamingVideoScaleManagerSpec.m
@@ -9,19 +9,20 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
-#import "SDLStreamingVideoScaleManager.h"
+#import "SDLHapticRect.h"
+#import "SDLImageResolution.h"
#import "SDLOnTouchEvent.h"
+#import "SDLRectangle.h"
+#import "SDLStreamingVideoScaleManager.h"
#import "SDLTouchEvent.h"
#import "SDLTouchCoord.h"
-#import "SDLRectangle.h"
-#import "SDLHapticRect.h"
QuickSpecBegin(SDLStreamingVideoScaleManagerSpec)
describe(@"the streaming video scale manager", ^{
__block SDLStreamingVideoScaleManager *videoScaleManager = nil;
- __block float testScale = 2.3;
- __block CGSize testScreenSize = CGSizeMake(200, 400);
+ const float testScale = 2.3;
+ const CGSize testScreenSize = CGSizeMake(200, 400);
it(@"should initialize correctly with init", ^{
videoScaleManager = [[SDLStreamingVideoScaleManager alloc] init];
@@ -40,22 +41,16 @@ describe(@"the streaming video scale manager", ^{
context(@"test scaling a frame", ^{
it(@"should scale the frame correctly with a scale > 1", ^{
videoScaleManager.scale = 1.25;
- CGRect expectedRect = CGRectMake(0, 0, 160, 320);
- CGRect testRect = videoScaleManager.appViewportFrame;
+ const CGRect expectedRect = CGRectMake(0, 0, 160, 320);
+ const CGRect testRect = videoScaleManager.appViewportFrame;
expect(@(CGRectEqualToRect(expectedRect, testRect))).to(beTrue());
});
- it(@"should not scale the frame with a scale < 1", ^{
- videoScaleManager.scale = 0.3;
- CGRect expectedRect = CGRectMake(0, 0, testScreenSize.width, testScreenSize.height);
- CGRect testRect = videoScaleManager.appViewportFrame;
- expect(@(CGRectEqualToRect(expectedRect, testRect))).to(beTrue());
- });
-
- it(@"should not scale the frame with a scale = 1", ^{
- videoScaleManager.scale = 0.3;
- CGRect expectedRect = CGRectMake(0, 0, testScreenSize.width, testScreenSize.height);
- CGRect testRect = videoScaleManager.appViewportFrame;
+ it(@"should scale the frame correctly with the scale 1.0", ^{
+ const float scale = 1.0f;
+ videoScaleManager.scale = scale;
+ const CGRect expectedRect = CGRectMake(0, 0, testScreenSize.width, testScreenSize.height);
+ const CGRect testRect = videoScaleManager.appViewportFrame;
expect(@(CGRectEqualToRect(expectedRect, testRect))).to(beTrue());
});
});
@@ -77,7 +72,7 @@ describe(@"the streaming video scale manager", ^{
it(@"should scale the coordinates correctly with a scale > 1", ^{
videoScaleManager.scale = 1.25;
- CGPoint expectedCoordinates = CGPointMake(80, 160);
+ const CGPoint expectedCoordinates = CGPointMake(80, 160);
SDLOnTouchEvent *testOnTouchEvent = [videoScaleManager scaleTouchEventCoordinates:onTouchEvent];
CGPoint testCoordinates = CGPointMake(testOnTouchEvent.event.firstObject.coord.firstObject.x.floatValue, testOnTouchEvent.event.firstObject.coord.firstObject.y.floatValue);
expect(@(CGPointEqualToPoint(testCoordinates, expectedCoordinates))).to(beTrue());
@@ -85,26 +80,26 @@ describe(@"the streaming video scale manager", ^{
it(@"should scale the coordinates correctly with a scale < 1", ^{
videoScaleManager.scale = 0.1;
- CGPoint expectedCoordinates = CGPointMake(100, 200);
+ const CGPoint expectedCoordinates = CGPointMake(100, 200);
SDLOnTouchEvent *testOnTouchEvent = [videoScaleManager scaleTouchEventCoordinates:onTouchEvent];
- CGPoint testCoordinates = CGPointMake(testOnTouchEvent.event.firstObject.coord.firstObject.x.floatValue, testOnTouchEvent.event.firstObject.coord.firstObject.y.floatValue);
+ const CGPoint testCoordinates = CGPointMake(testOnTouchEvent.event.firstObject.coord.firstObject.x.floatValue, testOnTouchEvent.event.firstObject.coord.firstObject.y.floatValue);
expect(@(CGPointEqualToPoint(testCoordinates, expectedCoordinates))).to(beTrue());
});
it(@"should scale the coordinates correctly with a scale = 1", ^{
videoScaleManager.scale = 1.0;
- CGPoint expectedCoordinates = CGPointMake(100, 200);
+ const CGPoint expectedCoordinates = CGPointMake(100, 200);
SDLOnTouchEvent *testOnTouchEvent = [videoScaleManager scaleTouchEventCoordinates:onTouchEvent];
- CGPoint testCoordinates = CGPointMake(testOnTouchEvent.event.firstObject.coord.firstObject.x.floatValue, testOnTouchEvent.event.firstObject.coord.firstObject.y.floatValue);
+ const CGPoint testCoordinates = CGPointMake(testOnTouchEvent.event.firstObject.coord.firstObject.x.floatValue, testOnTouchEvent.event.firstObject.coord.firstObject.y.floatValue);
expect(@(CGPointEqualToPoint(testCoordinates, expectedCoordinates))).to(beTrue());
});
});
context(@"test scaling a haptic rect", ^{
__block SDLHapticRect *hapticRect = nil;
+ const CGRect rect = CGRectMake(10, 10, 100, 200);
beforeEach(^{
- CGRect rect = CGRectMake(10, 10, 100, 200);
SDLRectangle *rectangle = [[SDLRectangle alloc] initWithCGRect:rect];
hapticRect = [[SDLHapticRect alloc] initWithId:2 rect:rectangle];
});
@@ -118,18 +113,36 @@ describe(@"the streaming video scale manager", ^{
it(@"should scale the rectangle correctly with a scale < 1", ^{
videoScaleManager.scale = 0.4;
- SDLRectangle *expectedRect = [[SDLRectangle alloc] initWithX:10 y:10 width:100 height:200];
+ SDLRectangle *expectedRect = [[SDLRectangle alloc] initWithX:rect.origin.x y:rect.origin.y width:rect.size.width height:rect.size.height];
SDLHapticRect *testRect = [videoScaleManager scaleHapticRect:hapticRect];
expect(testRect.rect).to(equal(expectedRect));
});
it(@"should scale the rectangle correctly with a scale = 1", ^{
videoScaleManager.scale = 1.0;
- SDLRectangle *expectedRect = [[SDLRectangle alloc] initWithX:10 y:10 width:100 height:200];
+ SDLRectangle *expectedRect = [[SDLRectangle alloc] initWithX:rect.origin.x y:rect.origin.y width:rect.size.width height:rect.size.height];
SDLHapticRect *testRect = [videoScaleManager scaleHapticRect:hapticRect];
expect(testRect.rect).to(equal(expectedRect));
});
});
+
+ context(@"makeScaledResolution", ^{
+ beforeEach(^{
+ videoScaleManager = [[SDLStreamingVideoScaleManager alloc] initWithScale:testScale displayViewportResolution:testScreenSize];
+ });
+
+ it(@"expect scaled resolution to be of proper size", ^{
+ videoScaleManager.scale = 2.0;
+ SDLImageResolution *scaledResolution2 = [videoScaleManager makeScaledResolution];
+ SDLImageResolution *expectedResolution2 = [[SDLImageResolution alloc] initWithWidth:100 height:200];
+ expect(scaledResolution2).to(equal(expectedResolution2));
+
+ videoScaleManager.scale = 4.0;
+ SDLImageResolution *scaledResolution4 = [videoScaleManager makeScaledResolution];
+ SDLImageResolution *expectedResolution4 = [[SDLImageResolution alloc] initWithWidth:50 height:100];
+ expect(scaledResolution4).to(equal(expectedResolution4));
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLSupportedStreamingRangeSpec.m b/SmartDeviceLinkTests/SDLSupportedStreamingRangeSpec.m
new file mode 100644
index 000000000..731171488
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLSupportedStreamingRangeSpec.m
@@ -0,0 +1,118 @@
+//
+// SDLSupportedStreamingRangeSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Leonid Lokhmatov on 25.12.2020.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLVideoStreamingRange.h"
+#import "SDLImageResolution.h"
+
+QuickSpecBegin(SDLSupportedStreamingRangeSpec)
+
+SDLImageResolution *minResolution = [[SDLImageResolution alloc] initWithWidth:10 height:50];
+SDLImageResolution *maxResolution = [[SDLImageResolution alloc] initWithWidth:100 height:500];
+const float minimumAspectRatio = 2.5;
+const float maximumAspectRatio = 7.1;
+const float minimumDiagonal = 3.3;
+
+describe(@"initialization", ^{
+ context(@"init", ^{
+ SDLVideoStreamingRange *streamingRange = [[SDLVideoStreamingRange alloc] init];
+
+ it(@"expect object to be created with empty fields", ^{
+ expect(streamingRange).toNot(beNil());
+ expect(streamingRange.minimumResolution).to(beNil());
+ expect(streamingRange.maximumResolution).to(beNil());
+ expect(streamingRange.minimumAspectRatio).to(equal(0));
+ expect(streamingRange.maximumAspectRatio).to(equal(0));
+ expect(streamingRange.minimumDiagonal).to(equal(0));
+ });
+ });
+
+ context(@"init and assign", ^{
+ SDLVideoStreamingRange *streamingRange = [[SDLVideoStreamingRange alloc] init];
+ streamingRange.minimumResolution = minResolution;
+ streamingRange.maximumResolution = maxResolution;
+ streamingRange.minimumDiagonal = minimumDiagonal;
+ streamingRange.minimumAspectRatio = minimumAspectRatio;
+ streamingRange.maximumAspectRatio = maximumAspectRatio;
+
+ it(@"expect object to be created and properties are set properly", ^{
+ expect(streamingRange).toNot(beNil());
+ expect(streamingRange.minimumResolution).to(equal(minResolution));
+ expect(streamingRange.maximumResolution).to(equal(maxResolution));
+ expect(streamingRange.minimumAspectRatio).to(equal(minimumAspectRatio));
+ expect(streamingRange.maximumAspectRatio).to(equal(maximumAspectRatio));
+ expect(streamingRange.minimumDiagonal).to(equal(minimumDiagonal));
+ });
+ });
+
+ context(@"initWithMinimumResolution:maximumResolution:", ^{
+ SDLVideoStreamingRange *streamingRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:minResolution maximumResolution:maxResolution];
+ it(@"expect min and max resolution to be set and others are not", ^{
+ expect(streamingRange).toNot(beNil());
+ expect(streamingRange.minimumResolution).to(equal(minResolution));
+ expect(streamingRange.maximumResolution).to(equal(maxResolution));
+ expect(streamingRange.minimumAspectRatio).to(equal(0));
+ expect(streamingRange.maximumAspectRatio).to(equal(0));
+ expect(streamingRange.minimumDiagonal).to(equal(0));
+ });
+ });
+});
+
+describe(@"methods", ^{
+ context(@"isAspectRatioInRange:", ^{
+ SDLVideoStreamingRange *streamingRange = [[SDLVideoStreamingRange alloc] init];
+
+ beforeEach(^{
+ streamingRange.minimumAspectRatio = minimumAspectRatio;
+ streamingRange.maximumAspectRatio = maximumAspectRatio;
+ });
+
+ it(@"expect to be within range", ^{
+ expect(streamingRange).toNot(beNil());
+ const float midAR = (minimumAspectRatio + maximumAspectRatio) / 2.0;
+ expect([streamingRange isAspectRatioInRange:minimumAspectRatio]).to(beTrue());
+ expect([streamingRange isAspectRatioInRange:maximumAspectRatio]).to(beTrue());
+ expect([streamingRange isAspectRatioInRange:midAR]).to(beTrue());
+ });
+
+ it(@"expect to be out of range", ^{
+ expect(streamingRange).toNot(beNil());
+ expect([streamingRange isAspectRatioInRange:minimumAspectRatio - 1]).to(beFalse());
+ expect([streamingRange isAspectRatioInRange:maximumAspectRatio + 1]).to(beFalse());
+ });
+ });
+
+ context(@"isImageResolutionInRange:", ^{
+ SDLVideoStreamingRange *streamingRange = [[SDLVideoStreamingRange alloc] initWithMinimumResolution:minResolution maximumResolution:maxResolution];
+ const int width = (minResolution.resolutionWidth.intValue + maxResolution.resolutionWidth.intValue) >> 1;
+ const int height = (minResolution.resolutionHeight.intValue + maxResolution.resolutionHeight.intValue) >> 1;
+ SDLImageResolution *midResolution = [[SDLImageResolution alloc] initWithWidth:(uint16_t)width height:(uint16_t)height];
+ SDLImageResolution *belowResolution = [minResolution copy];
+ belowResolution.resolutionWidth = @(belowResolution.resolutionWidth.intValue - 1);
+ SDLImageResolution *aboveResolution = [maxResolution copy];
+ aboveResolution.resolutionWidth = @(aboveResolution.resolutionWidth.intValue + 1);
+
+ it(@"expect to be within range", ^{
+ expect(streamingRange).toNot(beNil());
+
+ expect([streamingRange isImageResolutionInRange:midResolution]).to(beTrue());
+ expect([streamingRange isImageResolutionInRange:minResolution]).to(beTrue());
+ expect([streamingRange isImageResolutionInRange:maxResolution]).to(beTrue());
+ });
+
+ it(@"expect to be out of range", ^{
+ expect(streamingRange).toNot(beNil());
+ expect([streamingRange isImageResolutionInRange:belowResolution]).to(beFalse());
+ expect([streamingRange isImageResolutionInRange:aboveResolution]).to(beFalse());
+ });
+ });
+});
+
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
index 184ad81a7..4989a95f5 100644
--- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
@@ -48,7 +48,10 @@ typedef NSString * SDLServiceID;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (nullable, strong, nonatomic, readwrite) NSArray<SDLDisplayCapability *> *displays;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@property (nullable, strong, nonatomic, readwrite) SDLDisplayCapabilities *displayCapabilities;
+#pragma clang diagnostic pop
@property (nullable, strong, nonatomic, readwrite) SDLHMICapabilities *hmiCapabilities;
@property (nullable, copy, nonatomic, readwrite) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
@property (nullable, copy, nonatomic, readwrite) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
@@ -87,7 +90,10 @@ describe(@"System capability manager", ^{
__block TestConnectionManager *testConnectionManager = nil;
__block NSArray<SDLDisplayCapability *> *testDisplayCapabilityList = nil;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
__block SDLDisplayCapabilities *testDisplayCapabilities = nil;
+#pragma clang diagnostic pop
__block NSArray<SDLSoftButtonCapabilities *> *testSoftButtonCapabilities = nil;
__block NSArray<SDLButtonCapabilities *> *testButtonCapabilities = nil;
__block SDLPresetBankCapabilities *testPresetBankCapabilities = nil;
@@ -95,8 +101,10 @@ describe(@"System capability manager", ^{
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
testSystemCapabilityManager = [[SDLSystemCapabilityManager alloc] initWithConnectionManager:testConnectionManager];
-
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic pop
testDisplayCapabilities.graphicSupported = @NO;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
@@ -151,6 +159,14 @@ describe(@"System capability manager", ^{
testDisplayCapabilityList = @[displayCapability];
});
+ afterEach(^{
+ if (testSystemCapabilityManager) {
+ // just in case unsubscribe from notifications and dealloc the manager
+ [[NSNotificationCenter defaultCenter] removeObserver:testSystemCapabilityManager];
+ testSystemCapabilityManager = nil;
+ }
+ });
+
it(@"should initialize the system capability manager properties correctly", ^{
expect(testSystemCapabilityManager.displays).to(beNil());
expect(testSystemCapabilityManager.hmiCapabilities).to(beNil());
@@ -267,7 +283,10 @@ describe(@"System capability manager", ^{
context(@"when displayCapabilities.graphicSupported is true", ^{
beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testSystemCapabilityManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic pop
testSystemCapabilityManager.displayCapabilities.graphicSupported = @YES;
});
@@ -525,7 +544,7 @@ describe(@"System capability manager", ^{
it(@"should should save the capabilities", ^{
// All the text fields and image fields should be available
- expect(testSystemCapabilityManager.defaultMainWindowCapability.textFields).to(haveCount(29));
+ expect(testSystemCapabilityManager.defaultMainWindowCapability.textFields).to(haveCount(31));
expect(testSystemCapabilityManager.defaultMainWindowCapability.imageFields).to(haveCount(14));
});
});
@@ -596,12 +615,11 @@ describe(@"System capability manager", ^{
it(@"should should not save the capabilities", ^{
[testSystemCapabilityManager updateCapabilityType:SDLSystemCapabilityTypePhoneCall completionHandler:^(NSError * _Nullable error, SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) {
- expect(error).toEventually(equal(testConnectionManager.defaultError));
- expect(systemCapabilityManager.phoneCapability).toEventually(beNil());
+ expect(error).to(equal(testConnectionManager.defaultError));
+ expect(systemCapabilityManager.phoneCapability).to(beNil());
}];
- [NSThread sleepForTimeInterval:0.1];
-
+ [NSThread sleepForTimeInterval:0.1]; // This still needs to be here to ensure request is sent first
[testConnectionManager respondToLastRequestWithResponse:testGetSystemCapabilityResponse];
});
});
@@ -613,18 +631,17 @@ describe(@"System capability manager", ^{
it(@"should save the capabilitity", ^{
[testSystemCapabilityManager updateCapabilityType:SDLSystemCapabilityTypePhoneCall completionHandler:^(NSError * _Nullable error, SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) {
- expect(testSystemCapabilityManager.phoneCapability).toEventually(equal(testPhoneCapability));
- expect(error).toEventually(beNil());
+ expect(testSystemCapabilityManager.phoneCapability).to(equal(testPhoneCapability));
+ expect(error).to(beNil());
}];
- [NSThread sleepForTimeInterval:0.1];
-
+ [NSThread sleepForTimeInterval:0.1]; // This still needs to be here to ensure request is sent first
[testConnectionManager respondToLastRequestWithResponse:testGetSystemCapabilityResponse];
});
});
afterEach(^{
- // Make sure the RAIR properties and other system capabilities were not inadverdently set
+ // Make sure the RAIR properties and other system capabilities were not inadvertently set
expect(testSystemCapabilityManager.displays).to(beNil());
expect(testSystemCapabilityManager.hmiCapabilities).to(beNil());
#pragma clang diagnostic push
diff --git a/SmartDeviceLinkTests/TestConnectionRequestObject.h b/SmartDeviceLinkTests/TestConnectionRequestObject.h
new file mode 100644
index 000000000..4bc6b5098
--- /dev/null
+++ b/SmartDeviceLinkTests/TestConnectionRequestObject.h
@@ -0,0 +1,23 @@
+//
+// TestConnectionRequestObject.h
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 11/13/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <SmartDeviceLink/SmartDeviceLink.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TestConnectionRequestObject : NSObject
+
+@property (strong, nonatomic) __kindof SDLRPCMessage *message;
+@property (copy, nonatomic, nullable) SDLResponseHandler responseHandler;
+
+- (instancetype)initWithMessage:(__kindof SDLRPCMessage *)message responseHandler:(nullable SDLResponseHandler)handler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLinkTests/TestConnectionRequestObject.m b/SmartDeviceLinkTests/TestConnectionRequestObject.m
new file mode 100644
index 000000000..a1aa57bc4
--- /dev/null
+++ b/SmartDeviceLinkTests/TestConnectionRequestObject.m
@@ -0,0 +1,23 @@
+//
+// TestConnectionRequestObject.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 11/13/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "TestConnectionRequestObject.h"
+
+@implementation TestConnectionRequestObject
+
+- (instancetype)initWithMessage:(__kindof SDLRPCMessage *)message responseHandler:(SDLResponseHandler)handler {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _message = message;
+ _responseHandler = handler;
+
+ return self;
+}
+
+@end
diff --git a/SmartDeviceLinkTests/TestSmartConnection.h b/SmartDeviceLinkTests/TestSmartConnection.h
new file mode 100644
index 000000000..c7ba4baa7
--- /dev/null
+++ b/SmartDeviceLinkTests/TestSmartConnection.h
@@ -0,0 +1,21 @@
+//
+// TestSmartConnection.h
+// SmartDeviceLinkTests
+//
+// Copyright © 2020 Luxoft. All rights reserved
+//
+
+#import <Foundation/Foundation.h>
+#import "SDLRPCRequest.h"
+#import "SDLRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TestSmartConnection : NSObject
+@property (nonatomic, strong, nullable) SDLRPCRequest *request;
+@property (nonatomic, strong, nullable) SDLRPCResponse *response;
+@property (nonatomic, strong, nullable) NSError *error;
+@property (nonatomic, assign) BOOL oneTimeUse;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLinkTests/TestSmartConnection.m b/SmartDeviceLinkTests/TestSmartConnection.m
new file mode 100644
index 000000000..f2bd3ce45
--- /dev/null
+++ b/SmartDeviceLinkTests/TestSmartConnection.m
@@ -0,0 +1,34 @@
+//
+// TestSmartConnection.m
+// SmartDeviceLinkTests
+//
+// Copyright © 2020 Luxoft. All rights reserved
+//
+
+#import "TestSmartConnection.h"
+#import "SDLGetSystemCapability.h"
+
+@implementation TestSmartConnection
+
+- (BOOL)isEqual:(id)object {
+ if (!object) {
+ return NO;
+ }
+ if (![object isKindOfClass:[self class]]) {
+ return NO;
+ }
+ TestSmartConnection *theOther = (TestSmartConnection *)object;
+ if ([self.request isEqual:theOther]) {
+ return YES;
+ }
+ if ([self.request isKindOfClass:[SDLGetSystemCapability class]] && [theOther.request isKindOfClass:[SDLGetSystemCapability class]]) {
+ SDLGetSystemCapability *getSCRequest1 = (SDLGetSystemCapability *)self.request;
+ SDLGetSystemCapability *getSCRequest2 = (SDLGetSystemCapability *)theOther.request;
+ if ([getSCRequest1.systemCapabilityType isEqualToEnum:getSCRequest2.systemCapabilityType]) {
+ return YES;
+ }
+ }
+ return NO;
+}
+
+@end
diff --git a/SmartDeviceLinkTests/TestSmartConnectionManager.h b/SmartDeviceLinkTests/TestSmartConnectionManager.h
new file mode 100644
index 000000000..d253b2ff5
--- /dev/null
+++ b/SmartDeviceLinkTests/TestSmartConnectionManager.h
@@ -0,0 +1,24 @@
+//
+// TestSmartConnectionManager.h
+// SmartDeviceLinkTests
+//
+// Copyright © 2020 Luxoft. All rights reserved
+//
+
+#import <Foundation/Foundation.h>
+#import "TestConnectionManager.h"
+#import "TestSmartConnection.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^SmartConnectionManagerBlock)(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error);
+
+@interface TestSmartConnectionManager : TestConnectionManager
+
+- (void)addConnectionModel:(TestSmartConnection *)model;
+
+@property (copy, nullable) SmartConnectionManagerBlock lastRequestBlock;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLinkTests/TestSmartConnectionManager.m b/SmartDeviceLinkTests/TestSmartConnectionManager.m
new file mode 100644
index 000000000..9bd9d5144
--- /dev/null
+++ b/SmartDeviceLinkTests/TestSmartConnectionManager.m
@@ -0,0 +1,61 @@
+//
+// TestSmartConnectionManager.m
+// SmartDeviceLinkTests
+//
+// Copyright © 2020 Luxoft. All rights reserved
+//
+
+#import "TestSmartConnectionManager.h"
+#import "SDLGetSystemCapability.h"
+
+@interface TestSmartConnectionManager ()
+@property (nonatomic, strong) NSMutableArray *connectionMap;
+@end
+
+@implementation TestSmartConnectionManager
+
+- (instancetype)init {
+ if ((self = [super init])) {
+ _connectionMap = [[NSMutableArray alloc] initWithCapacity:8];
+ }
+ return self;
+}
+
+- (void)addConnectionModel:(TestSmartConnection *)model {
+ if (model) {
+ [self.connectionMap addObject:model];
+ }
+}
+
+- (void)sendConnectionRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+ [super sendConnectionRequest:request withResponseHandler:handler];
+
+ TestSmartConnection *connectionModel = [self connectionModelForRequest:request];
+ if (connectionModel) {
+ if (handler) {
+ handler(request, connectionModel.response, connectionModel.error);
+ }
+ if (connectionModel.oneTimeUse) {
+ [self.connectionMap removeObject:connectionModel];
+ }
+ }
+}
+
+- (nullable TestSmartConnection *)connectionModelForRequest:(__kindof SDLRPCRequest *)request {
+ if (!request || !self.connectionMap.count) {
+ return nil;
+ }
+ for (TestSmartConnection *aModel in self.connectionMap) {
+ SDLRPCRequest *modelRequest = aModel.request;
+ if ([modelRequest isKindOfClass:[SDLGetSystemCapability class]] && [request isKindOfClass:[SDLGetSystemCapability class]]) {
+ SDLGetSystemCapability *getSCRequest1 = (SDLGetSystemCapability *)modelRequest;
+ SDLGetSystemCapability *getSCRequest2 = (SDLGetSystemCapability *)request;
+ if ([getSCRequest1.systemCapabilityType isEqualToEnum:getSCRequest2.systemCapabilityType]) {
+ return aModel;
+ }
+ }
+ }
+ return nil;
+}
+
+@end
diff --git a/SmartDeviceLinkTests/TestStreamingMediaDelegate.h b/SmartDeviceLinkTests/TestStreamingMediaDelegate.h
new file mode 100644
index 000000000..0ead3e03e
--- /dev/null
+++ b/SmartDeviceLinkTests/TestStreamingMediaDelegate.h
@@ -0,0 +1,20 @@
+//
+// TestStreamingMediaDelegate.h
+// SmartDeviceLinkTests
+//
+// Created by Leonid Lokhmatov on 8/24/20.
+// Copyright © 2018 Luxoft. All rights reserved
+//
+
+#import <Foundation/Foundation.h>
+#import "SDLStreamingVideoDelegate.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TestStreamingMediaDelegate : NSObject <SDLStreamingVideoDelegate>
+@property (nonatomic, readonly) NSArray *recordedSizes;
+@property (nonatomic, assign) BOOL isStopped;
+- (void)reset;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLinkTests/TestStreamingMediaDelegate.m b/SmartDeviceLinkTests/TestStreamingMediaDelegate.m
new file mode 100644
index 000000000..722f74e89
--- /dev/null
+++ b/SmartDeviceLinkTests/TestStreamingMediaDelegate.m
@@ -0,0 +1,41 @@
+//
+// TestStreamingMediaDelegate.m
+// SmartDeviceLinkTests
+//
+// Created by Leonid Lokhmatov on 8/24/20.
+// Copyright © 2018 Luxoft. All rights reserved
+//
+
+#import <UIKit/UIKit.h>
+#import "TestStreamingMediaDelegate.h"
+#import "SDLLogMacros.h"
+
+@interface TestStreamingMediaDelegate ()
+@property (nonatomic, strong) NSMutableArray *recordedSizesImp;
+@end
+
+@implementation TestStreamingMediaDelegate
+
+- (instancetype)init {
+ if ((self = [super init])) {
+ _recordedSizesImp = [NSMutableArray arrayWithCapacity:8];
+ }
+ return self;
+}
+
+- (NSArray *)recordedSizes {
+ return self.recordedSizesImp;
+}
+
+- (void)reset {
+ [self.recordedSizesImp removeAllObjects];
+}
+
+#pragma mark - SDLStreamingVideoDelegate
+
+- (void)videoStreamingSizeDidUpdate:(CGSize)displaySize {
+ SDLLogD(@"SDLStreamingVideoDelegate videoStreamingSizeDidUpdate: %@", NSStringFromCGSize(displaySize));
+ [self.recordedSizesImp addObject:[NSValue valueWithCGSize:displaySize]];
+}
+
+@end
diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h
index 5b07db771..3f91c72ba 100644
--- a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h
+++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h
@@ -9,23 +9,23 @@
#import <Foundation/Foundation.h>
#import "SDLConnectionManagerType.h"
#import "SDLNotificationConstants.h"
+#import "TestConnectionRequestObject.h"
NS_ASSUME_NONNULL_BEGIN
@interface TestConnectionManager : NSObject <SDLConnectionManagerType>
+@property (strong, nonatomic, nullable) SDLSystemInfo *systemInfo;
+
@property (copy, nonatomic, readonly) NSError *defaultError;
/**
* All received requests. Chronological order. The 0th element will be the first request received; the nth request will be the n+1th request received.
*/
-@property (copy, nonatomic, readonly) NSMutableArray<__kindof SDLRPCMessage *> *receivedRequests;
+@property (copy, nonatomic, readonly) NSMutableArray<__kindof TestConnectionRequestObject *> *receivedRequestObjects;
-/**
- * The block passed for the last request send with sendRequest:withCompletionHandler:
- */
-@property (copy, nonatomic, nullable) SDLResponseHandler lastRequestBlock;
+@property (copy, nonatomic, readonly) NSArray<__kindof SDLRPCMessage *> *receivedRequests;
@property (copy, nonatomic, nullable) NSMutableArray<SDLMultipleRequestCompletionHandler> *multipleCompletionBlocks;
diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
index ded122d0a..525ad3052 100644
--- a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
+++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
@@ -21,21 +21,29 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
- _receivedRequests = [NSMutableArray<__kindof SDLRPCMessage *> array];
+ _receivedRequestObjects = [NSMutableArray<TestConnectionRequestObject *> array];
_multipleCompletionBlocks = [NSMutableArray array];
+ _systemInfo = [[SDLSystemInfo alloc] initWithMake:@"Livio" model:@"Is" trim:@"Awesome" modelYear:@"2021" softwareVersion:@"1.1.1.1" hardwareVersion:@"2.2.2.2"];
return self;
}
+- (NSArray<__kindof SDLRPCMessage *> *)receivedRequests {
+ NSMutableArray<__kindof SDLRPCMessage *> *requests = [NSMutableArray array];
+ [_receivedRequestObjects enumerateObjectsUsingBlock:^(__kindof TestConnectionRequestObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
+ [requests addObject:obj.message];
+ }];
+
+ return [requests copy];
+}
+
- (void)sendConnectionRPC:(__kindof SDLRPCMessage *)rpc {
- [self.receivedRequests addObject:rpc];
+ [self.receivedRequestObjects addObject:[[TestConnectionRequestObject alloc] initWithMessage:rpc responseHandler:nil]];
}
- (void)sendConnectionRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
- self.lastRequestBlock = handler;
- SDLRPCRequest *requestRPC = (SDLRPCRequest *)request;
- requestRPC.correlationID = [self test_nextCorrelationID];
- [self.receivedRequests addObject:requestRPC];
+ request.correlationID = [self test_nextCorrelationID];
+ [self.receivedRequestObjects addObject:[[TestConnectionRequestObject alloc] initWithMessage:request responseHandler:handler]];
}
- (void)sendConnectionManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
@@ -48,11 +56,11 @@ NS_ASSUME_NONNULL_BEGIN
- (void)sendRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
[requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
- [self sendConnectionRequest:request withResponseHandler:nil];
-
- if (progressHandler != nil) {
- progressHandler(request, nil, nil, (double)idx / (double)requests.count);
- }
+ [self sendConnectionRequest:request withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if (progressHandler != nil) {
+ progressHandler(request, response, error, (double)idx / (double)requests.count);
+ }
+ }];
}];
[_multipleCompletionBlocks addObject:completionHandler];
@@ -79,8 +87,9 @@ NS_ASSUME_NONNULL_BEGIN
thisError = error;
}
- if (self.lastRequestBlock != nil) {
- self.lastRequestBlock(self.receivedRequests.lastObject, response, thisError);
+ TestConnectionRequestObject *lastObject = self.receivedRequestObjects.lastObject;
+ if (lastObject.responseHandler != nil) {
+ lastObject.responseHandler((SDLRPCRequest *)lastObject.message, response, thisError);
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
}
@@ -94,8 +103,9 @@ NS_ASSUME_NONNULL_BEGIN
thisError = error;
}
- if (self.lastRequestBlock != nil) {
- self.lastRequestBlock(self.receivedRequests[requestNumber], response, thisError);
+ TestConnectionRequestObject *requestObj = self.receivedRequestObjects[requestNumber];
+ if (requestObj.responseHandler != nil) {
+ requestObj.responseHandler((SDLRPCRequest *)requestObj.message, response, thisError);
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
}
@@ -110,8 +120,8 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)reset {
- _receivedRequests = [NSMutableArray<__kindof SDLRPCMessage *> array];
- _lastRequestBlock = nil;
+ _receivedRequestObjects = [NSMutableArray<__kindof TestConnectionRequestObject *> array];
+ _multipleCompletionBlocks = [NSMutableArray array];
}
diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m
index ccf85cb28..79242d8b0 100644
--- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m
@@ -38,29 +38,16 @@ describe(@"SDLIAPControlSession", ^{
describe(@"init", ^{
beforeEach(^{
- controlSession = [[SDLIAPControlSession alloc] initWithAccessory:mockAccessory delegate:mockDelegate];
+ controlSession = [[SDLIAPControlSession alloc] initWithAccessory:mockAccessory delegate:mockDelegate forProtocol:ControlProtocolString];
});
-
- it(@"Should get/set correctly", ^{
+
+ it(@"Should init correctly", ^{
expect(controlSession.accessory).to(equal(mockAccessory));
- expect(controlSession.protocolString).to(equal(ControlProtocolString));
- expect(controlSession.protocolIndexTimer).to(beNil());
expect(controlSession.delegate).to(equal(mockDelegate));
+ expect(controlSession.isSessionInProgress).to(beFalse());
});
});
- describe(@"starting a session", ^{
- context(@"it should attempt to retry the session", ^{
- beforeEach(^{
- controlSession = [[SDLIAPControlSession alloc] initWithAccessory:nil delegate:mockDelegate];
- });
-
- it(@"Should start correctly", ^{
- [controlSession startSession];
- OCMExpect([mockDelegate controlSessionShouldRetry]);
- });
- });
- });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m
index 1b5e4b001..4ab4f088e 100644
--- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m
@@ -42,35 +42,18 @@ describe(@"SDLIAPDataSession", ^{
beforeEach(^{
dataSession = [[SDLIAPDataSession alloc] initWithAccessory:mockAccessory delegate:mockDelegate forProtocol:MultiSessionProtocolString];
});
-
+
it(@"Should init correctly", ^{
+ expect(dataSession.accessory).to(equal(mockAccessory));
expect(dataSession.delegate).to(equal(mockDelegate));
- expect(dataSession.sendDataQueue).toNot(beNil());
- });
+ expect(dataSession.isSessionInProgress).to(beFalse());
- it(@"Should get correctly", ^{
- expect(dataSession.accessory).to(equal(mockAccessory));
- expect(dataSession.protocolString).to(equal(MultiSessionProtocolString));
- expect(dataSession.isStopped).to(beTrue());
- expect(dataSession.connectionID).to(equal(0));
- expect(dataSession.sessionInProgress).to(beFalse());
});
});
- describe(@"starting a session", ^{
- context(@"it should attempt to retry the session", ^{
- beforeEach(^{
- dataSession = [[SDLIAPDataSession alloc] initWithAccessory:nil delegate:mockDelegate forProtocol:MultiSessionProtocolString];
- });
-
- it(@"Should start correctly", ^{
- [dataSession startSession];
- OCMExpect([mockDelegate dataSessionShouldRetry]);
- });
- });
- });
});
QuickSpecEnd
+
diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m
index 8b638afb0..4dd1e767b 100644
--- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m
@@ -14,30 +14,24 @@
#import "SDLIAPSession.h"
#import "SDLIAPConstants.h"
-
QuickSpecBegin(SDLIAPSessionSpec)
describe(@"SDLIAPSession", ^{
__block EAAccessory *mockAccessory = nil;
+ __block id<SDLIAPSessionDelegate> mockDelegate = nil;
describe(@"Initialization", ^{
__block SDLIAPSession *testSession = nil;
beforeEach(^{
mockAccessory = [EAAccessory.class sdlCoreMock];
- testSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:ControlProtocolString];
+ mockDelegate = OCMProtocolMock(@protocol(SDLIAPSessionDelegate));
+ testSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:ControlProtocolString iAPSessionDelegate:mockDelegate];
});
it(@"should init correctly", ^{
expect(testSession.accessory).to(equal(mockAccessory));
- expect(testSession.protocolString).to(equal(ControlProtocolString));
- expect(testSession.isInputStreamOpen).to(beFalse());
- expect(testSession.isOutputStreamOpen).to(beFalse());
- });
-
- it(@"should get correctly", ^{
- expect(testSession.isStopped).to(beTrue());
- expect(testSession.connectionID).to(equal(0));
+ expect(testSession.bothStreamsOpen).to(beFalse());
expect(testSession.isSessionInProgress).to(beFalse());
});
});
@@ -45,3 +39,4 @@ describe(@"SDLIAPSession", ^{
QuickSpecEnd
+
diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m
index 57761fd0a..92c932432 100644
--- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m
@@ -137,54 +137,6 @@ describe(@"SDLIAPTransport", ^{
expect(transport.transportDestroyed).to(beFalse());
});
});
-
- context(@"When a data session is open", ^{
- __block SDLIAPDataSession *mockDataSession = nil;
-
- beforeEach(^{
- mockDataSession = OCMStrictClassMock([SDLIAPDataSession class]);
- OCMStub([mockDataSession isSessionInProgress]).andReturn(YES);
- OCMStub([mockDataSession connectionID]).andReturn(mockAccessory.connectionID);
- transport.dataSession = mockDataSession;
- transport.controlSession = nil;
- });
-
- it(@"It should cleanup on disconnect, close and destroy data session, and notify the lifecycle manager that the transport disconnected", ^{
- OCMExpect([mockDataSession destroySessionWithCompletionHandler:[OCMArg invokeBlock]]);
-
- [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification];
-
- expect(transport.retryCounter).toEventually(equal(0));
- expect(transport.sessionSetupInProgress).toEventually(beFalse());
- expect(transport.transportDestroyed).toEventually(beTrue());
-
- OCMVerify([mockTransportDelegate onTransportDisconnected]);
- });
- });
-
- describe(@"When a control session is open", ^{
- __block SDLIAPControlSession *mockControlSession = nil;
-
- beforeEach(^{
- mockControlSession = OCMStrictClassMock([SDLIAPControlSession class]);
- OCMStub([mockControlSession isSessionInProgress]).andReturn(YES);
- OCMStub([mockControlSession connectionID]).andReturn(mockAccessory.connectionID);
- transport.controlSession = mockControlSession;
- transport.dataSession = nil;
- });
-
- it(@"It should cleanup on disconnect, close and destroy data session, and should not tell the delegate that the transport closed", ^{
- OCMExpect([mockControlSession destroySessionWithCompletionHandler:[OCMArg invokeBlock]]);
-
- [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification];
-
- expect(transport.retryCounter).toEventually(equal(0));
- expect(transport.sessionSetupInProgress).toEventually(beFalse());
- expect(transport.transportDestroyed).toEventually(beFalse());
-
- OCMReject([mockTransportDelegate onTransportDisconnected]);
- });
- });
});
});
diff --git a/SmartDeviceLinkTests/UtilitiesSpecs/SDLGlobalsSpec.m b/SmartDeviceLinkTests/UtilitiesSpecs/SDLGlobalsSpec.m
index f730c17c1..379b269e8 100644
--- a/SmartDeviceLinkTests/UtilitiesSpecs/SDLGlobalsSpec.m
+++ b/SmartDeviceLinkTests/UtilitiesSpecs/SDLGlobalsSpec.m
@@ -40,6 +40,19 @@ describe(@"The SDLGlobals class", ^{
expect(testGlobals.maxHeadUnitProtocolVersion).to(equal(someVersionHigherThanMaxProxyVersion));
});
});
+
+ describe(@"test values after calling sdl_resetProtocolVersion", ^{
+ beforeEach(^{
+ [testGlobals reset];
+ });
+
+ it(@"should return should properly set values", ^{
+ expect(testGlobals.protocolVersion.stringVersion).to(equal(@"1.0.0"));
+ expect(testGlobals.protocolVersion.major).to(equal(1));
+ expect(testGlobals.maxHeadUnitProtocolVersion.stringVersion).to(equal(@"0.0.0"));
+ expect(testGlobals.rpcVersion).to(equal([[SDLVersion alloc] initWithMajor:1 minor:0 patch:0]));
+ });
+ });
describe(@"getting the max MTU version", ^{
context(@"when protocol version is 1 - 2", ^{
diff --git a/carthage-build.sh b/carthage-build.sh
index 0dcdefdee..c50df1cba 100644..100755
--- a/carthage-build.sh
+++ b/carthage-build.sh
@@ -18,4 +18,4 @@ echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x8
echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig
export XCODE_XCCONFIG_FILE="$xcconfig"
-carthage build "$@" \ No newline at end of file
+carthage "$@" \ No newline at end of file
diff --git a/docs/Classes.html b/docs/Classes.html
index 0b4890dd8..ba93eed4c 100644
--- a/docs/Classes.html
+++ b/docs/Classes.html
@@ -9,9 +9,12 @@
<li><a href="#section-SDLAddSubMenuResponse">SDLAddSubMenuResponse</a></li>
<li><a href="#section-SDLAirbagStatus">SDLAirbagStatus</a></li>
<li><a href="#section-SDLAlert">SDLAlert</a></li>
+ <li><a href="#section-SDLAlertAudioData">SDLAlertAudioData</a></li>
<li><a href="#section-SDLAlertManeuver">SDLAlertManeuver</a></li>
<li><a href="#section-SDLAlertManeuverResponse">SDLAlertManeuverResponse</a></li>
<li><a href="#section-SDLAlertResponse">SDLAlertResponse</a></li>
+ <li><a href="#section-SDLAlertView">SDLAlertView</a></li>
+ <li><a href="#section-SDLAppCapability">SDLAppCapability</a></li>
<li><a href="#section-SDLAppInfo">SDLAppInfo</a></li>
<li><a href="#section-SDLAppServiceCapability">SDLAppServiceCapability</a></li>
<li><a href="#section-SDLAppServiceData">SDLAppServiceData</a></li>
@@ -21,6 +24,7 @@
<li><a href="#section-SDLArtwork">SDLArtwork</a></li>
<li><a href="#section-SDLAudioControlCapabilities">SDLAudioControlCapabilities</a></li>
<li><a href="#section-SDLAudioControlData">SDLAudioControlData</a></li>
+ <li><a href="#section-SDLAudioData">SDLAudioData</a></li>
<li><a href="#section-SDLAudioFile">SDLAudioFile</a></li>
<li><a href="#section-SDLAudioPassThruCapabilities">SDLAudioPassThruCapabilities</a></li>
<li><a href="#section-SDLAudioStreamManager">SDLAudioStreamManager</a></li>
@@ -39,6 +43,7 @@
<li><a href="#section-SDLChoiceSet">SDLChoiceSet</a></li>
<li><a href="#section-SDLClimateControlCapabilities">SDLClimateControlCapabilities</a></li>
<li><a href="#section-SDLClimateControlData">SDLClimateControlData</a></li>
+ <li><a href="#section-SDLClimateData">SDLClimateData</a></li>
<li><a href="#section-SDLCloseApplication">SDLCloseApplication</a></li>
<li><a href="#section-SDLCloseApplicationResponse">SDLCloseApplicationResponse</a></li>
<li><a href="#section-SDLCloudAppProperties">SDLCloudAppProperties</a></li>
@@ -68,6 +73,7 @@
<li><a href="#section-SDLDialNumberResponse">SDLDialNumberResponse</a></li>
<li><a href="#section-SDLDisplayCapabilities">SDLDisplayCapabilities</a></li>
<li><a href="#section-SDLDisplayCapability">SDLDisplayCapability</a></li>
+ <li><a href="#section-SDLDoorStatus">SDLDoorStatus</a></li>
<li><a href="#section-SDLDriverDistractionCapability">SDLDriverDistractionCapability</a></li>
<li><a href="#section-SDLDynamicUpdateCapabilities">SDLDynamicUpdateCapabilities</a></li>
<li><a href="#section-SDLECallInfo">SDLECallInfo</a></li>
@@ -84,6 +90,7 @@
<li><a href="#section-SDLFuelRange">SDLFuelRange</a></li>
<li><a href="#section-SDLFunctionID">SDLFunctionID</a></li>
<li><a href="#section-SDLGPSData">SDLGPSData</a></li>
+ <li><a href="#section-SDLGateStatus">SDLGateStatus</a></li>
<li><a href="#section-SDLGearStatus">SDLGearStatus</a></li>
<li><a href="#section-SDLGenericResponse">SDLGenericResponse</a></li>
<li><a href="#section-SDLGetAppServiceData">SDLGetAppServiceData</a></li>
@@ -114,6 +121,8 @@
<li><a href="#section-SDLImage">SDLImage</a></li>
<li><a href="#section-SDLImageField">SDLImageField</a></li>
<li><a href="#section-SDLImageResolution">SDLImageResolution</a></li>
+ <li><a href="#section-SDLKeyboardCapabilities">SDLKeyboardCapabilities</a></li>
+ <li><a href="#section-SDLKeyboardLayoutCapability">SDLKeyboardLayoutCapability</a></li>
<li><a href="#section-SDLKeyboardProperties">SDLKeyboardProperties</a></li>
<li><a href="#section-SDLLifecycleConfiguration">SDLLifecycleConfiguration</a></li>
<li><a href="#section-SDLLifecycleConfigurationUpdate">SDLLifecycleConfigurationUpdate</a></li>
@@ -153,6 +162,7 @@
<li><a href="#section-SDLNavigationServiceManifest">SDLNavigationServiceManifest</a></li>
<li><a href="#section-SDLNotificationConstants">SDLNotificationConstants</a></li>
<li><a href="#section-SDLOasisAddress">SDLOasisAddress</a></li>
+ <li><a href="#section-SDLOnAppCapabilityUpdated">SDLOnAppCapabilityUpdated</a></li>
<li><a href="#section-SDLOnAppInterfaceUnregistered">SDLOnAppInterfaceUnregistered</a></li>
<li><a href="#section-SDLOnAppServiceData">SDLOnAppServiceData</a></li>
<li><a href="#section-SDLOnAudioPassThru">SDLOnAudioPassThru</a></li>
@@ -218,6 +228,7 @@
<li><a href="#section-SDLRemoteControlCapabilities">SDLRemoteControlCapabilities</a></li>
<li><a href="#section-SDLResetGlobalProperties">SDLResetGlobalProperties</a></li>
<li><a href="#section-SDLResetGlobalPropertiesResponse">SDLResetGlobalPropertiesResponse</a></li>
+ <li><a href="#section-SDLRoofStatus">SDLRoofStatus</a></li>
<li><a href="#section-SDLSISData">SDLSISData</a></li>
<li><a href="#section-SDLScreenManager">SDLScreenManager</a></li>
<li><a href="#section-SDLScreenParams">SDLScreenParams</a></li>
@@ -228,6 +239,9 @@
<li><a href="#section-SDLSeatLocation">SDLSeatLocation</a></li>
<li><a href="#section-SDLSeatLocationCapability">SDLSeatLocationCapability</a></li>
<li><a href="#section-SDLSeatMemoryAction">SDLSeatMemoryAction</a></li>
+ <li><a href="#section-SDLSeatOccupancy">SDLSeatOccupancy</a></li>
+ <li><a href="#section-SDLSeatStatus">SDLSeatStatus</a></li>
+ <li><a href="#section-SDLSeekStreamingIndicator">SDLSeekStreamingIndicator</a></li>
<li><a href="#section-SDLSendHapticData">SDLSendHapticData</a></li>
<li><a href="#section-SDLSendHapticDataResponse">SDLSendHapticDataResponse</a></li>
<li><a href="#section-SDLSendLocation">SDLSendLocation</a></li>
@@ -277,6 +291,7 @@
<li><a href="#section-SDLSyncPDataResponse">SDLSyncPDataResponse</a></li>
<li><a href="#section-SDLSystemCapability">SDLSystemCapability</a></li>
<li><a href="#section-SDLSystemCapabilityManager">SDLSystemCapabilityManager</a></li>
+ <li><a href="#section-SDLSystemInfo">SDLSystemInfo</a></li>
<li><a href="#section-SDLSystemRequest">SDLSystemRequest</a></li>
<li><a href="#section-SDLSystemRequestResponse">SDLSystemRequestResponse</a></li>
<li><a href="#section-SDLTTSChunk">SDLTTSChunk</a></li>
@@ -308,6 +323,7 @@
<li><a href="#section-SDLVersion">SDLVersion</a></li>
<li><a href="#section-SDLVideoStreamingCapability">SDLVideoStreamingCapability</a></li>
<li><a href="#section-SDLVideoStreamingFormat">SDLVideoStreamingFormat</a></li>
+ <li><a href="#section-SDLVideoStreamingRange">SDLVideoStreamingRange</a></li>
<li><a href="#section-SDLVoiceCommand">SDLVoiceCommand</a></li>
<li><a href="#section-SDLVRHelpItem">SDLVRHelpItem</a></li>
<li><a href="#section-SDLWeatherAlert">SDLWeatherAlert</a></li>
@@ -347,7 +363,7 @@
<li>Choices having both SDLMenuParams and VR synonym definitions</li>
</ol>
-<p>HMILevel needs to be FULL, LIMITED or BACKGROUD
+<p>HMILevel needs to be FULL, LIMITED or BACKGROUND
@since SDL 1.0</p>
<div class="aside aside-see">
<p class="aside-title">See</p>
@@ -398,7 +414,7 @@
added to a SDLSubMenu), and may only contain commands as children
<p>
<p>
- <b>HMILevel needs to be FULL, LIMITED or BACKGROUD</b>
+ <b>HMILevel needs to be FULL, LIMITED or BACKGROUND</b>
</p></p>
<p>Since <b>SmartDeviceLink 1.0</b><br>
@@ -479,6 +495,32 @@
+ <h3 id="section-SDLAlertAudioData">
+ SDLAlertAudioData
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLAlertAudioData.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAlertAudioData</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLAudioData.html">SDLAudioData</a></span>
+
+<span class="c1">/// Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">playTone</span><span class="p">;</span>
+
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span>
+
+<span class="k">@end</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLAlertAudioData</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLAudioData.html">SDLAudioData</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLAlertManeuver">
SDLAlertManeuver
</h3>
@@ -541,6 +583,96 @@
+ <h3 id="section-SDLAlertView">
+ SDLAlertView
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLAlertView.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAlertView</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span>
+
+<span class="c1">/// Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See `timeout` for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.</span>
+<span class="c1">/// Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">class</span><span class="p">,</span> <span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSTimeInterval</span> <span class="n">defaultTimeout</span><span class="p">;</span>
+
+<span class="c1">/// The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">text</span><span class="p">;</span>
+
+<span class="c1">/// The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">secondaryText</span><span class="p">;</span>
+
+<span class="c1">/// The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">tertiaryText</span><span class="p">;</span>
+
+<span class="c1">/// Timeout in seconds. Defaults to 0, which will use `defaultTimeout`. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.</span>
+<span class="c1">/// Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSTimeInterval</span> <span class="n">timeout</span><span class="p">;</span>
+
+<span class="c1">/// Text spoken, file(s) played, and/or tone played when the alert appears</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span> <span class="o">*</span><span class="n">audio</span><span class="p">;</span>
+
+<span class="c1">/// If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">showWaitIndicator</span><span class="p">;</span>
+
+<span class="c1">/// Soft buttons the user may select to perform actions. Only one `SDLSoftButtonState` per object is supported; if any soft button object contains multiple states, an exception will be thrown.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">softButtons</span><span class="p">;</span>
+
+<span class="c1">/// An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="n">icon</span><span class="p">;</span>
+
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_DESIGNATED_INITIALIZER</span><span class="p">;</span>
+
+<span class="c1">/// Initialize a basic alert with a message and buttons</span>
+<span class="c1">/// @param text The primary line of text for display on the alert</span>
+<span class="c1">/// @param softButtons Soft buttons the user may select to perform actions</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithText</span><span class="p">:(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">text</span> <span class="nf">buttons</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">softButtons</span><span class="p">;</span>
+
+<span class="c1">/// Initialize a alert with a text, image, buttons and sound</span>
+<span class="c1">/// @param text The primary line of text for display on the alert</span>
+<span class="c1">/// @param secondaryText The secondary line of text for display on the alert</span>
+<span class="c1">/// @param tertiaryText The tertiary line of text for display on the alert</span>
+<span class="c1">/// @param timeout Timeout in seconds</span>
+<span class="c1">/// @param showWaitIndicator If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation</span>
+<span class="c1">/// @param audio Text spoken and/or tone played when the alert appears</span>
+<span class="c1">/// @param softButtons Soft buttons the user may select to perform actions</span>
+<span class="c1">/// @param icon An artwork that will be displayed when the icon appears</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">text</span> <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span> <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span> <span class="nf">timeout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">timeout</span> <span class="nf">showWaitIndicator</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">showWaitIndicator</span> <span class="nf">audioIndication</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">audio</span> <span class="nf">buttons</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">softButtons</span> <span class="nf">icon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">icon</span><span class="p">;</span>
+
+<span class="c1">/// Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.</span>
+<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">cancel</span><span class="p">;</span>
+
+<span class="k">@end</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLAlertView</span> <span class="p">:</span> <span class="kt">NSObject</span><span class="p">,</span> <span class="kt">NSCopying</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLAppCapability">
+ SDLAppCapability
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLAppCapability.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAppCapability</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLAppCapability</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLAppInfo">
SDLAppInfo
</h3>
@@ -724,11 +856,65 @@
+ <h3 id="section-SDLAudioData">
+ SDLAudioData
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLAudioData.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAudioData</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span>
+
+<span class="c1">/// The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLTTSChunk.html">SDLTTSChunk</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">audioData</span><span class="p">;</span>
+
+<span class="c1">/// Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.</span>
+<span class="c1">/// @discussion Only available on systems supporting RPC Spec v5.0+</span>
+<span class="c1">///</span>
+<span class="c1">/// @param audioFile The audio file to be played by the system</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithAudioFile</span><span class="p">:(</span><span class="n"><a href="Classes/SDLFile.html">SDLFile</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">audioFile</span><span class="p">;</span>
+
+<span class="c1">/// Initialize with a string to be spoken by the system speech synthesizer.</span>
+<span class="c1">/// @param spokenString The string to be spoken by the system speech synthesizer</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithSpeechSynthesizerString</span><span class="p">:(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">spokenString</span><span class="p">;</span>
+
+<span class="c1">/// Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.</span>
+<span class="c1">/// @param phoneticString The string to be spoken by the system speech synthesizer</span>
+<span class="c1">/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithPhoneticSpeechSynthesizerString</span><span class="p">:(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">phoneticString</span> <span class="nf">phoneticType</span><span class="p">:(</span><span class="n"><a href="Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span><span class="nv">phoneticType</span><span class="p">;</span>
+
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span>
+
+<span class="c1">/// Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.</span>
+<span class="c1">/// @param audioFiles An array of audio file to be played by the system</span>
+<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addAudioFiles</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLFile.html">SDLFile</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">audioFiles</span><span class="p">;</span>
+
+<span class="c1">/// Create additional strings to be spoken by the system speech synthesizer.</span>
+<span class="c1">/// @param spokenStrings The strings to be spoken by the system speech synthesizer</span>
+<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addSpeechSynthesizerStrings</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">spokenStrings</span><span class="p">;</span>
+
+<span class="c1">/// Create additional strings to be spoken by the system speech synthesizer using a phonetic string.</span>
+<span class="c1">/// @param phoneticStrings The strings to be spoken by the system speech synthesizer</span>
+<span class="c1">/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created</span>
+<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addPhoneticSpeechSynthesizerStrings</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">phoneticStrings</span> <span class="nf">phoneticType</span><span class="p">:(</span><span class="n"><a href="Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span><span class="nv">phoneticType</span><span class="p">;</span>
+
+<span class="k">@end</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLAudioData</span> <span class="p">:</span> <span class="kt">NSObject</span><span class="p">,</span> <span class="kt">NSCopying</span></code></pre>
+
+
+
+
<h3 id="section-SDLAudioFile">
SDLAudioFile
</h3>
- <p>Includes inforamtion about a given audio file</p>
+ <p>Includes information about a given audio file</p>
<a href="Classes/SDLAudioFile.html" class="slightly-smaller">See more</a>
@@ -806,7 +992,7 @@
SDLBodyInformation
</h3>
- <p>The body information including power modes.</p>
+ <p>Undocumented</p>
<a href="Classes/SDLBodyInformation.html" class="slightly-smaller">See more</a>
@@ -1082,6 +1268,25 @@
+ <h3 id="section-SDLClimateData">
+ SDLClimateData
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLClimateData.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLClimateData</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLClimateData</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLCloseApplication">
SDLCloseApplication
</h3>
@@ -1160,7 +1365,7 @@
SDLConfiguration
</h3>
- <p>Contains information about the app&rsquo;s configurtion, such as lifecycle, lockscreen, encryption, etc.</p>
+ <p>Contains information about the app&rsquo;s configuration, such as lifecycle, lockscreen, encryption, etc.</p>
<a href="Classes/SDLConfiguration.html" class="slightly-smaller">See more</a>
@@ -1674,7 +1879,8 @@
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLDisplayCapabilities</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+ <pre class="highlight objective_c"><code>
+<span class="k">@interface</span> <span class="nc">SDLDisplayCapabilities</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
<h4>Swift</h4>
@@ -1704,6 +1910,27 @@
+ <h3 id="section-SDLDoorStatus">
+ SDLDoorStatus
+ </h3>
+
+ <p>Describes the status of a parameter of door.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLDoorStatus.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLDoorStatus</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLDoorStatus</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLDriverDistractionCapability">
SDLDriverDistractionCapability
</h3>
@@ -2024,6 +2251,27 @@ see SDLPerformAudioPassThru</p>
+ <h3 id="section-SDLGateStatus">
+ SDLGateStatus
+ </h3>
+
+ <p>Describes the status of a parameter of trunk/hood/etc.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLGateStatus.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLGateStatus</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLGateStatus</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLGearStatus">
SDLGearStatus
</h3>
@@ -2250,7 +2498,7 @@ whenever new data is available for the module.</p>
SDLGetInteriorVehicleDataConsent
</h3>
- <p>This RPC allows you to get consent to control a certian module</p>
+ <p>This RPC allows you to get consent to control a certain module</p>
<p>@since RPC 6.0</p>
@@ -2621,11 +2869,51 @@ whenever new data is available for the module.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLImageResolution</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLImageResolution</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLImageResolution</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLImageResolution</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span><span class="p">,</span> <span class="kt">NSCopying</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLKeyboardCapabilities">
+ SDLKeyboardCapabilities
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLKeyboardCapabilities.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLKeyboardCapabilities</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLKeyboardCapabilities</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLKeyboardLayoutCapability">
+ SDLKeyboardLayoutCapability
+ </h3>
+
+ <p>Describes the capabilities of a single keyboard layout.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLKeyboardLayoutCapability.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLKeyboardLayoutCapability</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLKeyboardLayoutCapability</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
@@ -3390,6 +3678,27 @@ cases the language of the head unit changes or does not match the app language.<
+ <h3 id="section-SDLOnAppCapabilityUpdated">
+ SDLOnAppCapabilityUpdated
+ </h3>
+
+ <p>A notification to inform SDL Core that a specific app capability has changed.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLOnAppCapabilityUpdated.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLOnAppCapabilityUpdated</span> <span class="p">:</span> <span class="nc"><a href="Classes.html#/c:objc(cs)SDLRPCNotification">SDLRPCNotification</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLOnAppCapabilityUpdated</span> <span class="p">:</span> <span class="kt"><a href="Classes.html#/c:objc(cs)SDLRPCNotification">SDLRPCNotification</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLOnAppInterfaceUnregistered">
SDLOnAppInterfaceUnregistered
</h3>
@@ -4839,6 +5148,27 @@ Subsequent calls with the same service type will update the manifest for that se
+ <h3 id="section-SDLRoofStatus">
+ SDLRoofStatus
+ </h3>
+
+ <p>Describes the status of a parameter of roof/convertible roof/sunroof/moonroof etc. If roof is open (AJAR), state will determine percentage of roof open.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLRoofStatus.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLRoofStatus</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLRoofStatus</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLSISData">
SDLSISData
</h3>
@@ -5034,6 +5364,67 @@ Subsequent calls with the same service type will update the manifest for that se
+ <h3 id="section-SDLSeatOccupancy">
+ SDLSeatOccupancy
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLSeatOccupancy.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLSeatOccupancy</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLSeatOccupancy</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLSeatStatus">
+ SDLSeatStatus
+ </h3>
+
+ <p>Describes the status of a parameter of seat.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLSeatStatus.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLSeatStatus</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLSeatStatus</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLSeekStreamingIndicator">
+ SDLSeekStreamingIndicator
+ </h3>
+
+ <p>The seek next / skip previous subscription buttons&rsquo; content</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+ <a href="Classes/SDLSeekStreamingIndicator.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLSeekStreamingIndicator</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLSeekStreamingIndicator</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCStruct.html">SDLRPCStruct</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLSendHapticData">
SDLSendHapticData
</h3>
@@ -6137,6 +6528,51 @@ change the settings of a specific remote control module.</p>
+ <h3 id="section-SDLSystemInfo">
+ SDLSystemInfo
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLSystemInfo.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLSystemInfo</span> <span class="p">:</span> <span class="nc">NSObject</span>
+
+<span class="c1">/// The connected module's vehicle type: it's make, model, trim, and model year</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="Classes/SDLVehicleType.html">SDLVehicleType</a></span> <span class="o">*</span><span class="n">vehicleType</span><span class="p">;</span>
+
+<span class="c1">/// The connected module's software version</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">systemSoftwareVersion</span><span class="p">;</span>
+
+<span class="c1">/// The connected module's hardware version</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">systemHardwareVersion</span><span class="p">;</span>
+
+<span class="c1">/// Initialize a system info object with individual pieces</span>
+<span class="c1">/// @param make The vehicle's make</span>
+<span class="c1">/// @param model The vehicle's model</span>
+<span class="c1">/// @param trim The vehicle's trim</span>
+<span class="c1">/// @param modelYear The vehicle's model year</span>
+<span class="c1">/// @param softwareVersion The vehicle's software version</span>
+<span class="c1">/// @param hardwareVersion The vehicle's hardware version</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMake</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">make</span> <span class="nf">model</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">model</span> <span class="nf">trim</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">trim</span> <span class="nf">modelYear</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">modelYear</span> <span class="nf">softwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">softwareVersion</span> <span class="nf">hardwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">hardwareVersion</span><span class="p">;</span>
+
+<span class="c1">/// Initialize a system info object with the vehicle type and versions</span>
+<span class="c1">/// @param vehicleType The vehicle information</span>
+<span class="c1">/// @param softwareVersion The vehicle's software version</span>
+<span class="c1">/// @param hardwareVersion The vehicle's hardware version</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithVehicleType</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLVehicleType.html">SDLVehicleType</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">vehicleType</span> <span class="nf">softwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">softwareVersion</span> <span class="nf">hardwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">hardwareVersion</span><span class="p">;</span>
+
+<span class="k">@end</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLSystemInfo</span> <span class="p">:</span> <span class="kt">NSObject</span></code></pre>
+
+
+
+
<h3 id="section-SDLSystemRequest">
SDLSystemRequest
</h3>
@@ -6184,7 +6620,7 @@ change the settings of a specific remote control module.</p>
<p>Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).</p>
-<p>In SDL, words, and therefore sentences, can be built up from phonemes and are used to explicitly provide the proper pronounciation to the TTS engine. For example, to have SDL pronounce the word &ldquo;read&rdquo; as &ldquo;red&rdquo;, rather than as when it is pronounced like &ldquo;reed&rdquo;, the developer would use phonemes to express this desired pronounciation.</p>
+<p>In SDL, words, and therefore sentences, can be built up from phonemes and are used to explicitly provide the proper pronunciation to the TTS engine. For example, to have SDL pronounce the word &ldquo;read&rdquo; as &ldquo;red&rdquo;, rather than as when it is pronounced like &ldquo;reed&rdquo;, the developer would use phonemes to express this desired pronunciation.</p>
<p>For more information about phonemes, see <a href="http://en.wikipedia.org/wiki/Phoneme"><a href="http://en.wikipedia.org/wiki/Phoneme">http://en.wikipedia.org/wiki/Phoneme</a></a>.</p>
@@ -6779,6 +7215,53 @@ See SDLSubscribeButton</p>
+ <h3 id="section-SDLVideoStreamingRange">
+ SDLVideoStreamingRange
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLVideoStreamingRange.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLVideoStreamingRange</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span>
+
+<span class="c1">// The minimum supported normalized aspect ratio, Min value is 1</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">assign</span><span class="p">)</span> <span class="kt">float</span> <span class="n">minimumAspectRatio</span><span class="p">;</span>
+
+<span class="c1">// The maximum supported normalized aspect ratio, Min value is 1</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">assign</span><span class="p">)</span> <span class="kt">float</span> <span class="n">maximumAspectRatio</span><span class="p">;</span>
+
+<span class="c1">// The minimum supported diagonal screen size in inches, defaults to 0 (0 matches any size)</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">assign</span><span class="p">)</span> <span class="kt">float</span> <span class="n">minimumDiagonal</span><span class="p">;</span>
+
+<span class="c1">// The minimum resolution to support, it overrides .minimumAspectRatio</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="n">minimumResolution</span><span class="p">;</span>
+
+<span class="c1">// The maximum resolution to support, it overrides .maximumAspectRatio</span>
+<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="n">maximumResolution</span><span class="p">;</span>
+
+<span class="c1">// Check if the argument is within the [.minimumResolution, .maximumResolution] range</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isImageResolutionInRange</span><span class="p">:(</span><span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">imageResolution</span><span class="p">;</span>
+
+<span class="c1">// Check if the argument is within the [.minimumAspectRatio, .maximumAspectRatio] range</span>
+<span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isAspectRatioInRange</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">aspectRatio</span><span class="p">;</span>
+
+<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMinimumResolution</span><span class="p">:(</span><span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">minResolution</span> <span class="nf">maximumResolution</span><span class="p">:(</span><span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">maxResolution</span><span class="p">;</span>
+
+<span class="c1">// A convenience method to create a disabled range with the min and max resolutions equal to zero</span>
+<span class="k">+</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">disabled</span><span class="p">;</span>
+
+<span class="k">@end</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLVideoStreamingRange</span> <span class="p">:</span> <span class="kt">NSObject</span><span class="p">,</span> <span class="kt">NSCopying</span></code></pre>
+
+
+
+
<h3 id="section-SDLVoiceCommand">
SDLVoiceCommand
</h3>
diff --git a/docs/Classes/SDLAddCommand.html b/docs/Classes/SDLAddCommand.html
index d5eb2145a..010d7aeae 100644
--- a/docs/Classes/SDLAddCommand.html
+++ b/docs/Classes/SDLAddCommand.html
@@ -8,11 +8,14 @@
<li><a href="#section--initWithId:vrCommands:menuName:handler:">-initWithId:vrCommands:menuName:handler:</a></li>
<li><a href="#section--initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:">-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:</a></li>
<li><a href="#section--initWithId:vrCommands:menuName:parentId:position:icon:handler:">-initWithId:vrCommands:menuName:parentId:position:icon:handler:</a></li>
+ <li><a href="#section--initWithCmdID:">-initWithCmdID:</a></li>
+ <li><a href="#section--initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:">-initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:</a></li>
<li><a href="#section-handler">handler</a></li>
<li><a href="#section-cmdID">cmdID</a></li>
<li><a href="#section-menuParams">menuParams</a></li>
<li><a href="#section-vrCommands">vrCommands</a></li>
<li><a href="#section-cmdIcon">cmdIcon</a></li>
+ <li><a href="#section-secondaryImage">secondaryImage</a></li>
</ul>
<h3>Overview</h3>
@@ -34,7 +37,7 @@
<li>Choices having both SDLMenuParams and VR synonym definitions</li>
</ol>
-<p>HMILevel needs to be FULL, LIMITED or BACKGROUD
+<p>HMILevel needs to be FULL, LIMITED or BACKGROUND
@since SDL 1.0</p>
<div class="aside aside-see">
<p class="aside-title">See</p>
@@ -253,6 +256,70 @@
<p>A SDLAddCommand object</p>
</div>
+ <h3 id="section--initWithCmdID:">
+ -initWithCmdID:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithCmdID</span><span class="p">:(</span><span class="n">UInt32</span><span class="p">)</span><span class="nv">cmdID</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">cmdID</span><span class="p">:</span> <span class="kt">UInt32</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>cmdID</dt>
+ <dd><p>- @(cmdID)</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLAddCommand object</p>
+ </div>
+
+ <h3 id="section--initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:">
+ -initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithCmdID</span><span class="p">:(</span><span class="n">UInt32</span><span class="p">)</span><span class="nv">cmdID</span>
+ <span class="nf">menuParams</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLMenuParams.html">SDLMenuParams</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">menuParams</span>
+ <span class="nf">vrCommands</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">vrCommands</span>
+ <span class="nf">cmdIcon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">cmdIcon</span>
+ <span class="nf">secondaryImage</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryImage</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">cmdID</span><span class="p">:</span> <span class="kt">UInt32</span><span class="p">,</span> <span class="nv">menuParams</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLMenuParams.html">SDLMenuParams</a></span><span class="p">?,</span> <span class="nv">vrCommands</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">cmdIcon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?,</span> <span class="nv">secondaryImage</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>cmdID</dt>
+ <dd><p>- @(cmdID)</p></dd>
+ <dt>menuParams</dt>
+ <dd><p>- menuParams</p></dd>
+ <dt>vrCommands</dt>
+ <dd><p>- vrCommands</p></dd>
+ <dt>cmdIcon</dt>
+ <dd><p>- cmdIcon</p></dd>
+ <dt>secondaryImage</dt>
+ <dd><p>- secondaryImage</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLAddCommand object</p>
+ </div>
+
<h3 id="section-handler">
handler
</h3>
@@ -364,4 +431,24 @@
+ <h3 id="section-secondaryImage">
+ secondaryImage
+ </h3>
+
+ <p>Optional secondary image struct for menu cell</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="n">secondaryImage</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryImage</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLAddSubMenu.html b/docs/Classes/SDLAddSubMenu.html
index 0e96e364a..d30818ca0 100644
--- a/docs/Classes/SDLAddSubMenu.html
+++ b/docs/Classes/SDLAddSubMenu.html
@@ -5,12 +5,16 @@
<ul>
<li><a href="#section--initWithMenuID:menuName:">-initWithMenuID:menuName:</a></li>
<li><a href="#section--initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:">-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:</a></li>
+ <li><a href="#section--initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:">-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:</a></li>
<li><a href="#section-menuID">menuID</a></li>
<li><a href="#section-position">position</a></li>
<li><a href="#section-menuName">menuName</a></li>
<li><a href="#section-menuIcon">menuIcon</a></li>
<li><a href="#section-menuLayout">menuLayout</a></li>
<li><a href="#section-parentID">parentID</a></li>
+ <li><a href="#section-secondaryText">secondaryText</a></li>
+ <li><a href="#section-tertiaryText">tertiaryText</a></li>
+ <li><a href="#section-secondaryImage">secondaryImage</a></li>
</ul>
<h3>Overview</h3>
@@ -21,7 +25,7 @@
added to a SDLSubMenu), and may only contain commands as children
<p>
<p>
- <b>HMILevel needs to be FULL, LIMITED or BACKGROUD</b>
+ <b>HMILevel needs to be FULL, LIMITED or BACKGROUND</b>
</p></p>
<p>Since <b>SmartDeviceLink 1.0</b><br>
@@ -99,6 +103,56 @@
<p>A SDLAddSubMenu object</p>
</div>
+ <h3 id="section--initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:">
+ -initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMenuID</span><span class="p">:(</span><span class="n">UInt32</span><span class="p">)</span><span class="nv">menuID</span>
+ <span class="nf">menuName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">menuName</span>
+ <span class="nf">position</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">position</span>
+ <span class="nf">menuIcon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">menuIcon</span>
+ <span class="nf">menuLayout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout">SDLMenuLayout</a></span><span class="p">)</span><span class="nv">menuLayout</span>
+ <span class="nf">parentID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">parentID</span>
+ <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span>
+ <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span>
+ <span class="nf">secondaryImage</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryImage</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">menuID</span><span class="p">:</span> <span class="kt">UInt32</span><span class="p">,</span> <span class="nv">menuName</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">position</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">menuIcon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?,</span> <span class="nv">menuLayout</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout">SDLMenuLayout</a></span><span class="p">?,</span> <span class="nv">parentID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">secondaryImage</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>menuID</dt>
+ <dd><p>- @(menuID)</p></dd>
+ <dt>menuName</dt>
+ <dd><p>- menuName</p></dd>
+ <dt>position</dt>
+ <dd><p>- position</p></dd>
+ <dt>menuIcon</dt>
+ <dd><p>- menuIcon</p></dd>
+ <dt>menuLayout</dt>
+ <dd><p>- menuLayout</p></dd>
+ <dt>parentID</dt>
+ <dd><p>- parentID</p></dd>
+ <dt>secondaryText</dt>
+ <dd><p>- secondaryText</p></dd>
+ <dt>tertiaryText</dt>
+ <dd><p>- tertiaryText</p></dd>
+ <dt>secondaryImage</dt>
+ <dd><p>- secondaryImage</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLAddSubMenu object</p>
+ </div>
+
<h3 id="section-menuID">
menuID
</h3>
@@ -229,4 +283,66 @@
+ <h3 id="section-secondaryText">
+ secondaryText
+ </h3>
+
+ <p>Optional secondary text to display
+ {&ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 500}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">secondaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-tertiaryText">
+ tertiaryText
+ </h3>
+
+ <p>Optional tertiary text to display
+ {&ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 500}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">tertiaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-secondaryImage">
+ secondaryImage
+ </h3>
+
+ <p>Optional secondary image struct for sub-menu cell</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="n">secondaryImage</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryImage</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLAlertAudioData.html b/docs/Classes/SDLAlertAudioData.html
new file mode 100644
index 000000000..d80b7c2ad
--- /dev/null
+++ b/docs/Classes/SDLAlertAudioData.html
@@ -0,0 +1,49 @@
+<h1>SDLAlertAudioData Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-playTone">playTone</a></li>
+ <li><a href="#section--init">-init</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-playTone">
+ playTone
+ </h3>
+
+ <p>Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">playTone</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">playTone</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span></code></pre>
+
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLAlertManeuver.html b/docs/Classes/SDLAlertManeuver.html
index d3535b883..d9c9ad70e 100644
--- a/docs/Classes/SDLAlertManeuver.html
+++ b/docs/Classes/SDLAlertManeuver.html
@@ -41,7 +41,7 @@
<dt>ttsText</dt>
<dd><p>The text to speak</p></dd>
<dt>softButtons</dt>
- <dd><p>An arry of soft buttons</p></dd>
+ <dd><p>An array of soft buttons</p></dd>
</dl>
<div>
<h4>Return Value</h4>
@@ -72,7 +72,7 @@
<dt>ttsChunks</dt>
<dd><p>An array of text chunks</p></dd>
<dt>softButtons</dt>
- <dd><p>An arry of soft buttons</p></dd>
+ <dd><p>An array of soft buttons</p></dd>
</dl>
<div>
<h4>Return Value</h4>
@@ -108,7 +108,7 @@
softButtons
</h3>
- <p>An arry of soft buttons. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton shall be displayed.</p>
+ <p>An array of soft buttons. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton shall be displayed.</p>
<p>Optional, Array of SDLSoftButton, Array length 0 - 3</p>
<div class="aside aside-see">
diff --git a/docs/Classes/SDLAlertView.html b/docs/Classes/SDLAlertView.html
new file mode 100644
index 000000000..3ce1d7e9d
--- /dev/null
+++ b/docs/Classes/SDLAlertView.html
@@ -0,0 +1,299 @@
+<h1>SDLAlertView Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-defaultTimeout">defaultTimeout</a></li>
+ <li><a href="#section-text">text</a></li>
+ <li><a href="#section-secondaryText">secondaryText</a></li>
+ <li><a href="#section-tertiaryText">tertiaryText</a></li>
+ <li><a href="#section-timeout">timeout</a></li>
+ <li><a href="#section-audio">audio</a></li>
+ <li><a href="#section-showWaitIndicator">showWaitIndicator</a></li>
+ <li><a href="#section-softButtons">softButtons</a></li>
+ <li><a href="#section-icon">icon</a></li>
+ <li><a href="#section--init">-init</a></li>
+ <li><a href="#section--initWithText:buttons:">-initWithText:buttons:</a></li>
+ <li><a href="#section--initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:">-initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:</a></li>
+ <li><a href="#section--cancel">-cancel</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-defaultTimeout">
+ defaultTimeout
+ </h3>
+
+ <p>Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href="../Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout">timeout</a></code> for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.
+Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">class</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSTimeInterval</span> <span class="n">defaultTimeout</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="k">var</span> <span class="nv">defaultTimeout</span><span class="p">:</span> <span class="kt">TimeInterval</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-text">
+ text
+ </h3>
+
+ <p>The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">text</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">text</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-secondaryText">
+ secondaryText
+ </h3>
+
+ <p>The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">secondaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-tertiaryText">
+ tertiaryText
+ </h3>
+
+ <p>The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">tertiaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-timeout">
+ timeout
+ </h3>
+
+ <p>Timeout in seconds. Defaults to 0, which will use <code><a href="../Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.
+Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSTimeInterval</span> <span class="n">timeout</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">timeout</span><span class="p">:</span> <span class="kt">TimeInterval</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-audio">
+ audio
+ </h3>
+
+ <p>Text spoken, file(s) played, and/or tone played when the alert appears</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span> <span class="o">*</span><span class="n">audio</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">audio</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-showWaitIndicator">
+ showWaitIndicator
+ </h3>
+
+ <p>If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">showWaitIndicator</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">showWaitIndicator</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-softButtons">
+ softButtons
+ </h3>
+
+ <p>Soft buttons the user may select to perform actions. Only one <code><a href="../Classes/SDLSoftButtonState.html">SDLSoftButtonState</a></code> per object is supported; if any soft button object contains multiple states, an exception will be thrown.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">softButtons</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">softButtons</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-icon">
+ icon
+ </h3>
+
+ <p>An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="n">icon</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">icon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_DESIGNATED_INITIALIZER</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">()</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithText:buttons:">
+ -initWithText:buttons:
+ </h3>
+
+ <p>Initialize a basic alert with a message and buttons</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithText</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">text</span>
+ <span class="nf">buttons</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)softButtons">softButtons</a></span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">convenience</span> <span class="nf">init</span><span class="p">(</span><span class="nv">text</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="n">buttons</span> <span class="nv">softButtons</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span><span class="p">])</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>text</dt>
+ <dd><p>The primary line of text for display on the alert</p></dd>
+ <dt>softButtons</dt>
+ <dd><p>Soft buttons the user may select to perform actions</p></dd>
+ </dl>
+
+ <h3 id="section--initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:">
+ -initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:
+ </h3>
+
+ <p>Initialize a alert with a text, image, buttons and sound</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">text</span>
+ <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span>
+ <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span>
+ <span class="nf">timeout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">timeout</span>
+ <span class="nf">showWaitIndicator</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">showWaitIndicator</span>
+ <span class="nf">audioIndication</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">audio</span>
+ <span class="nf">buttons</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">softButtons</span>
+ <span class="nf">icon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">icon</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">convenience</span> <span class="nf">init</span><span class="p">(</span><span class="nv">text</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">timeout</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">showWaitIndicator</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="n">audioIndication</span> <span class="nv">audio</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span><span class="p">?,</span> <span class="n">buttons</span> <span class="nv">softButtons</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span><span class="p">]?,</span> <span class="nv">icon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>text</dt>
+ <dd><p>The primary line of text for display on the alert</p></dd>
+ <dt>secondaryText</dt>
+ <dd><p>The secondary line of text for display on the alert</p></dd>
+ <dt>tertiaryText</dt>
+ <dd><p>The tertiary line of text for display on the alert</p></dd>
+ <dt>timeout</dt>
+ <dd><p>Timeout in seconds</p></dd>
+ <dt>showWaitIndicator</dt>
+ <dd><p>If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation</p></dd>
+ <dt>audio</dt>
+ <dd><p>Text spoken and/or tone played when the alert appears</p></dd>
+ <dt>softButtons</dt>
+ <dd><p>Soft buttons the user may select to perform actions</p></dd>
+ <dt>icon</dt>
+ <dd><p>An artwork that will be displayed when the icon appears</p></dd>
+ </dl>
+
+ <h3 id="section--cancel">
+ -cancel
+ </h3>
+
+ <p>Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">cancel</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">cancel</span><span class="p">()</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLAppCapability.html b/docs/Classes/SDLAppCapability.html
new file mode 100644
index 000000000..0d2a20851
--- /dev/null
+++ b/docs/Classes/SDLAppCapability.html
@@ -0,0 +1,112 @@
+<h1>SDLAppCapability Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithAppCapabilityType:">-initWithAppCapabilityType:</a></li>
+ <li><a href="#section--initWithAppCapabilityType:videoStreamingCapability:">-initWithAppCapabilityType:videoStreamingCapability:</a></li>
+ <li><a href="#section-appCapabilityType">appCapabilityType</a></li>
+ <li><a href="#section-videoStreamingCapability">videoStreamingCapability</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithAppCapabilityType:">
+ -initWithAppCapabilityType:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithAppCapabilityType</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span><span class="p">)</span><span class="nv">appCapabilityType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">appCapabilityType</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>appCapabilityType</dt>
+ <dd><p>- appCapabilityType</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLAppCapability object</p>
+ </div>
+
+ <h3 id="section--initWithAppCapabilityType:videoStreamingCapability:">
+ -initWithAppCapabilityType:videoStreamingCapability:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithAppCapabilityType</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span><span class="p">)</span><span class="nv">appCapabilityType</span>
+ <span class="nf">videoStreamingCapability</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html">SDLVideoStreamingCapability</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">videoStreamingCapability</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">appCapabilityType</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span><span class="p">,</span> <span class="nv">videoStreamingCapability</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVideoStreamingCapability.html">SDLVideoStreamingCapability</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>appCapabilityType</dt>
+ <dd><p>- appCapabilityType</p></dd>
+ <dt>videoStreamingCapability</dt>
+ <dd><p>- videoStreamingCapability</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLAppCapability object</p>
+ </div>
+
+ <h3 id="section-appCapabilityType">
+ appCapabilityType
+ </h3>
+
+ <p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other param included.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span> <span class="n">_Nonnull</span> <span class="n">appCapabilityType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">appCapabilityType</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-videoStreamingCapability">
+ videoStreamingCapability
+ </h3>
+
+ <p>Describes supported capabilities for video streaming</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html">SDLVideoStreamingCapability</a></span> <span class="o">*</span><span class="n">videoStreamingCapability</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">videoStreamingCapability</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVideoStreamingCapability.html">SDLVideoStreamingCapability</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLAudioData.html b/docs/Classes/SDLAudioData.html
new file mode 100644
index 000000000..ebc9fba1d
--- /dev/null
+++ b/docs/Classes/SDLAudioData.html
@@ -0,0 +1,206 @@
+<h1>SDLAudioData Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-audioData">audioData</a></li>
+ <li><a href="#section--initWithAudioFile:">-initWithAudioFile:</a></li>
+ <li><a href="#section--initWithSpeechSynthesizerString:">-initWithSpeechSynthesizerString:</a></li>
+ <li><a href="#section--initWithPhoneticSpeechSynthesizerString:phoneticType:">-initWithPhoneticSpeechSynthesizerString:phoneticType:</a></li>
+ <li><a href="#section--init">-init</a></li>
+ <li><a href="#section--addAudioFiles:">-addAudioFiles:</a></li>
+ <li><a href="#section--addSpeechSynthesizerStrings:">-addSpeechSynthesizerStrings:</a></li>
+ <li><a href="#section--addPhoneticSpeechSynthesizerStrings:phoneticType:">-addPhoneticSpeechSynthesizerStrings:phoneticType:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-audioData">
+ audioData
+ </h3>
+
+ <p>The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLTTSChunk.html">SDLTTSChunk</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">audioData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">audioData</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLTTSChunk.html">SDLTTSChunk</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithAudioFile:">
+ -initWithAudioFile:
+ </h3>
+
+ <p>Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.
+@discussion Only available on systems supporting RPC Spec v5.0+</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithAudioFile</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLFile.html">SDLFile</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">audioFile</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">audioFile</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>audioFile</dt>
+ <dd><p>The audio file to be played by the system</p></dd>
+ </dl>
+
+ <h3 id="section--initWithSpeechSynthesizerString:">
+ -initWithSpeechSynthesizerString:
+ </h3>
+
+ <p>Initialize with a string to be spoken by the system speech synthesizer.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithSpeechSynthesizerString</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">spokenString</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="n">speechSynthesizerString</span> <span class="nv">spokenString</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>spokenString</dt>
+ <dd><p>The string to be spoken by the system speech synthesizer</p></dd>
+ </dl>
+
+ <h3 id="section--initWithPhoneticSpeechSynthesizerString:phoneticType:">
+ -initWithPhoneticSpeechSynthesizerString:phoneticType:
+ </h3>
+
+ <p>Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithPhoneticSpeechSynthesizerString</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">phoneticString</span>
+ <span class="nf">phoneticType</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span><span class="nv">phoneticType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="n">phoneticSpeechSynthesizerString</span> <span class="nv">phoneticString</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">phoneticType</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>phoneticString</dt>
+ <dd><p>The string to be spoken by the system speech synthesizer</p></dd>
+ <dt>phoneticType</dt>
+ <dd><p>Must be one of <code>SAPI_PHONEMES</code>, <code>LHPLUS_PHONEMES</code>, <code>TEXT</code>, or <code>PRE_RECORDED</code> or no object will be created</p></dd>
+ </dl>
+
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section--addAudioFiles:">
+ -addAudioFiles:
+ </h3>
+
+ <p>Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addAudioFiles</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLFile.html">SDLFile</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">audioFiles</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">addAudioFiles</span><span class="p">(</span><span class="n">_</span> <span class="nv">audioFiles</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">])</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>audioFiles</dt>
+ <dd><p>An array of audio file to be played by the system</p></dd>
+ </dl>
+
+ <h3 id="section--addSpeechSynthesizerStrings:">
+ -addSpeechSynthesizerStrings:
+ </h3>
+
+ <p>Create additional strings to be spoken by the system speech synthesizer.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addSpeechSynthesizerStrings</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">spokenStrings</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">addSpeechSynthesizerStrings</span><span class="p">(</span><span class="n">_</span> <span class="nv">spokenStrings</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">])</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>spokenStrings</dt>
+ <dd><p>The strings to be spoken by the system speech synthesizer</p></dd>
+ </dl>
+
+ <h3 id="section--addPhoneticSpeechSynthesizerStrings:phoneticType:">
+ -addPhoneticSpeechSynthesizerStrings:phoneticType:
+ </h3>
+
+ <p>Create additional strings to be spoken by the system speech synthesizer using a phonetic string.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addPhoneticSpeechSynthesizerStrings</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">phoneticStrings</span>
+ <span class="nf">phoneticType</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span><span class="nv">phoneticType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">addPhoneticSpeechSynthesizerStrings</span><span class="p">(</span><span class="n">_</span> <span class="nv">phoneticStrings</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">],</span> <span class="nv">phoneticType</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>phoneticStrings</dt>
+ <dd><p>The strings to be spoken by the system speech synthesizer</p></dd>
+ <dt>phoneticType</dt>
+ <dd><p>Must be one of <code>SAPI_PHONEMES</code>, <code>LHPLUS_PHONEMES</code>, <code>TEXT</code>, or <code>PRE_RECORDED</code> or no object will be created</p></dd>
+ </dl>
+
+</section>
diff --git a/docs/Classes/SDLAudioFile.html b/docs/Classes/SDLAudioFile.html
index 9218be08b..bba97ba14 100644
--- a/docs/Classes/SDLAudioFile.html
+++ b/docs/Classes/SDLAudioFile.html
@@ -14,7 +14,7 @@
<h3>Overview</h3>
-<p>Includes inforamtion about a given audio file</p>
+<p>Includes information about a given audio file</p>
<section class="section task-group-section">
diff --git a/docs/Classes/SDLBodyInformation.html b/docs/Classes/SDLBodyInformation.html
index 6c566088c..c8c57d92d 100644
--- a/docs/Classes/SDLBodyInformation.html
+++ b/docs/Classes/SDLBodyInformation.html
@@ -3,6 +3,8 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section--initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:">-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:</a></li>
+ <li><a href="#section--initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:">-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:</a></li>
<li><a href="#section-parkBrakeActive">parkBrakeActive</a></li>
<li><a href="#section-ignitionStableStatus">ignitionStableStatus</a></li>
<li><a href="#section-ignitionStatus">ignitionStatus</a></li>
@@ -10,14 +12,94 @@
<li><a href="#section-passengerDoorAjar">passengerDoorAjar</a></li>
<li><a href="#section-rearLeftDoorAjar">rearLeftDoorAjar</a></li>
<li><a href="#section-rearRightDoorAjar">rearRightDoorAjar</a></li>
+ <li><a href="#section-doorStatuses">doorStatuses</a></li>
+ <li><a href="#section-gateStatuses">gateStatuses</a></li>
+ <li><a href="#section-roofStatuses">roofStatuses</a></li>
</ul>
<h3>Overview</h3>
-<p>The body information including power modes.</p>
+<p>Undocumented</p>
<section class="section task-group-section">
+ <h3 id="section--initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:">
+ -initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithParkBrakeActive</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">parkBrakeActive</span>
+ <span class="nf">ignitionStableStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus">SDLIgnitionStableStatus</a></span><span class="p">)</span><span class="nv">ignitionStableStatus</span>
+ <span class="nf">ignitionStatus</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus">SDLIgnitionStatus</a></span><span class="p">)</span><span class="nv">ignitionStatus</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">parkBrakeActive</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span> <span class="nv">ignitionStableStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus">SDLIgnitionStableStatus</a></span><span class="p">,</span> <span class="nv">ignitionStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus">SDLIgnitionStatus</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>parkBrakeActive</dt>
+ <dd><p>- @(parkBrakeActive)</p></dd>
+ <dt>ignitionStableStatus</dt>
+ <dd><p>- ignitionStableStatus</p></dd>
+ <dt>ignitionStatus</dt>
+ <dd><p>- ignitionStatus</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLBodyInformation object</p>
+ </div>
+
+ <h3 id="section--initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:">
+ -initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithParkBrakeActive</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">parkBrakeActive</span>
+ <span class="nf">ignitionStableStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus">SDLIgnitionStableStatus</a></span><span class="p">)</span><span class="nv">ignitionStableStatus</span>
+ <span class="nf">ignitionStatus</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus">SDLIgnitionStatus</a></span><span class="p">)</span><span class="nv">ignitionStatus</span>
+ <span class="nf">doorStatuses</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLDoorStatus.html">SDLDoorStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">doorStatuses</span>
+ <span class="nf">gateStatuses</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLGateStatus.html">SDLGateStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gateStatuses</span>
+ <span class="nf">roofStatuses</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLRoofStatus.html">SDLRoofStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">roofStatuses</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">parkBrakeActive</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span> <span class="nv">ignitionStableStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus">SDLIgnitionStableStatus</a></span><span class="p">,</span> <span class="nv">ignitionStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus">SDLIgnitionStatus</a></span><span class="p">,</span> <span class="nv">doorStatuses</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLDoorStatus.html">SDLDoorStatus</a></span><span class="p">]?,</span> <span class="nv">gateStatuses</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLGateStatus.html">SDLGateStatus</a></span><span class="p">]?,</span> <span class="nv">roofStatuses</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLRoofStatus.html">SDLRoofStatus</a></span><span class="p">]?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>parkBrakeActive</dt>
+ <dd><p>- @(parkBrakeActive)</p></dd>
+ <dt>ignitionStableStatus</dt>
+ <dd><p>- ignitionStableStatus</p></dd>
+ <dt>ignitionStatus</dt>
+ <dd><p>- ignitionStatus</p></dd>
+ <dt>doorStatuses</dt>
+ <dd><p>- doorStatuses</p></dd>
+ <dt>gateStatuses</dt>
+ <dd><p>- gateStatuses</p></dd>
+ <dt>roofStatuses</dt>
+ <dd><p>- roofStatuses</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLBodyInformation object</p>
+ </div>
+
<h3 id="section-parkBrakeActive">
parkBrakeActive
</h3>
@@ -91,12 +173,10 @@
driverDoorAjar
</h3>
-
-<ul>
-<li>References signal &ldquo;DrStatDrv_B_Actl&rdquo;.</li>
-</ul>
+ <p>References signal &ldquo;DrStatDrv_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -114,12 +194,10 @@
passengerDoorAjar
</h3>
-
-<ul>
-<li>References signal &ldquo;DrStatPsngr_B_Actl&rdquo;.</li>
-</ul>
+ <p>References signal &ldquo;DrStatPsngr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -137,12 +215,10 @@
rearLeftDoorAjar
</h3>
-
-<ul>
-<li>References signal &ldquo;DrStatRl_B_Actl&rdquo;.</li>
-</ul>
+ <p>References signal &ldquo;DrStatRl_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -160,12 +236,10 @@
rearRightDoorAjar
</h3>
-
-<ul>
-<li>References signal &ldquo;DrStatRr_B_Actl&rdquo;.</li>
-</ul>
+ <p>References signal &ldquo;DrStatRr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -179,4 +253,67 @@
+ <h3 id="section-doorStatuses">
+ doorStatuses
+ </h3>
+
+ <p>Provides status for doors if Ajar/Closed/Locked
+ {&ldquo;array_min_size&rdquo;: 0, &ldquo;array_max_size&rdquo;: 100}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLDoorStatus.html">SDLDoorStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">doorStatuses</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">doorStatuses</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLDoorStatus.html">SDLDoorStatus</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-gateStatuses">
+ gateStatuses
+ </h3>
+
+ <p>Provides status for trunk/hood/etc. if Ajar/Closed/Locked
+ {&ldquo;array_min_size&rdquo;: 0, &ldquo;array_max_size&rdquo;: 100}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLGateStatus.html">SDLGateStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">gateStatuses</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">gateStatuses</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLGateStatus.html">SDLGateStatus</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-roofStatuses">
+ roofStatuses
+ </h3>
+
+ <p>Provides status for roof/convertible roof/sunroof/moonroof etc., if Closed/Ajar/Removed etc.
+ {&ldquo;array_min_size&rdquo;: 0, &ldquo;array_max_size&rdquo;: 100}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLRoofStatus.html">SDLRoofStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">roofStatuses</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">roofStatuses</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLRoofStatus.html">SDLRoofStatus</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLCancelInteraction.html b/docs/Classes/SDLCancelInteraction.html
index 51e0bce8c..013d74c0b 100644
--- a/docs/Classes/SDLCancelInteraction.html
+++ b/docs/Classes/SDLCancelInteraction.html
@@ -34,7 +34,7 @@
-initWithFunctionID:
</h3>
- <p>Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interation).</p>
+ <p>Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interaction).</p>
diff --git a/docs/Classes/SDLChoiceCell.html b/docs/Classes/SDLChoiceCell.html
index 6f912d8a7..17d9c2e26 100644
--- a/docs/Classes/SDLChoiceCell.html
+++ b/docs/Classes/SDLChoiceCell.html
@@ -9,6 +9,7 @@
<li><a href="#section-voiceCommands">voiceCommands</a></li>
<li><a href="#section-artwork">artwork</a></li>
<li><a href="#section-secondaryArtwork">secondaryArtwork</a></li>
+ <li><a href="#section-uniqueText">uniqueText</a></li>
<li><a href="#section--init">-init</a></li>
<li><a href="#section--initWithText:">-initWithText:</a></li>
<li><a href="#section--initWithText:artwork:voiceCommands:">-initWithText:artwork:voiceCommands:</a></li>
@@ -129,6 +130,24 @@
+ <h3 id="section-uniqueText">
+ uniqueText
+ </h3>
+
+ <p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href="../Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text">text</a></code> but other fields are different. This is autogenerated by the screen manager. Attempting to use cells that are exactly the same (all text and artwork fields are the same) will not cause this to be used. This will not be used when connected to modules supporting RPC 7.1+.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">readonly</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">uniqueText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">uniqueText</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section--init">
-init
</h3>
diff --git a/docs/Classes/SDLChoiceSet.html b/docs/Classes/SDLChoiceSet.html
index abf190393..22f87723e 100644
--- a/docs/Classes/SDLChoiceSet.html
+++ b/docs/Classes/SDLChoiceSet.html
@@ -14,6 +14,7 @@
<li><a href="#section-helpList">helpList</a></li>
<li><a href="#section-delegate">delegate</a></li>
<li><a href="#section-choices">choices</a></li>
+ <li><a href="#section--init">-init</a></li>
<li><a href="#section--initWithTitle:delegate:choices:">-initWithTitle:delegate:choices:</a></li>
<li><a href="#section--initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:">-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:</a></li>
<li><a href="#section--initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:">-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:</a></li>
@@ -30,7 +31,7 @@
defaultTimeout
</h3>
- <p>Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href="../Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout">timeout</a></code> for more details. If this is not set by you, it will default to 10 seconds.</p>
+ <p>Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href="../Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout">timeout</a></code> for more details. If this is not set by you, it will default to 10 seconds. The minimum is 5 seconds, the maximum is 100 seconds. If this is set below the minimum, it will be capped at 5 seconds. If this is set above the maximum, it will be capped at 100 seconds.</p>
@@ -120,7 +121,12 @@
timeout
</h3>
- <p>Maps to PerformInteraction.timeout. This applies only to a manual selection (not a voice selection, which has its timeout handled by the system). Defaults to <code><a href="../Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout">defaultTimeout</a></code>.</p>
+ <p>Maps to PerformInteraction.timeout. Timeout in seconds. Defaults to 0, which will use <code><a href="../Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 5 seconds. Minimum 5 seconds, maximum 100 seconds. If this is set above the maximum, it will be capped at 100 seconds. Defaults to 0.</p>
+<div class="aside aside-note">
+ <p class="aside-title">Note</p>
+ This applies only to a manual selection (not a voice selection, which has its timeout handled by the system).
+
+</div>
@@ -228,12 +234,38 @@
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>
+
+<p>WARNING: If you display multiple cells with the same <code>text</code> with the only uniquing property between cells being different <code>vrCommands</code> or a feature that is not displayed on the head unit (e.g. if the head unit doesn&rsquo;t display <code>secondaryArtwork</code> and that&rsquo;s the only uniquing property between two cells) then the cells may appear to be the same to the user in <code>Manual</code> mode. This only applies to RPC connections &gt;= 7.1.0.</p>
+
+<p>WARNING: On &lt; 7.1.0 connections, the <code>text</code> cell will be automatically modified among cells that have the same <code>text</code> when they are preloaded, so they will always appear differently on-screen when they are displayed. <code>cell.uniqueText</code> will be created by appending <code>(2)</code>, <code>(3)</code>, etc.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="n">init</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">()</span></code></pre>
+
+
+
+
<h3 id="section--initWithTitle:delegate:choices:">
-initWithTitle:delegate:choices:
</h3>
<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>
+<p>WARNING: If you display multiple cells with the same <code>text</code> with the only uniquing property between cells being different <code>vrCommands</code> or a feature that is not displayed on the head unit (e.g. if the head unit doesn&rsquo;t display <code>secondaryArtwork</code> and that&rsquo;s the only uniquing property between two cells) then the cells may appear to be the same to the user in <code>Manual</code> mode. This only applies to RPC connections &gt;= 7.1.0.</p>
+
+<p>WARNING: On &lt; 7.1.0 connections, the <code>text</code> cell will be automatically modified among cells that have the same <code>text</code> when they are preloaded, so they will always appear differently on-screen when they are displayed. <code>cell.uniqueText</code> will be created by appending <code>(2)</code>, <code>(3)</code>, etc.</p>
+
<h4>Objective-C</h4>
@@ -265,6 +297,10 @@
<p>Initializer with all possible properties.</p>
+<p>WARNING: If you display multiple cells with the same <code>text</code> with the only uniquing property between cells being different <code>vrCommands</code> or a feature that is not displayed on the head unit (e.g. if the head unit doesn&rsquo;t display <code>secondaryArtwork</code> and that&rsquo;s the only uniquing property between two cells) then the cells may appear to be the same to the user in <code>Manual</code> mode. This only applies to RPC connections &gt;= 7.1.0.</p>
+
+<p>WARNING: On &lt; 7.1.0 connections, the <code>text</code> cell will be automatically modified among cells that have the same <code>text</code> when they are preloaded, so they will always appear differently on-screen when they are displayed. <code>cell.uniqueText</code> will be created by appending <code>(2)</code>, <code>(3)</code>, etc.</p>
+
<h4>Objective-C</h4>
@@ -291,7 +327,7 @@
<dt>layout</dt>
<dd><p>The layout of choice options (Manual/touch only)</p></dd>
<dt>timeout</dt>
- <dd><p>The timeout of a touch interaction (Manual/touch only)</p></dd>
+ <dd><p>The timeout of a touch interaction in seconds (Manual/touch only)</p></dd>
<dt>initialPrompt</dt>
<dd><p>A voice prompt spoken to the user when this set is displayed</p></dd>
<dt>timeoutPrompt</dt>
@@ -314,6 +350,10 @@
<p>Initializer with all possible properties.</p>
+<p>WARNING: If you display multiple cells with the same <code>text</code> with the only uniquing property between cells being different <code>vrCommands</code> or a feature that is not displayed on the head unit (e.g. if the head unit doesn&rsquo;t display <code>secondaryArtwork</code> and that&rsquo;s the only uniquing property between two cells) then the cells may appear to be the same to the user in <code>Manual</code> mode. This only applies to RPC connections &gt;= 7.1.0.</p>
+
+<p>WARNING: On &lt; 7.1.0 connections, the <code>text</code> cell will be automatically modified among cells that have the same <code>text</code> when they are preloaded, so they will always appear differently on-screen when they are displayed. <code>cell.uniqueText</code> will be created by appending <code>(2)</code>, <code>(3)</code>, etc.</p>
+
<h4>Objective-C</h4>
@@ -340,7 +380,7 @@
<dt>layout</dt>
<dd><p>The layout of choice options (Manual/touch only)</p></dd>
<dt>timeout</dt>
- <dd><p>The timeout of a touch interaction (Manual/touch only)</p></dd>
+ <dd><p>The timeout of a touch interaction in seconds (Manual/touch only)</p></dd>
<dt>initialPrompt</dt>
<dd><p>A voice prompt spoken to the user when this set is displayed</p></dd>
<dt>timeoutPrompt</dt>
diff --git a/docs/Classes/SDLClimateControlCapabilities.html b/docs/Classes/SDLClimateControlCapabilities.html
index befb66ed0..08e260294 100644
--- a/docs/Classes/SDLClimateControlCapabilities.html
+++ b/docs/Classes/SDLClimateControlCapabilities.html
@@ -34,7 +34,7 @@
-initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:
</h3>
- <p>Convenience init to describe the climate control capabilities with all properities.</p>
+ <p>Convenience init to describe the climate control capabilities with all properties.</p>
diff --git a/docs/Classes/SDLClimateData.html b/docs/Classes/SDLClimateData.html
new file mode 100644
index 000000000..4cf24b4cf
--- /dev/null
+++ b/docs/Classes/SDLClimateData.html
@@ -0,0 +1,107 @@
+<h1>SDLClimateData Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithExternalTemperature:cabinTemperature:atmosphericPressure:">-initWithExternalTemperature:cabinTemperature:atmosphericPressure:</a></li>
+ <li><a href="#section-externalTemperature">externalTemperature</a></li>
+ <li><a href="#section-cabinTemperature">cabinTemperature</a></li>
+ <li><a href="#section-atmosphericPressure">atmosphericPressure</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithExternalTemperature:cabinTemperature:atmosphericPressure:">
+ -initWithExternalTemperature:cabinTemperature:atmosphericPressure:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithExternalTemperature</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">externalTemperature</span>
+ <span class="nf">cabinTemperature</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">cabinTemperature</span>
+ <span class="nf">atmosphericPressure</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">atmosphericPressure</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">externalTemperature</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span><span class="p">?,</span> <span class="nv">cabinTemperature</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span><span class="p">?,</span> <span class="nv">atmosphericPressure</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>externalTemperature</dt>
+ <dd><p>- externalTemperature</p></dd>
+ <dt>cabinTemperature</dt>
+ <dd><p>- cabinTemperature</p></dd>
+ <dt>atmosphericPressure</dt>
+ <dd><p>- atmosphericPressure</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLClimateData object</p>
+ </div>
+
+ <h3 id="section-externalTemperature">
+ externalTemperature
+ </h3>
+
+ <p>The external temperature in degrees celsius</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span> <span class="o">*</span><span class="n">externalTemperature</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">externalTemperature</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-cabinTemperature">
+ cabinTemperature
+ </h3>
+
+ <p>Internal ambient cabin temperature in degrees celsius</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span> <span class="o">*</span><span class="n">cabinTemperature</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">cabinTemperature</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemperature.html">SDLTemperature</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-atmosphericPressure">
+ atmosphericPressure
+ </h3>
+
+ <p>Current atmospheric pressure in mBar
+{&ldquo;num_min_value&rdquo;: 0.0, &ldquo;num_max_value&rdquo;: 2000.0}</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">atmosphericPressure</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">atmosphericPressure</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLConfiguration.html b/docs/Classes/SDLConfiguration.html
index 9b8fe6575..36c99b251 100644
--- a/docs/Classes/SDLConfiguration.html
+++ b/docs/Classes/SDLConfiguration.html
@@ -15,7 +15,7 @@
<h3>Overview</h3>
-<p>Contains information about the app&rsquo;s configurtion, such as lifecycle, lockscreen, encryption, etc.</p>
+<p>Contains information about the app&rsquo;s configuration, such as lifecycle, lockscreen, encryption, etc.</p>
<section class="section task-group-section">
diff --git a/docs/Classes/SDLDisplayCapability.html b/docs/Classes/SDLDisplayCapability.html
index 4d1723920..cd09d6e8e 100644
--- a/docs/Classes/SDLDisplayCapability.html
+++ b/docs/Classes/SDLDisplayCapability.html
@@ -45,7 +45,7 @@
-initWithDisplayName:windowCapabilities:windowTypeSupported:
</h3>
- <p>Init with all the properities</p>
+ <p>Init with all the properties</p>
@@ -122,7 +122,7 @@ Max size 100</p>
<ol>
<li>App creates a new window. After the window is created, a system capability notification will be sent related only to the created window.</li>
-<li>App sets a new template to the window. The new template changes window capabilties. The notification will reflect those changes to the single window.</li>
+<li>App sets a new template to the window. The new template changes window capabilities. The notification will reflect those changes to the single window.</li>
</ol>
<p>Min size 1, Max size 1000</p>
diff --git a/docs/Classes/SDLDoorStatus.html b/docs/Classes/SDLDoorStatus.html
new file mode 100644
index 000000000..8ebbf4f26
--- /dev/null
+++ b/docs/Classes/SDLDoorStatus.html
@@ -0,0 +1,84 @@
+<h1>SDLDoorStatus Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithLocation:status:">-initWithLocation:status:</a></li>
+ <li><a href="#section-location">location</a></li>
+ <li><a href="#section-status">status</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Describes the status of a parameter of door.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithLocation:status:">
+ -initWithLocation:status:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithLocation</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">location</span>
+ <span class="nf">status</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span><span class="nv">status</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span><span class="p">,</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>location</dt>
+ <dd><p>- location</p></dd>
+ <dt>status</dt>
+ <dd><p>- status</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLDoorStatus object</p>
+ </div>
+
+ <h3 id="section-location">
+ location
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">location</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-status">
+ status
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">status</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLFileManager.html b/docs/Classes/SDLFileManager.html
index 2d2cf340f..cd49b858c 100644
--- a/docs/Classes/SDLFileManager.html
+++ b/docs/Classes/SDLFileManager.html
@@ -18,6 +18,7 @@
<li><a href="#section--uploadFile:completionHandler:">-uploadFile:completionHandler:</a></li>
<li><a href="#section--uploadFiles:progressHandler:completionHandler:">-uploadFiles:progressHandler:completionHandler:</a></li>
<li><a href="#section--uploadFiles:completionHandler:">-uploadFiles:completionHandler:</a></li>
+ <li><a href="#section--fileNeedsUpload:">-fileNeedsUpload:</a></li>
<li><a href="#section--uploadArtwork:completionHandler:">-uploadArtwork:completionHandler:</a></li>
<li><a href="#section--uploadArtworks:completionHandler:">-uploadArtworks:completionHandler:</a></li>
<li><a href="#section--uploadArtworks:progressHandler:completionHandler:">-uploadArtworks:progressHandler:completionHandler:</a></li>
@@ -356,7 +357,7 @@
-uploadFiles:completionHandler:
</h3>
- <p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>
+ <p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>
@@ -379,6 +380,37 @@
<dd><p>An optional SDLFileManagerMultiUploadCompletionHandler</p></dd>
</dl>
+ <h3 id="section--fileNeedsUpload:">
+ -fileNeedsUpload:
+ </h3>
+
+ <p>Check if an SDLFile needs to be uploaded to Core or not. This method differs from hasUploadedFile() because it takes the <code>isStaticIcon</code> and <code>overwrite</code> properties into consideration.</p>
+
+<p>For example, if the file is static icon, the method always returns false.</p>
+
+<p>If the file is dynamic, it returns true in one of these situations: 1) the file has the overwrite property set to true, 2) the file hasn&rsquo;t been uploaded to Core before.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">fileNeedsUpload</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFile.html">SDLFile</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">file</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">fileNeedsUpload</span><span class="p">(</span><span class="n">_</span> <span class="nv">file</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>file</dt>
+ <dd><p>the SDLFile that needs to be checked</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>BOOL that tells whether file needs to be uploaded to Core or not</p>
+ </div>
+
<h3 id="section--uploadArtwork:completionHandler:">
-uploadArtwork:completionHandler:
</h3>
@@ -410,7 +442,7 @@
-uploadArtworks:completionHandler:
</h3>
- <p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>
+ <p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>
@@ -437,9 +469,9 @@
-uploadArtworks:progressHandler:completionHandler:
</h3>
- <p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>
+ <p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>
-<p>The optional progress handler can be used to keep track of the upload progress. After each artwork upload, the progress handler returns the artwork name, the upload percentage and an error, if one occured during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.</p>
+<p>The optional progress handler can be used to keep track of the upload progress. After each artwork upload, the progress handler returns the artwork name, the upload percentage and an error, if one occurred during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.</p>
diff --git a/docs/Classes/SDLGateStatus.html b/docs/Classes/SDLGateStatus.html
new file mode 100644
index 000000000..98af5996f
--- /dev/null
+++ b/docs/Classes/SDLGateStatus.html
@@ -0,0 +1,84 @@
+<h1>SDLGateStatus Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithLocation:status:">-initWithLocation:status:</a></li>
+ <li><a href="#section-location">location</a></li>
+ <li><a href="#section-status">status</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Describes the status of a parameter of trunk/hood/etc.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithLocation:status:">
+ -initWithLocation:status:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithLocation</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">location</span>
+ <span class="nf">status</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span><span class="nv">status</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span><span class="p">,</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>location</dt>
+ <dd><p>- location</p></dd>
+ <dt>status</dt>
+ <dd><p>- status</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLGateStatus object</p>
+ </div>
+
+ <h3 id="section-location">
+ location
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">location</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-status">
+ status
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">status</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLGetInteriorVehicleDataConsent.html b/docs/Classes/SDLGetInteriorVehicleDataConsent.html
index 30e243295..a74ee286d 100644
--- a/docs/Classes/SDLGetInteriorVehicleDataConsent.html
+++ b/docs/Classes/SDLGetInteriorVehicleDataConsent.html
@@ -10,7 +10,7 @@
<h3>Overview</h3>
-<p>This RPC allows you to get consent to control a certian module</p>
+<p>This RPC allows you to get consent to control a certain module</p>
<p>@since RPC 6.0</p>
diff --git a/docs/Classes/SDLGetVehicleData.html b/docs/Classes/SDLGetVehicleData.html
index 072f50dcd..4c08424a5 100644
--- a/docs/Classes/SDLGetVehicleData.html
+++ b/docs/Classes/SDLGetVehicleData.html
@@ -5,6 +5,7 @@
<ul>
<li><a href="#section--initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:">-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:</a></li>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -13,6 +14,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-vin">vin</a></li>
<li><a href="#section-prndl">prndl</a></li>
@@ -41,6 +43,7 @@
<li><a href="#section-stabilityControlsStatus">stabilityControlsStatus</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -290,6 +293,126 @@
<p>A SDLGetVehicleData object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for getting data for all possible vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">vin</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">vin</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModeStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModeStatus</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">vin</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">clusterModeStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>vin</dt>
+ <dd><p>- vin</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModeStatus</dt>
+ <dd><p>- clusterModeStatus</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -436,11 +559,34 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>A boolean value. If true, requests External Temperature data.</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>
+
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -967,4 +1113,24 @@
<p>The state of an OEM custom vehicle data item for the given vehicle data name.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLGetVehicleDataResponse.html b/docs/Classes/SDLGetVehicleDataResponse.html
index 94c10c476..b1ddd41d4 100644
--- a/docs/Classes/SDLGetVehicleDataResponse.html
+++ b/docs/Classes/SDLGetVehicleDataResponse.html
@@ -4,6 +4,7 @@
<ul>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -12,6 +13,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-vin">vin</a></li>
<li><a href="#section-prndl">prndl</a></li>
@@ -40,6 +42,7 @@
<li><a href="#section-stabilityControlsStatus">stabilityControlsStatus</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -172,6 +175,131 @@
<p>A SDLGetVehicleDataResponse object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for initializing data for all possible vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLGPSData.html">SDLGPSData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLFuelRange.html">SDLFuelRange</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal">SDLTurnSignal</a></span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">vin</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">vin</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLGearStatus.html">SDLGearStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLTireStatus.html">SDLTireStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLBeltStatus.html">SDLBeltStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLBodyInformation.html">SDLBodyInformation</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLDeviceStatus.html">SDLDeviceStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus">SDLVehicleDataEventStatus</a></span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus">SDLWiperStatus</a></span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLHeadLampStatus.html">SDLHeadLampStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus">SDLElectronicParkBrakeStatus</a></span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStabilityControlsStatus.html">SDLStabilityControlsStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLECallInfo.html">SDLECallInfo</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLAirbagStatus.html">SDLAirbagStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLEmergencyEvent.html">SDLEmergencyEvent</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModeStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLClusterModeStatus.html">SDLClusterModeStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModeStatus</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLMyKey.html">SDLMyKey</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLWindowStatus.html">SDLWindowStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGPSData.html">SDLGPSData</a></span><span class="p">?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFuelRange.html">SDLFuelRange</a></span><span class="p">]?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span><span class="p">?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal">SDLTurnSignal</a></span><span class="p">?,</span> <span class="nv">vin</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGearStatus.html">SDLGearStatus</a></span><span class="p">?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTireStatus.html">SDLTireStatus</a></span><span class="p">?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLBeltStatus.html">SDLBeltStatus</a></span><span class="p">?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLBodyInformation.html">SDLBodyInformation</a></span><span class="p">?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLDeviceStatus.html">SDLDeviceStatus</a></span><span class="p">?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus">SDLVehicleDataEventStatus</a></span><span class="p">?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus">SDLWiperStatus</a></span><span class="p">?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLHeadLampStatus.html">SDLHeadLampStatus</a></span><span class="p">?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus">SDLElectronicParkBrakeStatus</a></span><span class="p">?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStabilityControlsStatus.html">SDLStabilityControlsStatus</a></span><span class="p">?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLECallInfo.html">SDLECallInfo</a></span><span class="p">?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAirbagStatus.html">SDLAirbagStatus</a></span><span class="p">?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLEmergencyEvent.html">SDLEmergencyEvent</a></span><span class="p">?,</span> <span class="nv">clusterModeStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLClusterModeStatus.html">SDLClusterModeStatus</a></span><span class="p">?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLMyKey.html">SDLMyKey</a></span><span class="p">?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLWindowStatus.html">SDLWindowStatus</a></span><span class="p">]?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>vin</dt>
+ <dd><p>- vin</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModeStatus</dt>
+ <dd><p>- clusterModeStatus</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLGetVehicleDataResponse object</p>
+ </div>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -320,11 +448,35 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>The external temperature in degrees celsius.</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ {&ldquo;num_min_value&rdquo;: -40.0, &ldquo;num_max_value&rdquo;: 100.0}</p>
+
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -852,4 +1004,24 @@
<p>An OEM custom vehicle data object for the given vehicle data name.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLImageField.html b/docs/Classes/SDLImageField.html
index d72531c2c..16bc5c522 100644
--- a/docs/Classes/SDLImageField.html
+++ b/docs/Classes/SDLImageField.html
@@ -79,7 +79,7 @@
-initWithName:imageTypeSupported:imageResolution:
</h3>
- <p>Convenience initalizer for the ImageField RPC struct</p>
+ <p>Convenience initializer for the ImageField RPC struct</p>
diff --git a/docs/Classes/SDLKeyboardCapabilities.html b/docs/Classes/SDLKeyboardCapabilities.html
new file mode 100644
index 000000000..59eea3443
--- /dev/null
+++ b/docs/Classes/SDLKeyboardCapabilities.html
@@ -0,0 +1,87 @@
+<h1>SDLKeyboardCapabilities Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithMaskInputCharactersSupported:supportedKeyboards:">-initWithMaskInputCharactersSupported:supportedKeyboards:</a></li>
+ <li><a href="#section-maskInputCharactersSupported">maskInputCharactersSupported</a></li>
+ <li><a href="#section-supportedKeyboards">supportedKeyboards</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithMaskInputCharactersSupported:supportedKeyboards:">
+ -initWithMaskInputCharactersSupported:supportedKeyboards:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithMaskInputCharactersSupported</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">maskInputCharactersSupported</span>
+ <span class="nf">supportedKeyboards</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLKeyboardLayoutCapability.html">SDLKeyboardLayoutCapability</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)supportedKeyboards">supportedKeyboards</a></span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">maskInputCharactersSupported</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">supportedKeyboards</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLKeyboardLayoutCapability.html">SDLKeyboardLayoutCapability</a></span><span class="p">]?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>maskInputCharactersSupported</dt>
+ <dd><p>- maskInputCharactersSupported</p></dd>
+ <dt>supportedKeyboards</dt>
+ <dd><p>- supportedKeyboards</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLKeyboardCapabilities object</p>
+ </div>
+
+ <h3 id="section-maskInputCharactersSupported">
+ maskInputCharactersSupported
+ </h3>
+
+ <p>Availability of capability to mask input characters using keyboard. True: Available, False: Not Available</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">maskInputCharactersSupported</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">maskInputCharactersSupported</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-supportedKeyboards">
+ supportedKeyboards
+ </h3>
+
+ <p>Capabilities of supported keyboard layouts by HMI.
+{&ldquo;array_min_size&rdquo;: 1, &ldquo;array_max_size&rdquo;: 1000}</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLKeyboardLayoutCapability.html">SDLKeyboardLayoutCapability</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">supportedKeyboards</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">supportedKeyboards</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLKeyboardLayoutCapability.html">SDLKeyboardLayoutCapability</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLKeyboardLayoutCapability.html b/docs/Classes/SDLKeyboardLayoutCapability.html
new file mode 100644
index 000000000..fc9230969
--- /dev/null
+++ b/docs/Classes/SDLKeyboardLayoutCapability.html
@@ -0,0 +1,86 @@
+<h1>SDLKeyboardLayoutCapability Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithKeyboardLayout:numConfigurableKeys:">-initWithKeyboardLayout:numConfigurableKeys:</a></li>
+ <li><a href="#section-keyboardLayout">keyboardLayout</a></li>
+ <li><a href="#section-numConfigurableKeys">numConfigurableKeys</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Describes the capabilities of a single keyboard layout.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithKeyboardLayout:numConfigurableKeys:">
+ -initWithKeyboardLayout:numConfigurableKeys:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithKeyboardLayout</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span><span class="p">)</span><span class="nv">keyboardLayout</span>
+ <span class="nf">numConfigurableKeys</span><span class="p">:(</span><span class="n">UInt8</span><span class="p">)</span><span class="nv">numConfigurableKeys</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">keyboardLayout</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span><span class="p">,</span> <span class="nv">numConfigurableKeys</span><span class="p">:</span> <span class="kt">UInt8</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>keyboardLayout</dt>
+ <dd><p>- keyboardLayout</p></dd>
+ <dt>numConfigurableKeys</dt>
+ <dd><p>- @(numConfigurableKeys)</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLKeyboardLayoutCapability object</p>
+ </div>
+
+ <h3 id="section-keyboardLayout">
+ keyboardLayout
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span> <span class="n">keyboardLayout</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">keyboardLayout</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-numConfigurableKeys">
+ numConfigurableKeys
+ </h3>
+
+ <p>Number of keys available for special characters, App can customize as per their needs.
+{&ldquo;num_min_value&rdquo;: 0, &ldquo;num_max_value&rdquo;: 10}</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">numConfigurableKeys</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">numConfigurableKeys</span><span class="p">:</span> <span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLKeyboardProperties.html b/docs/Classes/SDLKeyboardProperties.html
index b7f8f51a1..7b19a5058 100644
--- a/docs/Classes/SDLKeyboardProperties.html
+++ b/docs/Classes/SDLKeyboardProperties.html
@@ -4,12 +4,16 @@
<ul>
<li><a href="#section--initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:">-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:</a></li>
+ <li><a href="#section--initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:">-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:</a></li>
+ <li><a href="#section--initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:">-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:</a></li>
<li><a href="#section-language">language</a></li>
<li><a href="#section-keyboardLayout">keyboardLayout</a></li>
<li><a href="#section-keypressMode">keypressMode</a></li>
<li><a href="#section-limitedCharacterList">limitedCharacterList</a></li>
<li><a href="#section-autoCompleteText">autoCompleteText</a></li>
<li><a href="#section-autoCompleteList">autoCompleteList</a></li>
+ <li><a href="#section-maskInputCharacters">maskInputCharacters</a></li>
+ <li><a href="#section-customKeys">customKeys</a></li>
</ul>
<h3>Overview</h3>
@@ -61,6 +65,91 @@
<p>The RPC object</p>
</div>
+ <h3 id="section--initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:">
+ -initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:
+ </h3>
+
+ <p>Convenience init with all properties.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithLanguage</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage">SDLLanguage</a></span><span class="p">)</span><span class="nv">language</span>
+ <span class="nf">keyboardLayout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span><span class="p">)</span><span class="nv">keyboardLayout</span>
+ <span class="nf">keypressMode</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode">SDLKeypressMode</a></span><span class="p">)</span><span class="nv">keypressMode</span>
+ <span class="nf">limitedCharacterList</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">limitedCharacterList</span>
+ <span class="nf">autoCompleteList</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">autoCompleteList</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">language</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage">SDLLanguage</a></span><span class="p">?,</span> <span class="nv">keyboardLayout</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span><span class="p">?,</span> <span class="nv">keypressMode</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode">SDLKeypressMode</a></span><span class="p">?,</span> <span class="nv">limitedCharacterList</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">autoCompleteList</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>language</dt>
+ <dd><p>- language</p></dd>
+ <dt>keyboardLayout</dt>
+ <dd><p>- keyboardLayout</p></dd>
+ <dt>keypressMode</dt>
+ <dd><p>- keypressMode</p></dd>
+ <dt>limitedCharacterList</dt>
+ <dd><p>- limitedCharacterList</p></dd>
+ <dt>autoCompleteList</dt>
+ <dd><p>- autoCompleteList</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLKeyboardProperties object</p>
+ </div>
+
+ <h3 id="section--initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:">
+ -initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithLanguage</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage">SDLLanguage</a></span><span class="p">)</span><span class="nv">language</span>
+ <span class="nf">keyboardLayout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span><span class="p">)</span><span class="nv">keyboardLayout</span>
+ <span class="nf">keypressMode</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode">SDLKeypressMode</a></span><span class="p">)</span><span class="nv">keypressMode</span>
+ <span class="nf">limitedCharacterList</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">limitedCharacterList</span>
+ <span class="nf">autoCompleteList</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">autoCompleteList</span>
+ <span class="nf">maskInputCharacters</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span><span class="p">)</span><span class="nv">maskInputCharacters</span>
+ <span class="nf">customKeys</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">customKeys</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">language</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage">SDLLanguage</a></span><span class="p">?,</span> <span class="nv">keyboardLayout</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span><span class="p">?,</span> <span class="nv">keypressMode</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode">SDLKeypressMode</a></span><span class="p">?,</span> <span class="nv">limitedCharacterList</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">autoCompleteList</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">maskInputCharacters</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span><span class="p">?,</span> <span class="nv">customKeys</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>language</dt>
+ <dd><p>- language</p></dd>
+ <dt>keyboardLayout</dt>
+ <dd><p>- keyboardLayout</p></dd>
+ <dt>keypressMode</dt>
+ <dd><p>- keypressMode</p></dd>
+ <dt>limitedCharacterList</dt>
+ <dd><p>- limitedCharacterList</p></dd>
+ <dt>autoCompleteList</dt>
+ <dd><p>- autoCompleteList</p></dd>
+ <dt>maskInputCharacters</dt>
+ <dd><p>- maskInputCharacters</p></dd>
+ <dt>customKeys</dt>
+ <dd><p>- customKeys</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLKeyboardProperties object</p>
+ </div>
+
<h3 id="section-language">
language
</h3>
@@ -147,9 +236,11 @@
autoCompleteText
</h3>
- <p>Allows an app to prepopulate the text field with a suggested or completed entry as the user types</p>
+ <p>Deprecated, use autoCompleteList instead.
+ {&ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 1000}</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 6.0.0
+ @added in SmartDeviceLink 3.0.0</p>
@@ -183,4 +274,45 @@
+ <h3 id="section-maskInputCharacters">
+ maskInputCharacters
+ </h3>
+
+ <p>Allows an app to mask entered characters on HMI</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="n">maskInputCharacters</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">maskInputCharacters</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-customKeys">
+ customKeys
+ </h3>
+
+ <p>Array of special characters to show in customizable keys. If omitted, keyboard will show default special characters
+ {&ldquo;array_min_size&rdquo;: 1, &ldquo;array_max_size&rdquo;: 10, &ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 1}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">customKeys</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">customKeys</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLLockScreenViewController.html b/docs/Classes/SDLLockScreenViewController.html
index 309c1162b..494dc75ef 100644
--- a/docs/Classes/SDLLockScreenViewController.html
+++ b/docs/Classes/SDLLockScreenViewController.html
@@ -75,7 +75,7 @@
lockedLabelText
</h3>
- <p>The locked label string. This will be set by the lock screen manager to inform the user about the dismissable state.</p>
+ <p>The locked label string. This will be set by the lock screen manager to inform the user about the dismissible state.</p>
diff --git a/docs/Classes/SDLManager.html b/docs/Classes/SDLManager.html
index 728e0bfac..15485ef65 100644
--- a/docs/Classes/SDLManager.html
+++ b/docs/Classes/SDLManager.html
@@ -536,7 +536,7 @@
<li>One parameter e.g. <code>- (void)registerAppInterfaceResponse:(NSNotification *)notification;</code></li>
</ol>
-<p>Note that using this method to get a response instead of the <code>sendRequest:withResponseHandler:</code> method of getting a response, you will not be notifed of any <code><a href="../Classes.html#/c:objc(cs)SDLGenericResponse">SDLGenericResponse</a></code> errors where the head unit doesn&rsquo;t understand the request.</p>
+<p>Note that using this method to get a response instead of the <code>sendRequest:withResponseHandler:</code> method of getting a response, you will not be notified of any <code><a href="../Classes.html#/c:objc(cs)SDLGenericResponse">SDLGenericResponse</a></code> errors where the head unit doesn&rsquo;t understand the request.</p>
diff --git a/docs/Classes/SDLMenuCell.html b/docs/Classes/SDLMenuCell.html
index 93a655725..30094a796 100644
--- a/docs/Classes/SDLMenuCell.html
+++ b/docs/Classes/SDLMenuCell.html
@@ -9,8 +9,14 @@
<li><a href="#section-handler">handler</a></li>
<li><a href="#section-subCells">subCells</a></li>
<li><a href="#section-submenuLayout">submenuLayout</a></li>
+ <li><a href="#section-uniqueTitle">uniqueTitle</a></li>
+ <li><a href="#section-secondaryText">secondaryText</a></li>
+ <li><a href="#section-tertiaryText">tertiaryText</a></li>
+ <li><a href="#section-secondaryArtwork">secondaryArtwork</a></li>
<li><a href="#section--initWithTitle:icon:voiceCommands:handler:">-initWithTitle:icon:voiceCommands:handler:</a></li>
<li><a href="#section--initWithTitle:icon:submenuLayout:subCells:">-initWithTitle:icon:submenuLayout:subCells:</a></li>
+ <li><a href="#section--initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:">-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:</a></li>
+ <li><a href="#section--initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:">-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:</a></li>
</ul>
<h3>Overview</h3>
@@ -127,6 +133,78 @@
+ <h3 id="section-uniqueTitle">
+ uniqueTitle
+ </h3>
+
+ <p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href="../Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title">title</a></code> but other fields are different. This is autogenerated by the screen manager. This will not be used when connected to modules supporting RPC 7.1+ because duplicate titles are supported.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">readonly</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">uniqueTitle</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">uniqueTitle</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-secondaryText">
+ secondaryText
+ </h3>
+
+ <p>The cell&rsquo;s secondary text to be displayed</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">secondaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-tertiaryText">
+ tertiaryText
+ </h3>
+
+ <p>The cell&rsquo;s tertiary text to be displayed</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">tertiaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-secondaryArtwork">
+ secondaryArtwork
+ </h3>
+
+ <p>The cell&rsquo;s secondary icon to be displayed</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="n">secondaryArtwork</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryArtwork</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section--initWithTitle:icon:voiceCommands:handler:">
-initWithTitle:icon:voiceCommands:handler:
</h3>
@@ -192,7 +270,99 @@
<dt>icon</dt>
<dd><p>The cell&rsquo;s image</p></dd>
<dt>layout</dt>
- <dd><p>The layout that the subCells will be layed out in if that submenu is entered</p></dd>
+ <dd><p>The layout that the subCells will be laid out in if that submenu is entered</p></dd>
+ <dt>subCells</dt>
+ <dd><p>The subcells that will appear when the cell is selected</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The menu cell</p>
+ </div>
+
+ <h3 id="section--initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:">
+ -initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:
+ </h3>
+
+ <p>Create a menu cell that has no subcells.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithTitle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">title</span>
+ <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span>
+ <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span>
+ <span class="nf">icon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">icon</span>
+ <span class="nf">secondaryArtwork</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryArtwork</span>
+ <span class="nf">voiceCommands</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">voiceCommands</span>
+ <span class="nf">handler</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler">SDLMenuCellSelectionHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">title</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">icon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?,</span> <span class="nv">secondaryArtwork</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?,</span> <span class="nv">voiceCommands</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">handler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler">SDLMenuCellSelectionHandler</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>title</dt>
+ <dd><p>The cell&rsquo;s primary text</p></dd>
+ <dt>secondaryText</dt>
+ <dd><p>- secondaryText</p></dd>
+ <dt>tertiaryText</dt>
+ <dd><p>- tertiaryText</p></dd>
+ <dt>icon</dt>
+ <dd><p>The cell&rsquo;s image</p></dd>
+ <dt>secondaryArtwork</dt>
+ <dd><p>- secondaryArtwork</p></dd>
+ <dt>voiceCommands</dt>
+ <dd><p>Voice commands that will activate the menu cell</p></dd>
+ <dt>handler</dt>
+ <dd><p>The code that will be run when the menu cell is selected</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The menu cell</p>
+ </div>
+
+ <h3 id="section--initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:">
+ -initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:
+ </h3>
+
+ <p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithTitle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">title</span>
+ <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span>
+ <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span>
+ <span class="nf">icon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">icon</span>
+ <span class="nf">secondaryArtwork</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryArtwork</span>
+ <span class="nf">submenuLayout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout">SDLMenuLayout</a></span><span class="p">)</span><span class="nv">layout</span>
+ <span class="nf">subCells</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">SDLMenuCell</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">subCells</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">title</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">icon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?,</span> <span class="nv">secondaryArtwork</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">?,</span> <span class="n"><a href="../Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)submenuLayout">submenuLayout</a></span> <span class="nv">layout</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout">SDLMenuLayout</a></span><span class="p">?,</span> <span class="nv">subCells</span><span class="p">:</span> <span class="p">[</span><span class="kt">SDLMenuCell</span><span class="p">])</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>title</dt>
+ <dd><p>The cell&rsquo;s primary text</p></dd>
+ <dt>secondaryText</dt>
+ <dd><p>- secondaryText</p></dd>
+ <dt>tertiaryText</dt>
+ <dd><p>- tertiaryText</p></dd>
+ <dt>icon</dt>
+ <dd><p>The cell&rsquo;s image</p></dd>
+ <dt>secondaryArtwork</dt>
+ <dd><p>- secondaryArtwork</p></dd>
+ <dt>layout</dt>
+ <dd><p>The layout that the subCells will be laid out in if that submenu is entered</p></dd>
<dt>subCells</dt>
<dd><p>The subcells that will appear when the cell is selected</p></dd>
</dl>
diff --git a/docs/Classes/SDLMenuConfiguration.html b/docs/Classes/SDLMenuConfiguration.html
index 75789e292..663e7bad2 100644
--- a/docs/Classes/SDLMenuConfiguration.html
+++ b/docs/Classes/SDLMenuConfiguration.html
@@ -54,7 +54,7 @@
-initWithMainMenuLayout:defaultSubmenuLayout:
</h3>
- <p>Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overriden per-submenu if desired.</p>
+ <p>Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overridden per-submenu if desired.</p>
diff --git a/docs/Classes/SDLMenuParams.html b/docs/Classes/SDLMenuParams.html
index 3d58ca5ad..5599906fd 100644
--- a/docs/Classes/SDLMenuParams.html
+++ b/docs/Classes/SDLMenuParams.html
@@ -5,9 +5,12 @@
<ul>
<li><a href="#section--initWithMenuName:">-initWithMenuName:</a></li>
<li><a href="#section--initWithMenuName:parentId:position:">-initWithMenuName:parentId:position:</a></li>
+ <li><a href="#section--initWithMenuName:parentID:position:secondaryText:tertiaryText:">-initWithMenuName:parentID:position:secondaryText:tertiaryText:</a></li>
<li><a href="#section-parentID">parentID</a></li>
<li><a href="#section-position">position</a></li>
<li><a href="#section-menuName">menuName</a></li>
+ <li><a href="#section-secondaryText">secondaryText</a></li>
+ <li><a href="#section-tertiaryText">tertiaryText</a></li>
</ul>
<h3>Overview</h3>
@@ -78,6 +81,44 @@
<p>An instance of the add submenu class</p>
</div>
+ <h3 id="section--initWithMenuName:parentID:position:secondaryText:tertiaryText:">
+ -initWithMenuName:parentID:position:secondaryText:tertiaryText:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMenuName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">menuName</span>
+ <span class="nf">parentID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">parentID</span>
+ <span class="nf">position</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">position</span>
+ <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span>
+ <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">menuName</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">parentID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">position</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>menuName</dt>
+ <dd><p>- menuName</p></dd>
+ <dt>parentID</dt>
+ <dd><p>- parentID</p></dd>
+ <dt>position</dt>
+ <dd><p>- position</p></dd>
+ <dt>secondaryText</dt>
+ <dd><p>- secondaryText</p></dd>
+ <dt>tertiaryText</dt>
+ <dd><p>- tertiaryText</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLMenuParams object</p>
+ </div>
+
<h3 id="section-parentID">
parentID
</h3>
@@ -148,4 +189,46 @@
+ <h3 id="section-secondaryText">
+ secondaryText
+ </h3>
+
+ <p>Optional secondary text to display
+ {&ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 500}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">secondaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">secondaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-tertiaryText">
+ tertiaryText
+ </h3>
+
+ <p>Optional tertiary text to display
+ {&ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 500}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">tertiaryText</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">tertiaryText</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLOnAppCapabilityUpdated.html b/docs/Classes/SDLOnAppCapabilityUpdated.html
new file mode 100644
index 000000000..11fa3f438
--- /dev/null
+++ b/docs/Classes/SDLOnAppCapabilityUpdated.html
@@ -0,0 +1,63 @@
+<h1>SDLOnAppCapabilityUpdated Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithAppCapability:">-initWithAppCapability:</a></li>
+ <li><a href="#section-appCapability">appCapability</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>A notification to inform SDL Core that a specific app capability has changed.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithAppCapability:">
+ -initWithAppCapability:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithAppCapability</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLAppCapability.html">SDLAppCapability</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">appCapability</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">appCapability</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAppCapability.html">SDLAppCapability</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>appCapability</dt>
+ <dd><p>- appCapability</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLOnAppCapabilityUpdated object</p>
+ </div>
+
+ <h3 id="section-appCapability">
+ appCapability
+ </h3>
+
+ <p>The app capability that has been updated</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLAppCapability.html">SDLAppCapability</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">appCapability</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">appCapability</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAppCapability.html">SDLAppCapability</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLOnHMIStatus.html b/docs/Classes/SDLOnHMIStatus.html
index 434a51c42..133b30b5c 100644
--- a/docs/Classes/SDLOnHMIStatus.html
+++ b/docs/Classes/SDLOnHMIStatus.html
@@ -68,7 +68,7 @@
videoStreamingState
</h3>
- <p>Current availablility of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.</p>
+ <p>Current availability of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.</p>
@@ -151,7 +151,7 @@
<dt>audioStreamingState</dt>
<dd><p>The ability for an audio app to be heard</p></dd>
<dt>videoStreamingState</dt>
- <dd><p>The ability for a video straming app to stream</p></dd>
+ <dd><p>The ability for a video streaming app to stream</p></dd>
<dt>windowID</dt>
<dd><p>Which window this status relates to</p></dd>
</dl>
diff --git a/docs/Classes/SDLOnVehicleData.html b/docs/Classes/SDLOnVehicleData.html
index c495957d4..c303d55c3 100644
--- a/docs/Classes/SDLOnVehicleData.html
+++ b/docs/Classes/SDLOnVehicleData.html
@@ -4,6 +4,7 @@
<ul>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -12,6 +13,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-vin">vin</a></li>
<li><a href="#section-prndl">prndl</a></li>
@@ -40,6 +42,7 @@
<li><a href="#section-cloudAppVehicleID">cloudAppVehicleID</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -172,6 +175,131 @@
<p>A SDLOnVehicleData object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for setting all possible values on vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLGPSData.html">SDLGPSData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLFuelRange.html">SDLFuelRange</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal">SDLTurnSignal</a></span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">vin</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">vin</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLGearStatus.html">SDLGearStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLTireStatus.html">SDLTireStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLBeltStatus.html">SDLBeltStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLBodyInformation.html">SDLBodyInformation</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLDeviceStatus.html">SDLDeviceStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus">SDLVehicleDataEventStatus</a></span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus">SDLWiperStatus</a></span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLHeadLampStatus.html">SDLHeadLampStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus">SDLElectronicParkBrakeStatus</a></span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStabilityControlsStatus.html">SDLStabilityControlsStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLECallInfo.html">SDLECallInfo</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLAirbagStatus.html">SDLAirbagStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLEmergencyEvent.html">SDLEmergencyEvent</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModeStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLClusterModeStatus.html">SDLClusterModeStatus</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModeStatus</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLMyKey.html">SDLMyKey</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLWindowStatus.html">SDLWindowStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGPSData.html">SDLGPSData</a></span><span class="p">?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFuelRange.html">SDLFuelRange</a></span><span class="p">]?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span><span class="p">?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal">SDLTurnSignal</a></span><span class="p">?,</span> <span class="nv">vin</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGearStatus.html">SDLGearStatus</a></span><span class="p">?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTireStatus.html">SDLTireStatus</a></span><span class="p">?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLBeltStatus.html">SDLBeltStatus</a></span><span class="p">?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLBodyInformation.html">SDLBodyInformation</a></span><span class="p">?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLDeviceStatus.html">SDLDeviceStatus</a></span><span class="p">?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus">SDLVehicleDataEventStatus</a></span><span class="p">?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus">SDLWiperStatus</a></span><span class="p">?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLHeadLampStatus.html">SDLHeadLampStatus</a></span><span class="p">?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus">SDLElectronicParkBrakeStatus</a></span><span class="p">?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStabilityControlsStatus.html">SDLStabilityControlsStatus</a></span><span class="p">?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLECallInfo.html">SDLECallInfo</a></span><span class="p">?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAirbagStatus.html">SDLAirbagStatus</a></span><span class="p">?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLEmergencyEvent.html">SDLEmergencyEvent</a></span><span class="p">?,</span> <span class="nv">clusterModeStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLClusterModeStatus.html">SDLClusterModeStatus</a></span><span class="p">?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLMyKey.html">SDLMyKey</a></span><span class="p">?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLWindowStatus.html">SDLWindowStatus</a></span><span class="p">]?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>vin</dt>
+ <dd><p>- vin</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModeStatus</dt>
+ <dd><p>- clusterModeStatus</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLOnVehicleData object</p>
+ </div>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -320,11 +448,35 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLClimateData.html">SDLClimateData</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>The external temperature in degrees celsius.</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.
+ {&ldquo;num_min_value&rdquo;: -40.0, &ldquo;num_max_value&rdquo;: 100.0}</p>
+
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -852,4 +1004,24 @@
<p>An OEM custom vehicle data object for the given vehicle data name.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeatOccupancy.html">SDLSeatOccupancy</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLPermissionManager.html b/docs/Classes/SDLPermissionManager.html
index d68bedd4f..d2602b9f4 100644
--- a/docs/Classes/SDLPermissionManager.html
+++ b/docs/Classes/SDLPermissionManager.html
@@ -170,7 +170,7 @@
-subscribeToRPCPermissions:groupType:withHandler:
</h3>
- <p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. Tthe callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.</p>
+ <p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. The callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.</p>
<div class="aside aside-warning">
<p class="aside-title">Warning</p>
<p>The observer may be called before this method returns. Do not attempt to remove the observer from within the observer.</p>
diff --git a/docs/Classes/SDLPutFile.html b/docs/Classes/SDLPutFile.html
index c6e756963..4caa7ada7 100644
--- a/docs/Classes/SDLPutFile.html
+++ b/docs/Classes/SDLPutFile.html
@@ -86,7 +86,7 @@
-initWithFileName:fileType:persistentFile:
</h3>
- <p>Convenience init for creating a putfile with a name, file format, and persistance.</p>
+ <p>Convenience init for creating a putfile with a name, file format, and persistence.</p>
diff --git a/docs/Classes/SDLRegisterAppInterface.html b/docs/Classes/SDLRegisterAppInterface.html
index f2edd0f2d..c809d265f 100644
--- a/docs/Classes/SDLRegisterAppInterface.html
+++ b/docs/Classes/SDLRegisterAppInterface.html
@@ -485,7 +485,7 @@
<p>SDLAppInfo, Optional</p>
-<p>@since SDL 2.0</p>
+<p>@since SDL 4.2</p>
diff --git a/docs/Classes/SDLRegisterAppInterfaceResponse.html b/docs/Classes/SDLRegisterAppInterfaceResponse.html
index c1def48b6..73cc478a3 100644
--- a/docs/Classes/SDLRegisterAppInterfaceResponse.html
+++ b/docs/Classes/SDLRegisterAppInterfaceResponse.html
@@ -322,11 +322,11 @@
vehicleType
</h3>
- <p>Specifies the connected vehicle&rsquo;s type.</p>
+ <p>Specifies the vehicle&rsquo;s type. See VehicleType.</p>
-<p>SDLVehicleType, Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0</p>
-<p>@since SDL 2.0</p>
+<p>@added in SmartDeviceLink 2.0.0</p>
@@ -412,9 +412,11 @@
<p>The software version of the system that implements the SmartDeviceLink core.</p>
-<p>String, Optional, Max length: 100</p>
+<p>{&ldquo;string_min_length&rdquo;: 1, &ldquo;string_max_length&rdquo;: 100}</p>
-<p>@since SDL 3.0</p>
+<p>@deprecated in SDL 7.1.0</p>
+
+<p>@added in SDL 3.0.0</p>
diff --git a/docs/Classes/SDLRoofStatus.html b/docs/Classes/SDLRoofStatus.html
new file mode 100644
index 000000000..5192c99ea
--- /dev/null
+++ b/docs/Classes/SDLRoofStatus.html
@@ -0,0 +1,136 @@
+<h1>SDLRoofStatus Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithLocation:status:">-initWithLocation:status:</a></li>
+ <li><a href="#section--initWithLocation:status:state:">-initWithLocation:status:state:</a></li>
+ <li><a href="#section-location">location</a></li>
+ <li><a href="#section-status">status</a></li>
+ <li><a href="#section-state">state</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Describes the status of a parameter of roof/convertible roof/sunroof/moonroof etc. If roof is open (AJAR), state will determine percentage of roof open.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithLocation:status:">
+ -initWithLocation:status:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithLocation</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">location</span>
+ <span class="nf">status</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span><span class="nv">status</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span><span class="p">,</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>location</dt>
+ <dd><p>- location</p></dd>
+ <dt>status</dt>
+ <dd><p>- status</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLRoofStatus object</p>
+ </div>
+
+ <h3 id="section--initWithLocation:status:state:">
+ -initWithLocation:status:state:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithLocation</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">location</span>
+ <span class="nf">status</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">)</span><span class="nv">status</span>
+ <span class="nf">state</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLWindowState.html">SDLWindowState</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">state</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span><span class="p">,</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span><span class="p">,</span> <span class="nv">state</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLWindowState.html">SDLWindowState</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>location</dt>
+ <dd><p>- location</p></dd>
+ <dt>status</dt>
+ <dd><p>- status</p></dd>
+ <dt>state</dt>
+ <dd><p>- state</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLRoofStatus object</p>
+ </div>
+
+ <h3 id="section-location">
+ location
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">location</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">location</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-status">
+ status
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">status</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">status</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-state">
+ state
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLWindowState.html">SDLWindowState</a></span> <span class="o">*</span><span class="n">state</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">state</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLWindowState.html">SDLWindowState</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLScreenManager.html b/docs/Classes/SDLScreenManager.html
index 41d28e268..f5f5427fd 100644
--- a/docs/Classes/SDLScreenManager.html
+++ b/docs/Classes/SDLScreenManager.html
@@ -24,6 +24,7 @@
<li><a href="#section-keyboardConfiguration">keyboardConfiguration</a></li>
<li><a href="#section-preloadedChoices">preloadedChoices</a></li>
<li><a href="#section--initWithConnectionManager:fileManager:systemCapabilityManager:">-initWithConnectionManager:fileManager:systemCapabilityManager:</a></li>
+ <li><a href="#section--initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:">-initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:</a></li>
<li><a href="#section--startWithCompletionHandler:">-startWithCompletionHandler:</a></li>
<li><a href="#section--stop">-stop</a></li>
<li><a href="#section--beginUpdates">-beginUpdates</a></li>
@@ -42,6 +43,7 @@
<li><a href="#section--dismissKeyboardWithCancelID:">-dismissKeyboardWithCancelID:</a></li>
<li><a href="#section--openMenu">-openMenu</a></li>
<li><a href="#section--openSubmenu:">-openSubmenu:</a></li>
+ <li><a href="#section--presentAlert:withCompletionHandler:">-presentAlert:withCompletionHandler:</a></li>
</ul>
<h3>Overview</h3>
@@ -364,6 +366,12 @@
<p>The current list of menu cells displayed in the app&rsquo;s menu.</p>
+<p>WARNING: If two or more cells in this array are duplicates – they contain all of the same data – the menu will not be set. Each list of <code>subCells</code> and the main menu are compared separately, which means you can have duplicate cells between the main menu and a sub cell list without a conflict occurring.</p>
+
+<p>WARNING: If two or more cells contain the same <code><a href="../Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)title">title</a></code> but are otherwise distinctive, unique identifiers will be appended in the style (2), (3), (4), etc. to those cells&rsquo; <code><a href="../Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)title">title</a></code>. The same rules apply to duplicate titles as apply to complete duplicates above: the titles can be duplicates between different array lists without a conflict.</p>
+
+<p>WARNING: If any two cells contain the same voice command string in their <code><a href="../Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands">voiceCommands</a></code> list, the menu will not be set. Note that unlike the two warnings above, these lists <em>are not</em> checked separately. If you have the same voice command in a cell of the main menu and a sub cell, it will not be set.</p>
+
<h4>Objective-C</h4>
@@ -384,7 +392,7 @@
<p>The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to <code>SDLDynamicMenuUpdatesModeForceOn</code>, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI.</p>
-<p>If set to <code>SDLDynamicMenuUpdatesModeForceOff</code>, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus.</p>
+<p>If set to <code>SDLDynamicMenuUpdatesModeForceOff</code>, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regardless if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus.</p>
<p>We recommend using either <code>SDLDynamicMenuUpdatesModeOnWithCompatibility</code> or <code>SDLDynamicMenuUpdatesModeForceOn</code>. <code>SDLDynamicMenuUpdatesModeOnWithCompatibility</code> turns dynamic updates off for head units that we know have poor compatibility with dynamic updates (e.g. they have bugs that cause menu items to not be placed correctly).</p>
@@ -405,6 +413,11 @@
</h3>
<p>The current list of voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ May not be an empty string
+
+</div>
@@ -461,7 +474,7 @@
<p>Initialize a screen manager</p>
<div class="aside aside-warning">
<p class="aside-title">Warning</p>
- <p>For internal use</p>
+ <p>For internal use. An exception will be thrown if used.</p>
</div>
@@ -492,6 +505,47 @@
<p>The screen manager</p>
</div>
+ <h3 id="section--initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:">
+ -initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:
+ </h3>
+
+ <p>Initialize a screen manager</p>
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>For internal use</p>
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithConnectionManager</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">id</span><span class="o">&lt;</span><span class="n">SDLConnectionManagerType</span><span class="o">&gt;</span><span class="p">)</span><span class="nv">connectionManager</span>
+ <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLFileManager.html">SDLFileManager</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fileManager</span>
+ <span class="nf">systemCapabilityManager</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLSystemCapabilityManager.html">SDLSystemCapabilityManager</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">systemCapabilityManager</span>
+ <span class="nf">permissionManager</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLPermissionManager.html">SDLPermissionManager</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">permissionManager</span><span class="p">;</span></code></pre>
+
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>connectionManager</dt>
+ <dd><p>The connection manager used to send RPCs</p></dd>
+ <dt>fileManager</dt>
+ <dd><p>The file manager used to upload files</p></dd>
+ <dt>systemCapabilityManager</dt>
+ <dd><p>The system capability manager object for reading window capabilities</p></dd>
+ <dt>permissionManager</dt>
+ <dd><p>The permission manager object for checking RPC permissions</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The screen manager</p>
+ </div>
+
<h3 id="section--startWithCompletionHandler:">
-startWithCompletionHandler:
</h3>
@@ -973,4 +1027,35 @@
<dd><p>The submenu cell that should be opened as a sub menu, with its sub cells as the options.</p></dd>
</dl>
+ <h3 id="section--presentAlert:withCompletionHandler:">
+ -presentAlert:withCompletionHandler:
+ </h3>
+
+ <p>Present the alert on the screen. To replace a currently presenting alert with a new alert, you must first call <code>cancel</code> on the currently presenting alert before sending the new alert. Otherwise the newest alert will only be presented when the module dismisses the currently presented alert (either due to the timeout or the user selecting a button on the alert). Please note that cancelling a currently presented alert will only work on modules supporting RPC Spec v.5.0+.</p>
+
+<p>If the alert contains an audio indication with a file that needs to be uploaded, it will be uploaded before presenting the alert. If the alert contains soft buttons with images, they will be uploaded before presenting the alert. If the alert contains an icon, that will be uploaded before presenting the alert.</p>
+
+<p>The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The <code>userInfo</code> object on the error contais an <code>error</code> key with more information about the error. If the alert failed to present, the <code>userInfo</code> object will contain a <code>tryAgainTime</code> key with information on how long to wait before trying to send another alert. The value for <code>tryAgainTime</code> may be <code>nil</code> if the module did not return a value in its response.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">presentAlert</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLAlertView.html">SDLAlertView</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">alert</span>
+ <span class="nf">withCompletionHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">presentAlert</span><span class="p">(</span><span class="n">_</span> <span class="nv">alert</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAlertView.html">SDLAlertView</a></span><span class="p">,</span> <span class="n">withCompletionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>alert</dt>
+ <dd><p>Alert to be presented</p></dd>
+ <dt>handler</dt>
+ <dd><p>The handler to be called when the alert either dismisses from the screen or it has failed to present.</p></dd>
+ </dl>
+
</section>
diff --git a/docs/Classes/SDLSeatControlCapabilities.html b/docs/Classes/SDLSeatControlCapabilities.html
index f2b04ad41..31bf5ce4e 100644
--- a/docs/Classes/SDLSeatControlCapabilities.html
+++ b/docs/Classes/SDLSeatControlCapabilities.html
@@ -110,7 +110,7 @@
<dt>coolingLevelAvail</dt>
<dd><p>Whether or not cooling level is available</p></dd>
<dt>horizontalPositionAvail</dt>
- <dd><p>Whether or not horizontal Position is aavailable</p></dd>
+ <dd><p>Whether or not horizontal Position is available</p></dd>
<dt>verticalPositionAvail</dt>
<dd><p>Whether or not vertical position is available</p></dd>
<dt>frontVerticalPositionAvail</dt>
diff --git a/docs/Classes/SDLSeatOccupancy.html b/docs/Classes/SDLSeatOccupancy.html
new file mode 100644
index 000000000..1bd93b3cb
--- /dev/null
+++ b/docs/Classes/SDLSeatOccupancy.html
@@ -0,0 +1,85 @@
+<h1>SDLSeatOccupancy Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithSeatsOccupied:seatsBelted:">-initWithSeatsOccupied:seatsBelted:</a></li>
+ <li><a href="#section-seatsOccupied">seatsOccupied</a></li>
+ <li><a href="#section-seatsBelted">seatsBelted</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithSeatsOccupied:seatsBelted:">
+ -initWithSeatsOccupied:seatsBelted:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithSeatsOccupied</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">seatsOccupied</span>
+ <span class="nf">seatsBelted</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">seatsBelted</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">seatsOccupied</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span><span class="p">]?,</span> <span class="nv">seatsBelted</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span><span class="p">]?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>seatsOccupied</dt>
+ <dd><p>- seatsOccupied</p></dd>
+ <dt>seatsBelted</dt>
+ <dd><p>- seatsBelted</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSeatOccupancy object</p>
+ </div>
+
+ <h3 id="section-seatsOccupied">
+ seatsOccupied
+ </h3>
+
+ <p>Seat status array containing location and whether the seats are occupied.
+{&ldquo;array_min_size&rdquo;: 0, &ldquo;array_max_size&rdquo;: 100}</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">seatsOccupied</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatsOccupied</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-seatsBelted">
+ seatsBelted
+ </h3>
+
+ <p>Seat status array containing location and whether the seats are belted.
+{&ldquo;array_min_size&rdquo;: 0, &ldquo;array_max_size&rdquo;: 100}</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">seatsBelted</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatsBelted</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSeatStatus.html">SDLSeatStatus</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLSeatStatus.html b/docs/Classes/SDLSeatStatus.html
new file mode 100644
index 000000000..dfa795c82
--- /dev/null
+++ b/docs/Classes/SDLSeatStatus.html
@@ -0,0 +1,85 @@
+<h1>SDLSeatStatus Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithSeatLocation:conditionActive:">-initWithSeatLocation:conditionActive:</a></li>
+ <li><a href="#section-seatLocation">seatLocation</a></li>
+ <li><a href="#section-conditionActive">conditionActive</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Describes the status of a parameter of seat.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithSeatLocation:conditionActive:">
+ -initWithSeatLocation:conditionActive:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithSeatLocation</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLSeatLocation.html">SDLSeatLocation</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">seatLocation</span>
+ <span class="nf">conditionActive</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">conditionActive</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">seatLocation</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeatLocation.html">SDLSeatLocation</a></span><span class="p">,</span> <span class="nv">conditionActive</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>seatLocation</dt>
+ <dd><p>- seatLocation</p></dd>
+ <dt>conditionActive</dt>
+ <dd><p>- @(conditionActive)</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSeatStatus object</p>
+ </div>
+
+ <h3 id="section-seatLocation">
+ seatLocation
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeatLocation.html">SDLSeatLocation</a></span> <span class="o">*</span><span class="n">seatLocation</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatLocation</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeatLocation.html">SDLSeatLocation</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-conditionActive">
+ conditionActive
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">conditionActive</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">conditionActive</span><span class="p">:</span> <span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLSeekStreamingIndicator.html b/docs/Classes/SDLSeekStreamingIndicator.html
new file mode 100644
index 000000000..dd8387b37
--- /dev/null
+++ b/docs/Classes/SDLSeekStreamingIndicator.html
@@ -0,0 +1,139 @@
+<h1>SDLSeekStreamingIndicator Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--initWithType:">-initWithType:</a></li>
+ <li><a href="#section--initWithType:seekTime:">-initWithType:seekTime:</a></li>
+ <li><a href="#section-+seekIndicatorWithSeekTime:">+seekIndicatorWithSeekTime:</a></li>
+ <li><a href="#section-type">type</a></li>
+ <li><a href="#section-seekTime">seekTime</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>The seek next / skip previous subscription buttons&rsquo; content</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--initWithType:">
+ -initWithType:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithType</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span><span class="p">)</span><span class="nv">type</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">type</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>type</dt>
+ <dd><p>- type</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSeekStreamingIndicator object</p>
+ </div>
+
+ <h3 id="section--initWithType:seekTime:">
+ -initWithType:seekTime:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithType</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span><span class="p">)</span><span class="nv">type</span>
+ <span class="nf">seekTime</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">seekTime</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">type</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span><span class="p">,</span> <span class="nv">seekTime</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>type</dt>
+ <dd><p>- type</p></dd>
+ <dt>seekTime</dt>
+ <dd><p>- seekTime</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSeekStreamingIndicator object</p>
+ </div>
+
+ <h3 id="section-+seekIndicatorWithSeekTime:">
+ +seekIndicatorWithSeekTime:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">seekIndicatorWithSeekTime</span><span class="p">:(</span><span class="n">NSUInteger</span><span class="p">)</span><span class="nv">seekTime</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">seekIndicator</span><span class="p">(</span><span class="n">withSeekTime</span> <span class="nv">seekTime</span><span class="p">:</span> <span class="kt">UInt</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>seekTime</dt>
+ <dd><p>- seekTime</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSeekStreamingIndicator object</p>
+ </div>
+
+ <h3 id="section-type">
+ type
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="n">type</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">type</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-seekTime">
+ seekTime
+ </h3>
+
+ <p>If the type is TIME, this number of seconds may be present alongside the skip indicator. It will indicate the number of seconds that the currently playing media will skip forward or backward.
+{&ldquo;num_min_value&rdquo;: 1, &ldquo;num_max_value&rdquo;: 99}</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">seekTime</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seekTime</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLSetMediaClockTimer.html b/docs/Classes/SDLSetMediaClockTimer.html
index ac2523bf0..256193617 100644
--- a/docs/Classes/SDLSetMediaClockTimer.html
+++ b/docs/Classes/SDLSetMediaClockTimer.html
@@ -4,19 +4,29 @@
<ul>
<li><a href="#section-+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:">+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:</a></li>
+ <li><a href="#section-+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:</a></li>
<li><a href="#section-+countUpFromStartTime:toEndTime:playPauseIndicator:">+countUpFromStartTime:toEndTime:playPauseIndicator:</a></li>
+ <li><a href="#section-+countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">+countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:</a></li>
<li><a href="#section-+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:">+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:</a></li>
+ <li><a href="#section-+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:</a></li>
<li><a href="#section-+countDownFromStartTime:toEndTime:playPauseIndicator:">+countDownFromStartTime:toEndTime:playPauseIndicator:</a></li>
+ <li><a href="#section-+countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">+countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:</a></li>
<li><a href="#section-+pauseWithPlayPauseIndicator:">+pauseWithPlayPauseIndicator:</a></li>
<li><a href="#section-+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:">+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:</a></li>
<li><a href="#section-+updatePauseWithNewStartTime:endTime:playPauseIndicator:">+updatePauseWithNewStartTime:endTime:playPauseIndicator:</a></li>
<li><a href="#section-+resumeWithPlayPauseIndicator:">+resumeWithPlayPauseIndicator:</a></li>
+ <li><a href="#section-+resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">+resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:</a></li>
<li><a href="#section-+clearWithPlayPauseIndicator:">+clearWithPlayPauseIndicator:</a></li>
+ <li><a href="#section--initWithUpdateMode:">-initWithUpdateMode:</a></li>
<li><a href="#section--initWithUpdateMode:startTime:endTime:playPauseIndicator:">-initWithUpdateMode:startTime:endTime:playPauseIndicator:</a></li>
+ <li><a href="#section--initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">-initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:</a></li>
<li><a href="#section-startTime">startTime</a></li>
<li><a href="#section-endTime">endTime</a></li>
<li><a href="#section-updateMode">updateMode</a></li>
<li><a href="#section-audioStreamingIndicator">audioStreamingIndicator</a></li>
+ <li><a href="#section-forwardSeekIndicator">forwardSeekIndicator</a></li>
+ <li><a href="#section-backSeekIndicator">backSeekIndicator</a></li>
+ <li><a href="#section-countRate">countRate</a></li>
</ul>
<h3>Overview</h3>
@@ -69,6 +79,54 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section-+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">
+ +countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:
+ </h3>
+
+ <p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>
+
+<p>This will fail if startTime is greater than endTime</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">countUpFromStartTimeInterval</span><span class="p">:(</span><span class="n">NSTimeInterval</span><span class="p">)</span><span class="nv">startTime</span>
+ <span class="nf">toEndTimeInterval</span><span class="p">:(</span><span class="n">NSTimeInterval</span><span class="p">)</span><span class="nv">endTime</span>
+ <span class="nf">playPauseIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">)</span><span class="nv">playPauseIndicator</span>
+ <span class="nf">forwardSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">forwardSeekIndicator</span>
+ <span class="nf">backSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">backSeekIndicator</span>
+ <span class="nf">countRate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">countUp</span><span class="p">(</span><span class="n">from</span> <span class="nv">startTime</span><span class="p">:</span> <span class="kt">TimeInterval</span><span class="p">,</span> <span class="n">to</span> <span class="nv">endTime</span><span class="p">:</span> <span class="kt">TimeInterval</span><span class="p">,</span> <span class="nv">playPauseIndicator</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>startTime</dt>
+ <dd><p>The start time interval, e.g. (0) 0:00</p></dd>
+ <dt>endTime</dt>
+ <dd><p>The end time interval, e.g. (258) 4:18</p></dd>
+ <dt>playPauseIndicator</dt>
+ <dd><p>An optional audio indicator to change the play/pause button</p></dd>
+ <dt>countRate</dt>
+ <dd><p>set the media playback timer, if <code>nil</code>, will default to 1.0</p></dd>
+ <dt>forwardSeekIndicator</dt>
+ <dd><p>- forwardSeekIndicator</p></dd>
+ <dt>backSeekIndicator</dt>
+ <dd><p>- backSeekIndicator</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object of SetMediaClockTimer</p>
+ </div>
+
<h3 id="section-+countUpFromStartTime:toEndTime:playPauseIndicator:">
+countUpFromStartTime:toEndTime:playPauseIndicator:
</h3>
@@ -106,6 +164,52 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section-+countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">
+ +countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:
+ </h3>
+
+ <p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>
+
+<p>This will fail if startTime is greater than endTime</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">countUpFromStartTime</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">startTime</span>
+ <span class="nf">toEndTime</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">endTime</span>
+ <span class="nf">playPauseIndicator</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">)</span><span class="nv">playPauseIndicator</span>
+ <span class="nf">forwardSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">forwardSeekIndicator</span>
+ <span class="nf">backSeekIndicator</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">backSeekIndicator</span>
+ <span class="nf">countRate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">countUp</span><span class="p">(</span><span class="n">from</span> <span class="nv">startTime</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span><span class="p">,</span> <span class="n">to</span> <span class="nv">endTime</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span><span class="p">,</span> <span class="nv">playPauseIndicator</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>startTime</dt>
+ <dd><p>The start time interval, e.g. 0:00</p></dd>
+ <dt>endTime</dt>
+ <dd><p>The end time interval, e.g. 4:18</p></dd>
+ <dt>playPauseIndicator</dt>
+ <dd><p>An optional audio indicator to change the play/pause button</p></dd>
+ <dt>forwardSeekIndicator</dt>
+ <dd><p>- forwardSeekIndicator</p></dd>
+ <dt>backSeekIndicator</dt>
+ <dd><p>- backSeekIndicator</p></dd>
+ <dt>countRate</dt>
+ <dd><p>set the media playback timer, if <code>nil</code>, will default to 1.0</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object of SetMediaClockTimer</p>
+ </div>
+
<h3 id="section-+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:">
+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:
</h3>
@@ -143,6 +247,54 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section-+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">
+ +countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:
+ </h3>
+
+ <p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>
+
+<p>This will fail if endTime is greater than startTime</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">countDownFromStartTimeInterval</span><span class="p">:(</span><span class="n">NSTimeInterval</span><span class="p">)</span><span class="nv">startTime</span>
+ <span class="nf">toEndTimeInterval</span><span class="p">:(</span><span class="n">NSTimeInterval</span><span class="p">)</span><span class="nv">endTime</span>
+ <span class="nf">playPauseIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">)</span><span class="nv">playPauseIndicator</span>
+ <span class="nf">forwardSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">forwardSeekIndicator</span>
+ <span class="nf">backSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">backSeekIndicator</span>
+ <span class="nf">countRate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">countDown</span><span class="p">(</span><span class="n">from</span> <span class="nv">startTime</span><span class="p">:</span> <span class="kt">TimeInterval</span><span class="p">,</span> <span class="n">to</span> <span class="nv">endTime</span><span class="p">:</span> <span class="kt">TimeInterval</span><span class="p">,</span> <span class="nv">playPauseIndicator</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>startTime</dt>
+ <dd><p>The start time interval, e.g. (258) 4:18</p></dd>
+ <dt>endTime</dt>
+ <dd><p>The end time interval, e.g. (0) 0:00</p></dd>
+ <dt>playPauseIndicator</dt>
+ <dd><p>An optional audio indicator to change the play/pause button</p></dd>
+ <dt>forwardSeekIndicator</dt>
+ <dd><p>- forwardSeekIndicator</p></dd>
+ <dt>backSeekIndicator</dt>
+ <dd><p>- backSeekIndicator</p></dd>
+ <dt>countRate</dt>
+ <dd><p>set the media playback timer, if <code>nil</code>, will default to 1.0</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object of SetMediaClockTimer</p>
+ </div>
+
<h3 id="section-+countDownFromStartTime:toEndTime:playPauseIndicator:">
+countDownFromStartTime:toEndTime:playPauseIndicator:
</h3>
@@ -180,6 +332,54 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section-+countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">
+ +countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:
+ </h3>
+
+ <p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>
+
+<p>This will fail if endTime is greater than startTime</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">countDownFromStartTime</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">startTime</span>
+ <span class="nf">toEndTime</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">endTime</span>
+ <span class="nf">playPauseIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">)</span><span class="nv">playPauseIndicator</span>
+ <span class="nf">forwardSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">forwardSeekIndicator</span>
+ <span class="nf">backSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">backSeekIndicator</span>
+ <span class="nf">countRate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">countDown</span><span class="p">(</span><span class="n">from</span> <span class="nv">startTime</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span><span class="p">,</span> <span class="n">to</span> <span class="nv">endTime</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span><span class="p">,</span> <span class="nv">playPauseIndicator</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>startTime</dt>
+ <dd><p>The start time interval, e.g. 4:18</p></dd>
+ <dt>endTime</dt>
+ <dd><p>The end time interval, e.g. 0:00</p></dd>
+ <dt>playPauseIndicator</dt>
+ <dd><p>An optional audio indicator to change the play/pause button</p></dd>
+ <dt>forwardSeekIndicator</dt>
+ <dd><p>- forwardSeekIndicator</p></dd>
+ <dt>backSeekIndicator</dt>
+ <dd><p>- backSeekIndicator</p></dd>
+ <dt>countRate</dt>
+ <dd><p>set the media playback timer, if <code>nil</code>, will default to 1.0</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object of SetMediaClockTimer</p>
+ </div>
+
<h3 id="section-+pauseWithPlayPauseIndicator:">
+pauseWithPlayPauseIndicator:
</h3>
@@ -306,6 +506,46 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section-+resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">
+ +resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:
+ </h3>
+
+ <p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">resumeWithPlayPauseIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">)</span><span class="nv">playPauseIndicator</span>
+ <span class="nf">forwardSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">forwardSeekIndicator</span>
+ <span class="nf">backSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">backSeekIndicator</span>
+ <span class="nf">countRate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">resume</span><span class="p">(</span><span class="nv">playPauseIndicator</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>playPauseIndicator</dt>
+ <dd><p>An optional audio indicator to change the play/pause button</p></dd>
+ <dt>forwardSeekIndicator</dt>
+ <dd><p>- forwardSeekIndicator</p></dd>
+ <dt>backSeekIndicator</dt>
+ <dd><p>- backSeekIndicator</p></dd>
+ <dt>countRate</dt>
+ <dd><p>set the media playback timer</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object of SetMediaClockTimer, if <code>nil</code>, will default to 1.0</p>
+ </div>
+
<h3 id="section-+clearWithPlayPauseIndicator:">
+clearWithPlayPauseIndicator:
</h3>
@@ -334,6 +574,32 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section--initWithUpdateMode:">
+ -initWithUpdateMode:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithUpdateMode</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode">SDLUpdateMode</a></span><span class="p">)</span><span class="nv">updateMode</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">updateMode</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode">SDLUpdateMode</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>updateMode</dt>
+ <dd><p>- updateMode</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSetMediaClockTimer object</p>
+ </div>
+
<h3 id="section--initWithUpdateMode:startTime:endTime:playPauseIndicator:">
-initWithUpdateMode:startTime:endTime:playPauseIndicator:
</h3>
@@ -371,6 +637,54 @@
<p>An object of SetMediaClockTimer</p>
</div>
+ <h3 id="section--initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:">
+ -initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithUpdateMode</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode">SDLUpdateMode</a></span><span class="p">)</span><span class="nv">updateMode</span>
+ <span class="nf">startTime</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">startTime</span>
+ <span class="nf">endTime</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">endTime</span>
+ <span class="nf">audioStreamingIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">)</span><span class="nv">audioStreamingIndicator</span>
+ <span class="nf">forwardSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">forwardSeekIndicator</span>
+ <span class="nf">backSeekIndicator</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">backSeekIndicator</span>
+ <span class="nf">countRate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">updateMode</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode">SDLUpdateMode</a></span><span class="p">,</span> <span class="nv">startTime</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span><span class="p">?,</span> <span class="n">end</span> <span class="nv">endTime</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStartTime.html">SDLStartTime</a></span><span class="p">?,</span> <span class="nv">audioStreamingIndicator</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator">SDLAudioStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?,</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>updateMode</dt>
+ <dd><p>- updateMode</p></dd>
+ <dt>startTime</dt>
+ <dd><p>- startTime</p></dd>
+ <dt>endTime</dt>
+ <dd><p>- endTime</p></dd>
+ <dt>audioStreamingIndicator</dt>
+ <dd><p>- audioStreamingIndicator</p></dd>
+ <dt>forwardSeekIndicator</dt>
+ <dd><p>- forwardSeekIndicator</p></dd>
+ <dt>backSeekIndicator</dt>
+ <dd><p>- backSeekIndicator</p></dd>
+ <dt>countRate</dt>
+ <dd><p>- countRate</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSetMediaClockTimer object</p>
+ </div>
+
<h3 id="section-startTime">
startTime
</h3>
@@ -468,4 +782,65 @@
+ <h3 id="section-forwardSeekIndicator">
+ forwardSeekIndicator
+ </h3>
+
+ <p>Used to control the forward seek button to either skip forward a set amount of time or to the next track.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="n">forwardSeekIndicator</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">forwardSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-backSeekIndicator">
+ backSeekIndicator
+ </h3>
+
+ <p>Used to control the back seek button to either skip back a set amount of time or to the previous track.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span> <span class="o">*</span><span class="n">backSeekIndicator</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">backSeekIndicator</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSeekStreamingIndicator.html">SDLSeekStreamingIndicator</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-countRate">
+ countRate
+ </h3>
+
+ <p>The value of this parameter is the amount that the media clock timer will advance per 1.0 seconds of real time. Values less than 1.0 will therefore advance the timer slower than real-time, while values greater than 1.0 will advance the timer faster than real-time. e.g. If this parameter is set to <code>0.5</code>, the timer will advance one second per two seconds real-time, or at 50% speed. If this parameter is set to <code>2.0</code>, the timer will advance two seconds per one second real-time, or at 200% speed.
+ {&ldquo;num_min_value&rdquo;: 0.1, &ldquo;num_max_value&rdquo;: 100.0, &ldquo;default_value&rdquo;: 1.0}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">countRate</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">countRate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLShow.html b/docs/Classes/SDLShow.html
index f7a3a2111..aa03aa4fc 100644
--- a/docs/Classes/SDLShow.html
+++ b/docs/Classes/SDLShow.html
@@ -9,6 +9,7 @@
<li><a href="#section--initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:">-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:</a></li>
<li><a href="#section--initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:">-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:</a></li>
<li><a href="#section--initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:">-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:</a></li>
+ <li><a href="#section--initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:">-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:</a></li>
<li><a href="#section-mainField1">mainField1</a></li>
<li><a href="#section-mainField2">mainField2</a></li>
<li><a href="#section-mainField3">mainField3</a></li>
@@ -319,6 +320,76 @@
<p>An SDLShow object</p>
</div>
+ <h3 id="section--initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:">
+ -initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithMainField1</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">mainField1</span>
+ <span class="nf">mainField2</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">mainField2</span>
+ <span class="nf">mainField3</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">mainField3</span>
+ <span class="nf">mainField4</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">mainField4</span>
+ <span class="nf">alignment</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment">SDLTextAlignment</a></span><span class="p">)</span><span class="nv">alignment</span>
+ <span class="nf">statusBar</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">statusBar</span>
+ <span class="nf">mediaTrack</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">mediaTrack</span>
+ <span class="nf">graphic</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">graphic</span>
+ <span class="nf">secondaryGraphic</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImage.html">SDLImage</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryGraphic</span>
+ <span class="nf">softButtons</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSoftButton.html">SDLSoftButton</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">softButtons</span>
+ <span class="nf">customPresets</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">customPresets</span>
+ <span class="nf">metadataTags</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLMetadataTags.html">SDLMetadataTags</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">metadataTags</span>
+ <span class="nf">templateTitle</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">templateTitle</span>
+ <span class="nf">windowID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLInt">SDLInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowID</span>
+ <span class="nf">templateConfiguration</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLTemplateConfiguration.html">SDLTemplateConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">templateConfiguration</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">mainField1</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">mainField2</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">mainField3</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">mainField4</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">alignment</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment">SDLTextAlignment</a></span><span class="p">?,</span> <span class="nv">statusBar</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">mediaTrack</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">graphic</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?,</span> <span class="nv">secondaryGraphic</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImage.html">SDLImage</a></span><span class="p">?,</span> <span class="nv">softButtons</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSoftButton.html">SDLSoftButton</a></span><span class="p">]?,</span> <span class="nv">customPresets</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">metadataTags</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLMetadataTags.html">SDLMetadataTags</a></span><span class="p">?,</span> <span class="nv">templateTitle</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">windowID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLInt">SDLInt</a></span><span class="p">)?,</span> <span class="nv">templateConfiguration</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemplateConfiguration.html">SDLTemplateConfiguration</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>mainField1</dt>
+ <dd><p>- mainField1</p></dd>
+ <dt>mainField2</dt>
+ <dd><p>- mainField2</p></dd>
+ <dt>mainField3</dt>
+ <dd><p>- mainField3</p></dd>
+ <dt>mainField4</dt>
+ <dd><p>- mainField4</p></dd>
+ <dt>alignment</dt>
+ <dd><p>- alignment</p></dd>
+ <dt>statusBar</dt>
+ <dd><p>- statusBar</p></dd>
+ <dt>mediaTrack</dt>
+ <dd><p>- mediaTrack</p></dd>
+ <dt>graphic</dt>
+ <dd><p>- graphic</p></dd>
+ <dt>secondaryGraphic</dt>
+ <dd><p>- secondaryGraphic</p></dd>
+ <dt>softButtons</dt>
+ <dd><p>- softButtons</p></dd>
+ <dt>customPresets</dt>
+ <dd><p>- customPresets</p></dd>
+ <dt>metadataTags</dt>
+ <dd><p>- metadataTags</p></dd>
+ <dt>templateTitle</dt>
+ <dd><p>- templateTitle</p></dd>
+ <dt>windowID</dt>
+ <dd><p>- windowID</p></dd>
+ <dt>templateConfiguration</dt>
+ <dd><p>- templateConfiguration</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLShow object</p>
+ </div>
+
<h3 id="section-mainField1">
mainField1
</h3>
@@ -513,20 +584,11 @@ line in a two-line display
mediaClock
</h3>
- <p>This property is deprecated use SetMediaClockTimer instead.
- <p> The value for the MediaClock field using a format described in the
- MediaClockFormat enumeration</p>
+ <p>Text value for MediaClock field. Has to be properly formatted by Mobile App according to the module&rsquo;s capabilities. If this text is set, any automatic media clock updates previously set with SetMediaClockTimer will be stopped.
+ {&ldquo;string_min_length&rdquo;: 0, &ldquo;string_max_length&rdquo;: 500}</p>
-<p>@discussion A String value for the MediaClock
- <p>
- <b>Notes: </b><br/>
- <ul>
- <li>Must be properly formatted as described in the
- MediaClockFormat enumeration</li>
- <li>If a value of five spaces is provided, this will clear
- that field on the display (i.e. the media clock timer field
- will not display anything)</li>
- </ul></p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 1.0.0</p>
diff --git a/docs/Classes/SDLShowConstantTBT.html b/docs/Classes/SDLShowConstantTBT.html
index ab92678d0..72849ee53 100644
--- a/docs/Classes/SDLShowConstantTBT.html
+++ b/docs/Classes/SDLShowConstantTBT.html
@@ -70,9 +70,9 @@
<dt>nextTurnIcon</dt>
<dd><p>An icon to show with the next turn description</p></dd>
<dt>distanceToManeuver</dt>
- <dd><p>Fraction of distance till next maneuver</p></dd>
+ <dd><p>Distance (in meters) until next maneuver.</p></dd>
<dt>distanceToManeuverScale</dt>
- <dd><p>Distance till next maneuver</p></dd>
+ <dd><p>Distance (in meters) from previous maneuver to next maneuver.</p></dd>
<dt>maneuverComplete</dt>
<dd><p>If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE</p></dd>
<dt>softButtons</dt>
@@ -237,7 +237,7 @@
distanceToManeuver
</h3>
- <p>Fraction of distance till next maneuver (starting from when AlertManeuver is triggered). Used to calculate progress bar.</p>
+ <p>Distance (in meters) until next maneuver. May be used to calculate progress bar.</p>
<p>Optional, Float, 0 - 1,000,000,000</p>
@@ -257,7 +257,7 @@
distanceToManeuverScale
</h3>
- <p>Distance till next maneuver (starting from) from previous maneuver. Used to calculate progress bar.</p>
+ <p>Distance (in meters) from previous maneuver to next maneuver. May be used to calculate progress bar.</p>
<p>Optional, Float, 0 - 1,000,000,000</p>
diff --git a/docs/Classes/SDLStreamingMediaConfiguration.html b/docs/Classes/SDLStreamingMediaConfiguration.html
index 7cb438c57..bad8b638b 100644
--- a/docs/Classes/SDLStreamingMediaConfiguration.html
+++ b/docs/Classes/SDLStreamingMediaConfiguration.html
@@ -10,9 +10,13 @@
<li><a href="#section-carWindowRenderingType">carWindowRenderingType</a></li>
<li><a href="#section-enableForcedFramerateSync">enableForcedFramerateSync</a></li>
<li><a href="#section-allowMultipleViewControllerOrientations">allowMultipleViewControllerOrientations</a></li>
+ <li><a href="#section-supportedLandscapeStreamingRange">supportedLandscapeStreamingRange</a></li>
+ <li><a href="#section-supportedPortraitStreamingRange">supportedPortraitStreamingRange</a></li>
+ <li><a href="#section-delegate">delegate</a></li>
<li><a href="#section--init">-init</a></li>
<li><a href="#section-+secureConfiguration">+secureConfiguration</a></li>
<li><a href="#section--initWithEncryptionFlag:videoSettings:dataSource:rootViewController:">-initWithEncryptionFlag:videoSettings:dataSource:rootViewController:</a></li>
+ <li><a href="#section--initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:">-initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:</a></li>
<li><a href="#section-+insecureConfiguration">+insecureConfiguration</a></li>
<li><a href="#section-+autostreamingInsecureConfigurationWithInitialViewController:">+autostreamingInsecureConfigurationWithInitialViewController:</a></li>
<li><a href="#section-+autostreamingSecureConfigurationWithInitialViewController:">+autostreamingSecureConfigurationWithInitialViewController:</a></li>
@@ -90,7 +94,7 @@
</div><div class="aside aside-warning">
<p class="aside-title">Warning</p>
- <p>Apps using views outside of the <code>UIView</code> heirarchy (such as OpenGL) are currently unsupported. If you app uses partial views in the heirarchy, only those views will be discovered. Your OpenGL views will not be discoverable to a haptic interface head unit and you will have to manually make these views discoverable via the <code><a href="../Classes/SDLSendHapticData.html">SDLSendHapticData</a></code> RPC request.</p>
+ <p>Apps using views outside of the <code>UIView</code> hierarchy (such as OpenGL) are currently unsupported. If you app uses partial views in the hierarchy, only those views will be discovered. Your OpenGL views will not be discoverable to a haptic interface head unit and you will have to manually make these views discoverable via the <code><a href="../Classes/SDLSendHapticData.html">SDLSendHapticData</a></code> RPC request.</p>
</div><div class="aside aside-warning">
<p class="aside-title">Warning</p>
@@ -172,6 +176,69 @@
+ <h3 id="section-supportedLandscapeStreamingRange">
+ supportedLandscapeStreamingRange
+ </h3>
+
+ <p>Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all lanscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a <code>disabled</code> video streaming range.
+If desired, you can subscribe to screen size updates via the SDLStreamingVideoDelegate.</p>
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ If you disable both the supportedLandscapeStreamingRange and supportedPortraitStreamingRange, video will not stream
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVideoStreamingRange.html">SDLVideoStreamingRange</a></span> <span class="o">*</span><span class="n">supportedLandscapeStreamingRange</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">supportedLandscapeStreamingRange</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVideoStreamingRange.html">SDLVideoStreamingRange</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-supportedPortraitStreamingRange">
+ supportedPortraitStreamingRange
+ </h3>
+
+ <p>Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all portrait streaming ranges. If you wish to disable support for streaming in portrait mode, set a <code>disabled</code> video streaming range.
+If desired, you can subscribe to screen size updates via the SDLStreamingVideoDelegate.</p>
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ If you disable both the supportedLandscapeStreamingRange and supportedPortraitStreamingRange, video will not stream
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVideoStreamingRange.html">SDLVideoStreamingRange</a></span> <span class="o">*</span><span class="n">supportedPortraitStreamingRange</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">supportedPortraitStreamingRange</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVideoStreamingRange.html">SDLVideoStreamingRange</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-delegate">
+ delegate
+ </h3>
+
+ <p>The configuration delegate, this is an object conforming to the SDLStreamingVideoDelegate protocol. If video streaming parameters change then this object will be called on.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">weak</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">id</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLStreamingVideoDelegate.html">SDLStreamingVideoDelegate</a></span><span class="o">&gt;</span> <span class="n">delegate</span><span class="p">;</span></code></pre>
+
+
+
+
+
<h3 id="section--init">
-init
</h3>
@@ -239,17 +306,58 @@
<h4>Parameters</h4>
<dl>
<dt>encryptionFlag</dt>
- <dd><p>The maximum encrpytion supported. If the connected head unit supports less than set here, it will still connect, but if it supports more than set here, it will not connect.</p></dd>
+ <dd><p>The maximum encryption supported. If the connected head unit supports less than set here, it will still connect, but if it supports more than set here, it will not connect.</p></dd>
<dt>videoSettings</dt>
<dd><p>Custom video encoder settings to be used in video streaming.</p></dd>
<dt>rootViewController</dt>
- <dd><p>The UIViewController wih the content that is being streamed on, to use for haptics if needed and possible (only works for UIViews)</p></dd>
+ <dd><p>The UIViewController with the content that is being streamed on, to use for haptics if needed and possible (only works for UIViews)</p></dd>
</dl>
<div>
<h4>Return Value</h4>
<p>The configuration</p>
</div>
+ <h3 id="section--initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:">
+ -initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:
+ </h3>
+
+ <p>Manually set all the properties to the streaming media configuration</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithEncryptionFlag</span><span class="p">:(</span><span class="n"><a href="../Enums/SDLStreamingEncryptionFlag.html">SDLStreamingEncryptionFlag</a></span><span class="p">)</span><span class="nv">encryptionFlag</span>
+ <span class="nf">videoSettings</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSDictionary</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*</span><span class="p">,</span> <span class="n">id</span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">videoSettings</span>
+ <span class="nf">supportedLandscapeRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVideoStreamingRange.html">SDLVideoStreamingRange</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">landscapeRange</span>
+ <span class="nf">supportedPortraitRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVideoStreamingRange.html">SDLVideoStreamingRange</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">portraitRange</span>
+ <span class="nf">dataSource</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">id</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLStreamingMediaManagerDataSource.html">SDLStreamingMediaManagerDataSource</a></span><span class="o">&gt;</span><span class="p">)</span><span class="nv">dataSource</span>
+ <span class="nf">delegate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">id</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLStreamingVideoDelegate.html">SDLStreamingVideoDelegate</a></span><span class="o">&gt;</span><span class="p">)</span><span class="nv">delegate</span>
+ <span class="nf">rootViewController</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">UIViewController</span> <span class="o">*</span><span class="p">)</span><span class="nv">rootViewController</span><span class="p">;</span></code></pre>
+
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>encryptionFlag</dt>
+ <dd><p>The maximum encryption supported. If the connected head unit supports less than set here, it will still connect, but if it supports more than set here, it will not connect</p></dd>
+ <dt>videoSettings</dt>
+ <dd><p>Custom video encoder settings to be used in video streaming</p></dd>
+ <dt>landscapeRange</dt>
+ <dd><p>Set a landscape image dimension range and/or aspect ratio range that your app supports</p></dd>
+ <dt>portraitRange</dt>
+ <dd><p>Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports</p></dd>
+ <dt>dataSource</dt>
+ <dd><p>Allows you to respond with preferred resolutions and/or formats</p></dd>
+ <dt>delegate</dt>
+ <dd><p>Provides a delegate with notifications about changes to the audio stream</p></dd>
+ <dt>rootViewController</dt>
+ <dd><p>A view controller that should be automatically streamed</p></dd>
+ </dl>
+
<h3 id="section-+insecureConfiguration">
+insecureConfiguration
</h3>
diff --git a/docs/Classes/SDLStreamingVideoScaleManager.html b/docs/Classes/SDLStreamingVideoScaleManager.html
index 58a144874..d184cbad8 100644
--- a/docs/Classes/SDLStreamingVideoScaleManager.html
+++ b/docs/Classes/SDLStreamingVideoScaleManager.html
@@ -10,7 +10,9 @@
<li><a href="#section--initWithScale:displayViewportResolution:">-initWithScale:displayViewportResolution:</a></li>
<li><a href="#section--scaleTouchEventCoordinates:">-scaleTouchEventCoordinates:</a></li>
<li><a href="#section--scaleHapticRect:">-scaleHapticRect:</a></li>
+ <li><a href="#section--makeScaledResolution">-makeScaledResolution</a></li>
<li><a href="#section--stop">-stop</a></li>
+ <li><a href="#section-+scale:size:">+scale:size:</a></li>
</ul>
<h3>Overview</h3>
@@ -183,6 +185,28 @@ The scale value will be set to 1.0 and the displayViewportResolution will be set
<p>The position of the haptic rectangle in the display&rsquo;s coordinate system</p>
</div>
+ <h3 id="section--makeScaledResolution">
+ -makeScaledResolution
+ </h3>
+
+ <p>Create and return the current display resolution respecting the scale factor</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="n">makeScaledResolution</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">makeScaledResolution</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span></code></pre>
+
+
+
+ <div>
+ <h4>Return Value</h4>
+ <p>A new created object of type SDLImageResolution</p>
+ </div>
+
<h3 id="section--stop">
-stop
</h3>
@@ -201,4 +225,33 @@ The scale value will be set to 1.0 and the displayViewportResolution will be set
+ <h3 id="section-+scale:size:">
+ +scale:size:
+ </h3>
+
+ <p>Calculate a new size based on the given size and the scale factor</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">CGSize</span><span class="p">)</span><span class="nf">scale</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">scale</span> <span class="nf">size</span><span class="p">:(</span><span class="n">CGSize</span><span class="p">)</span><span class="nv">size</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">scale</span><span class="p">(</span><span class="n">_</span> <span class="nv">scale</span><span class="p">:</span> <span class="kt">Float</span><span class="p">,</span> <span class="nv">size</span><span class="p">:</span> <span class="kt">CGSize</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">CGSize</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>scale</dt>
+ <dd><p>The scale factor to apply</p></dd>
+ <dt>size</dt>
+ <dd><p>The size struct to apply the scale to</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A new created and inited struct of type CGSize</p>
+ </div>
+
</section>
diff --git a/docs/Classes/SDLSubscribeVehicleData.html b/docs/Classes/SDLSubscribeVehicleData.html
index b05250530..179de011f 100644
--- a/docs/Classes/SDLSubscribeVehicleData.html
+++ b/docs/Classes/SDLSubscribeVehicleData.html
@@ -5,6 +5,7 @@
<ul>
<li><a href="#section--initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:">-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:</a></li>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -13,6 +14,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-prndl">prndl</a></li>
<li><a href="#section-tirePressure">tirePressure</a></li>
@@ -40,6 +42,7 @@
<li><a href="#section-cloudAppVehicleID">cloudAppVehicleID</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -288,6 +291,127 @@
<p>A SDLSubscribeVehicleData object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for subscribing to all possible vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModeStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModeStatus</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">clusterModeStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModeStatus</dt>
+ <dd><p>- clusterModeStatus</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSubscribeVehicleData object</p>
+ </div>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -434,11 +558,34 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>A boolean value. If true, subscribes External Temperature data.</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>
+
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -947,4 +1094,24 @@
<p>The state of an OEM custom vehicle data item for the given vehicle data name.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLSubscribeVehicleDataResponse.html b/docs/Classes/SDLSubscribeVehicleDataResponse.html
index 2716bfa72..6d4fdb6a7 100644
--- a/docs/Classes/SDLSubscribeVehicleDataResponse.html
+++ b/docs/Classes/SDLSubscribeVehicleDataResponse.html
@@ -4,6 +4,7 @@
<ul>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -12,6 +13,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-prndl">prndl</a></li>
<li><a href="#section-tirePressure">tirePressure</a></li>
@@ -39,6 +41,7 @@
<li><a href="#section-cloudAppVehicleID">cloudAppVehicleID</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -169,6 +172,128 @@
<p>A SDLSubscribeVehicleDataResponse object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for setting all possible values on vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModes</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModes</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">clusterModes</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModes</dt>
+ <dd><p>- clusterModes</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLSubscribeVehicleDataResponse object</p>
+ </div>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -329,13 +454,34 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>The result of requesting to subscribe to the external temperature in degrees celsius.</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -885,4 +1031,24 @@
<p>SDLVehicleDataResult An object containing custom data type and result code information.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLSystemCapabilityManager.html b/docs/Classes/SDLSystemCapabilityManager.html
index bd34ac76c..9868f4d82 100644
--- a/docs/Classes/SDLSystemCapabilityManager.html
+++ b/docs/Classes/SDLSystemCapabilityManager.html
@@ -601,7 +601,7 @@
<dl>
<dt>windowID</dt>
<dd><p>The ID of the window from which to get capabilities
-@returns The window window capabilities of the window with the specified windowID, or nil if the window is not known or no window capabilities exist.</p></dd>
+@returns The window capabilities of the window with the specified windowID, or nil if the window is not known or no window capabilities exist.</p></dd>
</dl>
<h3 id="section--isCapabilitySupported:">
diff --git a/docs/Classes/SDLSystemInfo.html b/docs/Classes/SDLSystemInfo.html
new file mode 100644
index 000000000..2bf12a9d1
--- /dev/null
+++ b/docs/Classes/SDLSystemInfo.html
@@ -0,0 +1,141 @@
+<h1>SDLSystemInfo Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-vehicleType">vehicleType</a></li>
+ <li><a href="#section-systemSoftwareVersion">systemSoftwareVersion</a></li>
+ <li><a href="#section-systemHardwareVersion">systemHardwareVersion</a></li>
+ <li><a href="#section--initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:">-initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:</a></li>
+ <li><a href="#section--initWithVehicleType:softwareVersion:hardwareVersion:">-initWithVehicleType:softwareVersion:hardwareVersion:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-vehicleType">
+ vehicleType
+ </h3>
+
+ <p>The connected module&rsquo;s vehicle type: it&rsquo;s make, model, trim, and model year</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVehicleType.html">SDLVehicleType</a></span> <span class="o">*</span><span class="n">vehicleType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">vehicleType</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleType.html">SDLVehicleType</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-systemSoftwareVersion">
+ systemSoftwareVersion
+ </h3>
+
+ <p>The connected module&rsquo;s software version</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">systemSoftwareVersion</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">systemSoftwareVersion</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-systemHardwareVersion">
+ systemHardwareVersion
+ </h3>
+
+ <p>The connected module&rsquo;s hardware version</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">systemHardwareVersion</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">systemHardwareVersion</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:">
+ -initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:
+ </h3>
+
+ <p>Initialize a system info object with individual pieces</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMake</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">make</span>
+ <span class="nf">model</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">model</span>
+ <span class="nf">trim</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">trim</span>
+ <span class="nf">modelYear</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">modelYear</span>
+ <span class="nf">softwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">softwareVersion</span>
+ <span class="nf">hardwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">hardwareVersion</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">make</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">model</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">trim</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">modelYear</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">softwareVersion</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">hardwareVersion</span><span class="p">:</span> <span class="kt">String</span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>make</dt>
+ <dd><p>The vehicle&rsquo;s make</p></dd>
+ <dt>model</dt>
+ <dd><p>The vehicle&rsquo;s model</p></dd>
+ <dt>trim</dt>
+ <dd><p>The vehicle&rsquo;s trim</p></dd>
+ <dt>modelYear</dt>
+ <dd><p>The vehicle&rsquo;s model year</p></dd>
+ <dt>softwareVersion</dt>
+ <dd><p>The vehicle&rsquo;s software version</p></dd>
+ <dt>hardwareVersion</dt>
+ <dd><p>The vehicle&rsquo;s hardware version</p></dd>
+ </dl>
+
+ <h3 id="section--initWithVehicleType:softwareVersion:hardwareVersion:">
+ -initWithVehicleType:softwareVersion:hardwareVersion:
+ </h3>
+
+ <p>Initialize a system info object with the vehicle type and versions</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithVehicleType</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleType.html">SDLVehicleType</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">vehicleType</span>
+ <span class="nf">softwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">softwareVersion</span>
+ <span class="nf">hardwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">hardwareVersion</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">vehicleType</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleType.html">SDLVehicleType</a></span><span class="p">?,</span> <span class="nv">softwareVersion</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">hardwareVersion</span><span class="p">:</span> <span class="kt">String</span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>vehicleType</dt>
+ <dd><p>The vehicle information</p></dd>
+ <dt>softwareVersion</dt>
+ <dd><p>The vehicle&rsquo;s software version</p></dd>
+ <dt>hardwareVersion</dt>
+ <dd><p>The vehicle&rsquo;s hardware version</p></dd>
+ </dl>
+
+</section>
diff --git a/docs/Classes/SDLTTSChunk.html b/docs/Classes/SDLTTSChunk.html
index 0b7d9a233..abe936d78 100644
--- a/docs/Classes/SDLTTSChunk.html
+++ b/docs/Classes/SDLTTSChunk.html
@@ -18,7 +18,7 @@
<p>Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).</p>
-<p>In SDL, words, and therefore sentences, can be built up from phonemes and are used to explicitly provide the proper pronounciation to the TTS engine. For example, to have SDL pronounce the word &ldquo;read&rdquo; as &ldquo;red&rdquo;, rather than as when it is pronounced like &ldquo;reed&rdquo;, the developer would use phonemes to express this desired pronounciation.</p>
+<p>In SDL, words, and therefore sentences, can be built up from phonemes and are used to explicitly provide the proper pronunciation to the TTS engine. For example, to have SDL pronounce the word &ldquo;read&rdquo; as &ldquo;red&rdquo;, rather than as when it is pronounced like &ldquo;reed&rdquo;, the developer would use phonemes to express this desired pronunciation.</p>
<p>For more information about phonemes, see <a href="http://en.wikipedia.org/wiki/Phoneme"><a href="http://en.wikipedia.org/wiki/Phoneme">http://en.wikipedia.org/wiki/Phoneme</a></a>.</p>
diff --git a/docs/Classes/SDLTemplateConfiguration.html b/docs/Classes/SDLTemplateConfiguration.html
index 7f258a053..6ad356940 100644
--- a/docs/Classes/SDLTemplateConfiguration.html
+++ b/docs/Classes/SDLTemplateConfiguration.html
@@ -70,7 +70,7 @@
-initWithTemplate:dayColorScheme:nightColorScheme:
</h3>
- <p>Convinience constructor with all the parameters.</p>
+ <p>Convenience constructor with all the parameters.</p>
diff --git a/docs/Classes/SDLTextField.html b/docs/Classes/SDLTextField.html
index 453ff6e33..f73762baf 100644
--- a/docs/Classes/SDLTextField.html
+++ b/docs/Classes/SDLTextField.html
@@ -105,7 +105,7 @@
-initWithName:characterSet:width:rows:
</h3>
- <p>Convenience initalizer for the TextField RPC struct</p>
+ <p>Convenience initializer for the TextField RPC struct</p>
diff --git a/docs/Classes/SDLTireStatus.html b/docs/Classes/SDLTireStatus.html
index 7f73d02ff..658199dac 100644
--- a/docs/Classes/SDLTireStatus.html
+++ b/docs/Classes/SDLTireStatus.html
@@ -142,7 +142,7 @@
innerRightRear
</h3>
- <p>The status of the innter right rear tire.</p>
+ <p>The status of the inner right rear tire.</p>
<p>Required</p>
diff --git a/docs/Classes/SDLTouch.html b/docs/Classes/SDLTouch.html
index 239d26845..10d0b0b75 100644
--- a/docs/Classes/SDLTouch.html
+++ b/docs/Classes/SDLTouch.html
@@ -90,7 +90,7 @@ Instance of SDLTouch.</p>
</h3>
<p>@abstract
- Timestamp in which the touch occured.</p>
+ Timestamp in which the touch occurred.</p>
diff --git a/docs/Classes/SDLUnsubscribeVehicleData.html b/docs/Classes/SDLUnsubscribeVehicleData.html
index 2225366a3..cb06c8a0d 100644
--- a/docs/Classes/SDLUnsubscribeVehicleData.html
+++ b/docs/Classes/SDLUnsubscribeVehicleData.html
@@ -5,6 +5,7 @@
<ul>
<li><a href="#section--initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:">-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:</a></li>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -13,6 +14,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-prndl">prndl</a></li>
<li><a href="#section-tirePressure">tirePressure</a></li>
@@ -40,6 +42,7 @@
<li><a href="#section-cloudAppVehicleID">cloudAppVehicleID</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -287,6 +290,127 @@
<p>A SDLUnsubscribeVehicleData object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for unsubscribing from all possible vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModeStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModeStatus</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">clusterModeStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModeStatus</dt>
+ <dd><p>- clusterModeStatus</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLUnsubscribeVehicleData object</p>
+ </div>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -433,11 +557,34 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>If true, unsubscribes from External Temperature</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>
+
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -946,4 +1093,24 @@
<p>A boolean value indicating if an unsubscribe request will occur for the OEM custom vehicle data item.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLUnsubscribeVehicleDataResponse.html b/docs/Classes/SDLUnsubscribeVehicleDataResponse.html
index 212772d15..6e1b2c2f8 100644
--- a/docs/Classes/SDLUnsubscribeVehicleDataResponse.html
+++ b/docs/Classes/SDLUnsubscribeVehicleDataResponse.html
@@ -4,6 +4,7 @@
<ul>
<li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:</a></li>
+ <li><a href="#section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:">-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:</a></li>
<li><a href="#section-gearStatus">gearStatus</a></li>
<li><a href="#section-gps">gps</a></li>
<li><a href="#section-speed">speed</a></li>
@@ -12,6 +13,7 @@
<li><a href="#section-fuelLevel_State">fuelLevel_State</a></li>
<li><a href="#section-fuelRange">fuelRange</a></li>
<li><a href="#section-instantFuelConsumption">instantFuelConsumption</a></li>
+ <li><a href="#section-climateData">climateData</a></li>
<li><a href="#section-externalTemperature">externalTemperature</a></li>
<li><a href="#section-prndl">prndl</a></li>
<li><a href="#section-tirePressure">tirePressure</a></li>
@@ -39,6 +41,7 @@
<li><a href="#section-cloudAppVehicleID">cloudAppVehicleID</a></li>
<li><a href="#section--setOEMCustomVehicleData:withVehicleDataState:">-setOEMCustomVehicleData:withVehicleDataState:</a></li>
<li><a href="#section--getOEMCustomVehicleData:">-getOEMCustomVehicleData:</a></li>
+ <li><a href="#section-seatOccupancy">seatOccupancy</a></li>
</ul>
<h3>Overview</h3>
@@ -169,6 +172,128 @@
<p>A SDLUnsubscribeVehicleDataResponse object</p>
</div>
+ <h3 id="section--initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:">
+ -initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:
+ </h3>
+
+ <p>Convenience init for setting all possible values on vehicle data items.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithGps</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gps</span>
+ <span class="nf">speed</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">speed</span>
+ <span class="nf">rpm</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">rpm</span>
+ <span class="nf">instantFuelConsumption</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">instantFuelConsumption</span>
+ <span class="nf">fuelRange</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fuelRange</span>
+ <span class="nf">climateData</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">climateData</span>
+ <span class="nf">turnSignal</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">turnSignal</span>
+ <span class="nf">gearStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">gearStatus</span>
+ <span class="nf">tirePressure</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">tirePressure</span>
+ <span class="nf">odometer</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">odometer</span>
+ <span class="nf">beltStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">beltStatus</span>
+ <span class="nf">bodyInformation</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">bodyInformation</span>
+ <span class="nf">deviceStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">deviceStatus</span>
+ <span class="nf">driverBraking</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">driverBraking</span>
+ <span class="nf">wiperStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">wiperStatus</span>
+ <span class="nf">headLampStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">headLampStatus</span>
+ <span class="nf">engineTorque</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">engineTorque</span>
+ <span class="nf">accPedalPosition</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">accPedalPosition</span>
+ <span class="nf">steeringWheelAngle</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">steeringWheelAngle</span>
+ <span class="nf">engineOilLife</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">engineOilLife</span>
+ <span class="nf">electronicParkBrakeStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">electronicParkBrakeStatus</span>
+ <span class="nf">cloudAppVehicleID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">cloudAppVehicleID</span>
+ <span class="nf">stabilityControlsStatus</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">stabilityControlsStatus</span>
+ <span class="nf">eCallInfo</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">eCallInfo</span>
+ <span class="nf">airbagStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">airbagStatus</span>
+ <span class="nf">emergencyEvent</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">emergencyEvent</span>
+ <span class="nf">clusterModes</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">clusterModes</span>
+ <span class="nf">myKey</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">myKey</span>
+ <span class="nf">windowStatus</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">windowStatus</span>
+ <span class="nf">handsOffSteering</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">handsOffSteering</span>
+ <span class="nf">seatOccupancy</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">gps</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">speed</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">rpm</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">instantFuelConsumption</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">fuelRange</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">turnSignal</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">gearStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">tirePressure</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">odometer</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">beltStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">bodyInformation</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">deviceStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">driverBraking</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">wiperStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">headLampStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">engineTorque</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">accPedalPosition</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">steeringWheelAngle</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">engineOilLife</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">electronicParkBrakeStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">cloudAppVehicleID</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">stabilityControlsStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">eCallInfo</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">airbagStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">emergencyEvent</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">clusterModes</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">myKey</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">windowStatus</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">handsOffSteering</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?,</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>gps</dt>
+ <dd><p>- gps</p></dd>
+ <dt>speed</dt>
+ <dd><p>- speed</p></dd>
+ <dt>rpm</dt>
+ <dd><p>- rpm</p></dd>
+ <dt>instantFuelConsumption</dt>
+ <dd><p>- instantFuelConsumption</p></dd>
+ <dt>fuelRange</dt>
+ <dd><p>- fuelRange</p></dd>
+ <dt>climateData</dt>
+ <dd><p>- climateData</p></dd>
+ <dt>turnSignal</dt>
+ <dd><p>- turnSignal</p></dd>
+ <dt>gearStatus</dt>
+ <dd><p>- gearStatus</p></dd>
+ <dt>tirePressure</dt>
+ <dd><p>- tirePressure</p></dd>
+ <dt>odometer</dt>
+ <dd><p>- odometer</p></dd>
+ <dt>beltStatus</dt>
+ <dd><p>- beltStatus</p></dd>
+ <dt>bodyInformation</dt>
+ <dd><p>- bodyInformation</p></dd>
+ <dt>deviceStatus</dt>
+ <dd><p>- deviceStatus</p></dd>
+ <dt>driverBraking</dt>
+ <dd><p>- driverBraking</p></dd>
+ <dt>wiperStatus</dt>
+ <dd><p>- wiperStatus</p></dd>
+ <dt>headLampStatus</dt>
+ <dd><p>- headLampStatus</p></dd>
+ <dt>engineTorque</dt>
+ <dd><p>- engineTorque</p></dd>
+ <dt>accPedalPosition</dt>
+ <dd><p>- accPedalPosition</p></dd>
+ <dt>steeringWheelAngle</dt>
+ <dd><p>- steeringWheelAngle</p></dd>
+ <dt>engineOilLife</dt>
+ <dd><p>- engineOilLife</p></dd>
+ <dt>electronicParkBrakeStatus</dt>
+ <dd><p>- electronicParkBrakeStatus</p></dd>
+ <dt>cloudAppVehicleID</dt>
+ <dd><p>- cloudAppVehicleID</p></dd>
+ <dt>stabilityControlsStatus</dt>
+ <dd><p>- stabilityControlsStatus</p></dd>
+ <dt>eCallInfo</dt>
+ <dd><p>- eCallInfo</p></dd>
+ <dt>airbagStatus</dt>
+ <dd><p>- airbagStatus</p></dd>
+ <dt>emergencyEvent</dt>
+ <dd><p>- emergencyEvent</p></dd>
+ <dt>clusterModes</dt>
+ <dd><p>- clusterModes</p></dd>
+ <dt>myKey</dt>
+ <dd><p>- myKey</p></dd>
+ <dt>windowStatus</dt>
+ <dd><p>- windowStatus</p></dd>
+ <dt>handsOffSteering</dt>
+ <dd><p>- handsOffSteering</p></dd>
+ <dt>seatOccupancy</dt>
+ <dd><p>- seatOccupancy</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLUnsubscribeVehicleDataResponse object</p>
+ </div>
+
<h3 id="section-gearStatus">
gearStatus
</h3>
@@ -329,13 +454,34 @@
+ <h3 id="section-climateData">
+ climateData
+ </h3>
+
+ <p>See ClimateData</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="n">climateData</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">climateData</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-externalTemperature">
externalTemperature
</h3>
- <p>The result of requesting to unsubscribe to the external temperature in degrees celsius.</p>
+ <p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>
-<p>Optional</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 2.0.0</p>
@@ -885,4 +1031,24 @@
<p>SDLVehicleDataResult object containing custom data type and result code information.</p>
</div>
+ <h3 id="section-seatOccupancy">
+ seatOccupancy
+ </h3>
+
+ <p>See SeatOccupancy</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span> <span class="o">*</span><span class="n">seatOccupancy</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLVehicleDataResult.html">SDLVehicleDataResult</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLVehicleType.html b/docs/Classes/SDLVehicleType.html
index 84f72b82c..6e5299711 100644
--- a/docs/Classes/SDLVehicleType.html
+++ b/docs/Classes/SDLVehicleType.html
@@ -7,6 +7,7 @@
<li><a href="#section-model">model</a></li>
<li><a href="#section-modelYear">modelYear</a></li>
<li><a href="#section-trim">trim</a></li>
+ <li><a href="#section--initWithMake:model:modelYear:trim:">-initWithMake:model:modelYear:trim:</a></li>
</ul>
<h3>Overview</h3>
@@ -105,4 +106,40 @@
+ <h3 id="section--initWithMake:model:modelYear:trim:">
+ -initWithMake:model:modelYear:trim:
+ </h3>
+
+ <p>Initialize the object</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMake</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">make</span>
+ <span class="nf">model</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">model</span>
+ <span class="nf">modelYear</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">modelYear</span>
+ <span class="nf">trim</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">trim</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">make</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">model</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">modelYear</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">trim</span><span class="p">:</span> <span class="kt">String</span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>make</dt>
+ <dd><p>- make</p></dd>
+ <dt>model</dt>
+ <dd><p>- model</p></dd>
+ <dt>modelYear</dt>
+ <dd><p>- modelYear</p></dd>
+ <dt>trim</dt>
+ <dd><p>- trim</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLVehicleType object</p>
+ </div>
+
</section>
diff --git a/docs/Classes/SDLVideoStreamingCapability.html b/docs/Classes/SDLVideoStreamingCapability.html
index 7b7245365..8034acfb8 100644
--- a/docs/Classes/SDLVideoStreamingCapability.html
+++ b/docs/Classes/SDLVideoStreamingCapability.html
@@ -4,6 +4,7 @@
<ul>
<li><a href="#section--initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:">-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:</a></li>
+ <li><a href="#section--initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:">-initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:</a></li>
<li><a href="#section-preferredResolution">preferredResolution</a></li>
<li><a href="#section-maxBitrate">maxBitrate</a></li>
<li><a href="#section-supportedFormats">supportedFormats</a></li>
@@ -11,6 +12,8 @@
<li><a href="#section-diagonalScreenSize">diagonalScreenSize</a></li>
<li><a href="#section-pixelPerInch">pixelPerInch</a></li>
<li><a href="#section-scale">scale</a></li>
+ <li><a href="#section-additionalVideoStreamingCapabilities">additionalVideoStreamingCapabilities</a></li>
+ <li><a href="#section-preferredFPS">preferredFPS</a></li>
</ul>
<h3>Overview</h3>
@@ -67,6 +70,59 @@
<p>A SDLVideoStreamingCapability object</p>
</div>
+ <h3 id="section--initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:">
+ -initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:
+ </h3>
+
+ <p>Convenience init for creating a video streaming capability with all parameters.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithPreferredResolution</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">preferredResolution</span>
+ <span class="nf">maxBitrate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">maxBitrate</span>
+ <span class="nf">supportedFormats</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLVideoStreamingFormat.html">SDLVideoStreamingFormat</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats">supportedFormats</a></span>
+ <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported">hapticSpatialDataSupported</a></span><span class="o">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported">hapticSpatialDataSupported</a></span>
+ <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)diagonalScreenSize">diagonalScreenSize</a></span><span class="o">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)diagonalScreenSize">diagonalScreenSize</a></span>
+ <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)pixelPerInch">pixelPerInch</a></span><span class="o">:</span><span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)pixelPerInch">pixelPerInch</a></span>
+ <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)scale">scale</a></span><span class="o">:</span><span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)scale">scale</a></span>
+ <span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredFPS">preferredFPS</a></span><span class="o">:</span><span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredFPS">preferredFPS</a></span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">preferredResolution</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span><span class="p">?,</span> <span class="nv">maxBitrate</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">supportedFormats</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLVideoStreamingFormat.html">SDLVideoStreamingFormat</a></span><span class="p">]?,</span> <span class="nv">hapticSpatialDataSupported</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="p">)?,</span> <span class="nv">diagonalScreenSize</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">pixelPerInch</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">scale</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="p">)?,</span> <span class="nv">preferredFPS</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>preferredResolution</dt>
+ <dd><p>- preferredResolution</p></dd>
+ <dt>maxBitrate</dt>
+ <dd><p>- maxBitrate</p></dd>
+ <dt>supportedFormats</dt>
+ <dd><p>- supportedFormats</p></dd>
+ <dt>hapticSpatialDataSupported</dt>
+ <dd><p>- hapticSpatialDataSupported</p></dd>
+ <dt>diagonalScreenSize</dt>
+ <dd><p>- diagonalScreenSize</p></dd>
+ <dt>pixelPerInch</dt>
+ <dd><p>- pixelPerInch</p></dd>
+ <dt>scale</dt>
+ <dd><p>- scale</p></dd>
+ <dt>preferredFPS</dt>
+ <dd><p>- preferredFPS</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLVideoStreamingCapability object</p>
+ </div>
+
<h3 id="section-preferredResolution">
preferredResolution
</h3>
@@ -210,4 +266,50 @@
+ <h3 id="section-additionalVideoStreamingCapabilities">
+ additionalVideoStreamingCapabilities
+ </h3>
+
+ <p>{&ldquo;array_min_size&rdquo;: 1, &ldquo;array_max_size&rdquo;: 100}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+<div class="aside aside-note">
+ <p class="aside-title">Note</p>
+ can be recursive under certain circumstances
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">SDLVideoStreamingCapability</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">additionalVideoStreamingCapabilities</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">additionalVideoStreamingCapabilities</span><span class="p">:</span> <span class="p">[</span><span class="kt">SDLVideoStreamingCapability</span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-preferredFPS">
+ preferredFPS
+ </h3>
+
+ <p>The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.
+ {&ldquo;num_min_value&rdquo;: 0, &ldquo;num_max_value&rdquo;: 2147483647}</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">preferredFPS</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">preferredFPS</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Classes/SDLVideoStreamingRange.html b/docs/Classes/SDLVideoStreamingRange.html
new file mode 100644
index 000000000..d264252d4
--- /dev/null
+++ b/docs/Classes/SDLVideoStreamingRange.html
@@ -0,0 +1,185 @@
+<h1>SDLVideoStreamingRange Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-minimumAspectRatio">minimumAspectRatio</a></li>
+ <li><a href="#section-maximumAspectRatio">maximumAspectRatio</a></li>
+ <li><a href="#section-minimumDiagonal">minimumDiagonal</a></li>
+ <li><a href="#section-minimumResolution">minimumResolution</a></li>
+ <li><a href="#section-maximumResolution">maximumResolution</a></li>
+ <li><a href="#section--isImageResolutionInRange:">-isImageResolutionInRange:</a></li>
+ <li><a href="#section--isAspectRatioInRange:">-isAspectRatioInRange:</a></li>
+ <li><a href="#section--initWithMinimumResolution:maximumResolution:">-initWithMinimumResolution:maximumResolution:</a></li>
+ <li><a href="#section-+disabled">+disabled</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-minimumAspectRatio">
+ minimumAspectRatio
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="kt">float</span> <span class="n">minimumAspectRatio</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">minimumAspectRatio</span><span class="p">:</span> <span class="kt">Float</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-maximumAspectRatio">
+ maximumAspectRatio
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="kt">float</span> <span class="n">maximumAspectRatio</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">maximumAspectRatio</span><span class="p">:</span> <span class="kt">Float</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-minimumDiagonal">
+ minimumDiagonal
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">)</span> <span class="kt">float</span> <span class="n">minimumDiagonal</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">minimumDiagonal</span><span class="p">:</span> <span class="kt">Float</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-minimumResolution">
+ minimumResolution
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="n">minimumResolution</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">minimumResolution</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-maximumResolution">
+ maximumResolution
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="n">maximumResolution</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">maximumResolution</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--isImageResolutionInRange:">
+ -isImageResolutionInRange:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isImageResolutionInRange</span><span class="p">:(</span><span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">imageResolution</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">isImageResolution</span><span class="p">(</span><span class="n">inRange</span> <span class="nv">imageResolution</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+
+ <h3 id="section--isAspectRatioInRange:">
+ -isAspectRatioInRange:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isAspectRatioInRange</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">aspectRatio</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">isAspectRatio</span><span class="p">(</span><span class="n">inRange</span> <span class="nv">aspectRatio</span><span class="p">:</span> <span class="kt">Float</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithMinimumResolution:maximumResolution:">
+ -initWithMinimumResolution:maximumResolution:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMinimumResolution</span><span class="p">:(</span><span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">minResolution</span> <span class="nf">maximumResolution</span><span class="p">:(</span><span class="n"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">maxResolution</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="n"><a href="../Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumResolution">minimumResolution</a></span> <span class="nv">minResolution</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span><span class="p">,</span> <span class="n"><a href="../Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumResolution">maximumResolution</a></span> <span class="nv">maxResolution</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLImageResolution.html">SDLImageResolution</a></span><span class="p">)</span></code></pre>
+
+
+
+
+ <h3 id="section-+disabled">
+ +disabled
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">+</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">disabled</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">disabled</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLWeatherServiceManifest.html b/docs/Classes/SDLWeatherServiceManifest.html
index 8af975252..a1fcc35e3 100644
--- a/docs/Classes/SDLWeatherServiceManifest.html
+++ b/docs/Classes/SDLWeatherServiceManifest.html
@@ -42,7 +42,7 @@
<h4>Parameters</h4>
<dl>
<dt>currentForecastSupported</dt>
- <dd><p>Whether or not the current forcast is supported.</p></dd>
+ <dd><p>Whether or not the current forecast is supported.</p></dd>
<dt>maxMultidayForecastAmount</dt>
<dd><p>The maximum number of day-by-day forecasts.</p></dd>
<dt>maxHourlyForecastAmount</dt>
@@ -61,7 +61,7 @@
currentForecastSupported
</h3>
- <p>Whether or not the current forcast is supported.</p>
+ <p>Whether or not the current forecast is supported.</p>
<p>Boolean, Optional</p>
diff --git a/docs/Classes/SDLWindowCapability.html b/docs/Classes/SDLWindowCapability.html
index c9eab4057..213c4e208 100644
--- a/docs/Classes/SDLWindowCapability.html
+++ b/docs/Classes/SDLWindowCapability.html
@@ -4,6 +4,7 @@
<ul>
<li><a href="#section--initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:">-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:</a></li>
+ <li><a href="#section--initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:">-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:</a></li>
<li><a href="#section-windowID">windowID</a></li>
<li><a href="#section-textFields">textFields</a></li>
<li><a href="#section-imageFields">imageFields</a></li>
@@ -14,6 +15,7 @@
<li><a href="#section-softButtonCapabilities">softButtonCapabilities</a></li>
<li><a href="#section-menuLayoutsAvailable">menuLayoutsAvailable</a></li>
<li><a href="#section-dynamicUpdateCapabilities">dynamicUpdateCapabilities</a></li>
+ <li><a href="#section-keyboardCapabilities">keyboardCapabilities</a></li>
</ul>
<h3>Overview</h3>
@@ -84,6 +86,70 @@
<p>A SDLWindowCapability object</p>
</div>
+ <h3 id="section--initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:">
+ -initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:
+ </h3>
+
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+ <span class="nf">initWithWindowID</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLInt">SDLInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">windowID</span>
+ <span class="nf">textFields</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLTextField.html">SDLTextField</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">textFields</span>
+ <span class="nf">imageFields</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLImageField.html">SDLImageField</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">imageFields</span>
+ <span class="nf">imageTypeSupported</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Type%20Definitions.html#/c:SDLImageType.h@T@SDLImageType">SDLImageType</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">imageTypeSupported</span>
+ <span class="nf">templatesAvailable</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">templatesAvailable</span>
+ <span class="nf">numCustomPresetsAvailable</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">numCustomPresetsAvailable</span>
+ <span class="nf">buttonCapabilities</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLButtonCapabilities.html">SDLButtonCapabilities</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">buttonCapabilities</span>
+ <span class="nf">softButtonCapabilities</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLSoftButtonCapabilities.html">SDLSoftButtonCapabilities</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)softButtonCapabilities">softButtonCapabilities</a></span>
+ <span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)menuLayoutsAvailable">menuLayoutsAvailable</a></span><span class="o">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout">SDLMenuLayout</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)menuLayoutsAvailable">menuLayoutsAvailable</a></span>
+ <span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)dynamicUpdateCapabilities">dynamicUpdateCapabilities</a></span><span class="o">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLDynamicUpdateCapabilities.html">SDLDynamicUpdateCapabilities</a></span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)dynamicUpdateCapabilities">dynamicUpdateCapabilities</a></span>
+ <span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)keyboardCapabilities">keyboardCapabilities</a></span><span class="o">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLKeyboardCapabilities.html">SDLKeyboardCapabilities</a></span> <span class="o">*</span><span class="p">)</span><span class="n"><a href="../Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)keyboardCapabilities">keyboardCapabilities</a></span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="nv">windowID</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLInt">SDLInt</a></span><span class="p">)?,</span> <span class="nv">textFields</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLTextField.html">SDLTextField</a></span><span class="p">]?,</span> <span class="nv">imageFields</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLImageField.html">SDLImageField</a></span><span class="p">]?,</span> <span class="nv">imageTypeSupported</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Type%20Definitions.html#/c:SDLImageType.h@T@SDLImageType">SDLImageType</a></span><span class="p">]?,</span> <span class="nv">templatesAvailable</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?,</span> <span class="nv">numCustomPresetsAvailable</span><span class="p">:</span> <span class="p">(</span><span class="kt">NSNumber</span> <span class="o">&amp;</span> <span class="kt"><a href="../Protocols.html#/c:objc(pl)SDLUInt">SDLUInt</a></span><span class="p">)?,</span> <span class="nv">buttonCapabilities</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLButtonCapabilities.html">SDLButtonCapabilities</a></span><span class="p">]?,</span> <span class="nv">softButtonCapabilities</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLSoftButtonCapabilities.html">SDLSoftButtonCapabilities</a></span><span class="p">]?,</span> <span class="nv">menuLayoutsAvailable</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout">SDLMenuLayout</a></span><span class="p">]?,</span> <span class="nv">dynamicUpdateCapabilities</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLDynamicUpdateCapabilities.html">SDLDynamicUpdateCapabilities</a></span><span class="p">?,</span> <span class="nv">keyboardCapabilities</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLKeyboardCapabilities.html">SDLKeyboardCapabilities</a></span><span class="p">?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>windowID</dt>
+ <dd><p>- windowID</p></dd>
+ <dt>textFields</dt>
+ <dd><p>- textFields</p></dd>
+ <dt>imageFields</dt>
+ <dd><p>- imageFields</p></dd>
+ <dt>imageTypeSupported</dt>
+ <dd><p>- imageTypeSupported</p></dd>
+ <dt>templatesAvailable</dt>
+ <dd><p>- templatesAvailable</p></dd>
+ <dt>numCustomPresetsAvailable</dt>
+ <dd><p>- numCustomPresetsAvailable</p></dd>
+ <dt>buttonCapabilities</dt>
+ <dd><p>- buttonCapabilities</p></dd>
+ <dt>softButtonCapabilities</dt>
+ <dd><p>- softButtonCapabilities</p></dd>
+ <dt>menuLayoutsAvailable</dt>
+ <dd><p>- menuLayoutsAvailable</p></dd>
+ <dt>dynamicUpdateCapabilities</dt>
+ <dd><p>- dynamicUpdateCapabilities</p></dd>
+ <dt>keyboardCapabilities</dt>
+ <dd><p>- keyboardCapabilities</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A SDLWindowCapability object</p>
+ </div>
+
<h3 id="section-windowID">
windowID
</h3>
@@ -284,4 +350,24 @@
+ <h3 id="section-keyboardCapabilities">
+ keyboardCapabilities
+ </h3>
+
+ <p>See KeyboardCapabilities</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLKeyboardCapabilities.html">SDLKeyboardCapabilities</a></span> <span class="o">*</span><span class="n">keyboardCapabilities</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">keyboardCapabilities</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLKeyboardCapabilities.html">SDLKeyboardCapabilities</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Constants.html b/docs/Constants.html
index b107b059f..7d0b10606 100644
--- a/docs/Constants.html
+++ b/docs/Constants.html
@@ -11,6 +11,7 @@
<li><a href="#section-SDLAmbientLightStatusDay">SDLAmbientLightStatusDay</a></li>
<li><a href="#section-SDLAmbientLightStatusUnknown">SDLAmbientLightStatusUnknown</a></li>
<li><a href="#section-SDLAmbientLightStatusInvalid">SDLAmbientLightStatusInvalid</a></li>
+ <li><a href="#section-SDLAppCapabilityTypeVideoStreaming">SDLAppCapabilityTypeVideoStreaming</a></li>
<li><a href="#section-SDLAppHMITypeDefault">SDLAppHMITypeDefault</a></li>
<li><a href="#section-SDLAppHMITypeCommunication">SDLAppHMITypeCommunication</a></li>
<li><a href="#section-SDLAppHMITypeMedia">SDLAppHMITypeMedia</a></li>
@@ -167,6 +168,10 @@
<li><a href="#section-SDLDisplayTypeGeneric">SDLDisplayTypeGeneric</a></li>
<li><a href="#section-SDLDistanceUnitMiles">SDLDistanceUnitMiles</a></li>
<li><a href="#section-SDLDistanceUnitKilometers">SDLDistanceUnitKilometers</a></li>
+ <li><a href="#section-SDLDoorStatusTypeClosed">SDLDoorStatusTypeClosed</a></li>
+ <li><a href="#section-SDLDoorStatusTypeLocked">SDLDoorStatusTypeLocked</a></li>
+ <li><a href="#section-SDLDoorStatusTypeAjar">SDLDoorStatusTypeAjar</a></li>
+ <li><a href="#section-SDLDoorStatusTypeRemoved">SDLDoorStatusTypeRemoved</a></li>
<li><a href="#section-SDLDriverDistractionStateOn">SDLDriverDistractionStateOn</a></li>
<li><a href="#section-SDLDriverDistractionStateOff">SDLDriverDistractionStateOff</a></li>
<li><a href="#section-SDLECallConfirmationStatusNormal">SDLECallConfirmationStatusNormal</a></li>
@@ -191,6 +196,7 @@
<li><a href="#section-SDLErrorDomainAudioStreamManager">SDLErrorDomainAudioStreamManager</a></li>
<li><a href="#section-SDLErrorDomainCacheFileManager">SDLErrorDomainCacheFileManager</a></li>
<li><a href="#section-SDLErrorDomainChoiceSetManager">SDLErrorDomainChoiceSetManager</a></li>
+ <li><a href="#section-SDLErrorDomainAlertManager">SDLErrorDomainAlertManager</a></li>
<li><a href="#section-SDLErrorDomainEncryptionLifecycleManager">SDLErrorDomainEncryptionLifecycleManager</a></li>
<li><a href="#section-SDLErrorDomainFileManager">SDLErrorDomainFileManager</a></li>
<li><a href="#section-SDLErrorDomainLifecycleManager">SDLErrorDomainLifecycleManager</a></li>
@@ -260,6 +266,8 @@
<li><a href="#section-SDLImageFieldNameLocationImage">SDLImageFieldNameLocationImage</a></li>
<li><a href="#section-SDLImageFieldNameSubMenuIcon">SDLImageFieldNameSubMenuIcon</a></li>
<li><a href="#section-SDLImageFieldNameSubtleAlertIcon">SDLImageFieldNameSubtleAlertIcon</a></li>
+ <li><a href="#section-SDLImageFieldNameMenuCommandSecondaryImage">SDLImageFieldNameMenuCommandSecondaryImage</a></li>
+ <li><a href="#section-SDLImageFieldNameMenuSubMenuSecondaryImage">SDLImageFieldNameMenuSubMenuSecondaryImage</a></li>
<li><a href="#section-SDLImageTypeStatic">SDLImageTypeStatic</a></li>
<li><a href="#section-SDLImageTypeDynamic">SDLImageTypeDynamic</a></li>
<li><a href="#section-SDLInteractionModeManualOnly">SDLInteractionModeManualOnly</a></li>
@@ -270,9 +278,15 @@
<li><a href="#section-SDLKeyboardEventCancelled">SDLKeyboardEventCancelled</a></li>
<li><a href="#section-SDLKeyboardEventAborted">SDLKeyboardEventAborted</a></li>
<li><a href="#section-SDLKeyboardEventVoice">SDLKeyboardEventVoice</a></li>
+ <li><a href="#section-SDLKeyboardEventInputKeyMaskEnabled">SDLKeyboardEventInputKeyMaskEnabled</a></li>
+ <li><a href="#section-SDLKeyboardEventInputKeyMaskDisabled">SDLKeyboardEventInputKeyMaskDisabled</a></li>
+ <li><a href="#section-SDLKeyboardInputMaskEnableInputKeyMask">SDLKeyboardInputMaskEnableInputKeyMask</a></li>
+ <li><a href="#section-SDLKeyboardInputMaskDisableInputKeyMask">SDLKeyboardInputMaskDisableInputKeyMask</a></li>
+ <li><a href="#section-SDLKeyboardInputMaskUserChoiceInputKeyMask">SDLKeyboardInputMaskUserChoiceInputKeyMask</a></li>
<li><a href="#section-SDLKeyboardLayoutQWERTY">SDLKeyboardLayoutQWERTY</a></li>
<li><a href="#section-SDLKeyboardLayoutQWERTZ">SDLKeyboardLayoutQWERTZ</a></li>
<li><a href="#section-SDLKeyboardLayoutAZERTY">SDLKeyboardLayoutAZERTY</a></li>
+ <li><a href="#section-SDLKeyboardLayoutNumeric">SDLKeyboardLayoutNumeric</a></li>
<li><a href="#section-SDLKeypressModeSingleKeypress">SDLKeypressModeSingleKeypress</a></li>
<li><a href="#section-SDLKeypressModeQueueKeypresses">SDLKeypressModeQueueKeypresses</a></li>
<li><a href="#section-SDLKeypressModeResendCurrentEntry">SDLKeypressModeResendCurrentEntry</a></li>
@@ -701,6 +715,7 @@
<li><a href="#section-SDLRPCFunctionNameGetVehicleData">SDLRPCFunctionNameGetVehicleData</a></li>
<li><a href="#section-SDLRPCFunctionNameGetWayPoints">SDLRPCFunctionNameGetWayPoints</a></li>
<li><a href="#section-SDLRPCFunctionNameListFiles">SDLRPCFunctionNameListFiles</a></li>
+ <li><a href="#section-SDLRPCFunctionNameOnAppCapabilityUpdated">SDLRPCFunctionNameOnAppCapabilityUpdated</a></li>
<li><a href="#section-SDLRPCFunctionNameOnAppInterfaceUnregistered">SDLRPCFunctionNameOnAppInterfaceUnregistered</a></li>
<li><a href="#section-SDLRPCFunctionNameOnAppServiceData">SDLRPCFunctionNameOnAppServiceData</a></li>
<li><a href="#section-SDLRPCFunctionNameOnAudioPassThru">SDLRPCFunctionNameOnAudioPassThru</a></li>
@@ -841,6 +856,8 @@
<li><a href="#section-SDLSeatMemoryActionTypeSave">SDLSeatMemoryActionTypeSave</a></li>
<li><a href="#section-SDLSeatMemoryActionTypeRestore">SDLSeatMemoryActionTypeRestore</a></li>
<li><a href="#section-SDLSeatMemoryActionTypeNone">SDLSeatMemoryActionTypeNone</a></li>
+ <li><a href="#section-SDLSeekIndicatorTypeTrack">SDLSeekIndicatorTypeTrack</a></li>
+ <li><a href="#section-SDLSeekIndicatorTypeTime">SDLSeekIndicatorTypeTime</a></li>
<li><a href="#section-SDLServiceUpdateReasonPublished">SDLServiceUpdateReasonPublished</a></li>
<li><a href="#section-SDLServiceUpdatePublished">SDLServiceUpdatePublished</a></li>
<li><a href="#section-SDLServiceUpdateReasonRemoved">SDLServiceUpdateReasonRemoved</a></li>
@@ -869,6 +886,7 @@
<li><a href="#section-SDLStaticIconNameAudiobookEpisode">SDLStaticIconNameAudiobookEpisode</a></li>
<li><a href="#section-SDLStaticIconNameAudiobookNarrator">SDLStaticIconNameAudiobookNarrator</a></li>
<li><a href="#section-SDLStaticIconNameAuxillaryAudio">SDLStaticIconNameAuxillaryAudio</a></li>
+ <li><a href="#section-SDLStaticIconNameAuxiliaryAudio">SDLStaticIconNameAuxiliaryAudio</a></li>
<li><a href="#section-SDLStaticIconNameBack">SDLStaticIconNameBack</a></li>
<li><a href="#section-SDLStaticIconNameBatteryCapacity0Of5">SDLStaticIconNameBatteryCapacity0Of5</a></li>
<li><a href="#section-SDLStaticIconNameBatteryCapacity1Of5">SDLStaticIconNameBatteryCapacity1Of5</a></li>
@@ -1127,9 +1145,15 @@
<li><a href="#section-SDLTextFieldNameLocationDescription">SDLTextFieldNameLocationDescription</a></li>
<li><a href="#section-SDLTextFieldNameAddressLines">SDLTextFieldNameAddressLines</a></li>
<li><a href="#section-SDLTextFieldNamePhoneNumber">SDLTextFieldNamePhoneNumber</a></li>
+ <li><a href="#section-SDLTextFieldNameTimeToDestination">SDLTextFieldNameTimeToDestination</a></li>
+ <li><a href="#section-SDLTextFieldNameTurnText">SDLTextFieldNameTurnText</a></li>
<li><a href="#section-SDLTextFieldNameSubtleAlertText1">SDLTextFieldNameSubtleAlertText1</a></li>
<li><a href="#section-SDLTextFieldNameSubtleAlertText2">SDLTextFieldNameSubtleAlertText2</a></li>
<li><a href="#section-SDLTextFieldNameSubtleAlertSoftButtonText">SDLTextFieldNameSubtleAlertSoftButtonText</a></li>
+ <li><a href="#section-SDLTextFieldNameMenuCommandSecondaryText">SDLTextFieldNameMenuCommandSecondaryText</a></li>
+ <li><a href="#section-SDLTextFieldNameMenuCommandTertiaryText">SDLTextFieldNameMenuCommandTertiaryText</a></li>
+ <li><a href="#section-SDLTextFieldNameMenuSubMenuSecondaryText">SDLTextFieldNameMenuSubMenuSecondaryText</a></li>
+ <li><a href="#section-SDLTextFieldNameMenuSubMenuTertiaryText">SDLTextFieldNameMenuSubMenuTertiaryText</a></li>
<li><a href="#section-SDLTimerModeUp">SDLTimerModeUp</a></li>
<li><a href="#section-SDLTimerModeDown">SDLTimerModeDown</a></li>
<li><a href="#section-SDLTimerModeNone">SDLTimerModeNone</a></li>
@@ -1192,6 +1216,7 @@
<li><a href="#section-SDLVehicleDataTypeFuelLevelState">SDLVehicleDataTypeFuelLevelState</a></li>
<li><a href="#section-SDLVehicleDataTypeFuelConsumption">SDLVehicleDataTypeFuelConsumption</a></li>
<li><a href="#section-SDLVehicleDataTypeExternalTemperature">SDLVehicleDataTypeExternalTemperature</a></li>
+ <li><a href="#section-SDLVehicleDataTypeVehicleDataClimateData">SDLVehicleDataTypeVehicleDataClimateData</a></li>
<li><a href="#section-SDLVehicleDataTypeVIN">SDLVehicleDataTypeVIN</a></li>
<li><a href="#section-SDLVehicleDataTypePRNDL">SDLVehicleDataTypePRNDL</a></li>
<li><a href="#section-SDLVehicleDataTypeTirePressure">SDLVehicleDataTypeTirePressure</a></li>
@@ -1219,6 +1244,7 @@
<li><a href="#section-SDLVehicleDataTypeCloudAppVehicleID">SDLVehicleDataTypeCloudAppVehicleID</a></li>
<li><a href="#section-SDLVehicleDataTypeOEMVehicleDataType">SDLVehicleDataTypeOEMVehicleDataType</a></li>
<li><a href="#section-SDLVehicleDataTypeWindowStatus">SDLVehicleDataTypeWindowStatus</a></li>
+ <li><a href="#section-SDLVehicleDataTypeSeatOccupancy">SDLVehicleDataTypeSeatOccupancy</a></li>
<li><a href="#section-SDLVentilationModeUpper">SDLVentilationModeUpper</a></li>
<li><a href="#section-SDLVentilationModeLower">SDLVentilationModeLower</a></li>
<li><a href="#section-SDLVentilationModeBoth">SDLVentilationModeBoth</a></li>
@@ -1413,6 +1439,24 @@
+ <h3 id="section-SDLAppCapabilityTypeVideoStreaming">
+ SDLAppCapabilityTypeVideoStreaming
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span> <span class="k">const</span> <span class="n">SDLAppCapabilityTypeVideoStreaming</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">videoStreaming</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLAppHMITypeDefault">
SDLAppHMITypeDefault
</h3>
@@ -4265,6 +4309,78 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
+ <h3 id="section-SDLDoorStatusTypeClosed">
+ SDLDoorStatusTypeClosed
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeClosed</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">closed</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLDoorStatusTypeLocked">
+ SDLDoorStatusTypeLocked
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeLocked</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">locked</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLDoorStatusTypeAjar">
+ SDLDoorStatusTypeAjar
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeAjar</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">ajar</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLDoorStatusTypeRemoved">
+ SDLDoorStatusTypeRemoved
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeRemoved</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">removed</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLDriverDistractionStateOn">
SDLDriverDistractionStateOn
</h3>
@@ -4699,6 +4815,24 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
+ <h3 id="section-SDLErrorDomainAlertManager">
+ SDLErrorDomainAlertManager
+ </h3>
+
+ <p>An error in the SDLAlertManager subset of SDLScreenManager</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLErrorConstants.h@T@SDLErrorDomain">SDLErrorDomain</a></span> <span class="o">*</span><span class="k">const</span> <span class="n">SDLErrorDomainAlertManager</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLErrorDomainAlertManager</span><span class="p">:</span> <span class="kt">String</span></code></pre>
+
+
+
+
<h3 id="section-SDLErrorDomainEncryptionLifecycleManager">
SDLErrorDomainEncryptionLifecycleManager
</h3>
@@ -5964,6 +6098,46 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
+ <h3 id="section-SDLImageFieldNameMenuCommandSecondaryImage">
+ SDLImageFieldNameMenuCommandSecondaryImage
+ </h3>
+
+ <p>The secondary image field for AddCommand</p>
+
+<p>@added in SmartDeviceLink 7.0.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName">SDLImageFieldName</a></span> <span class="n">SDLImageFieldNameMenuCommandSecondaryImage</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">menuCommandSecondaryImage</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName">SDLImageFieldName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLImageFieldNameMenuSubMenuSecondaryImage">
+ SDLImageFieldNameMenuSubMenuSecondaryImage
+ </h3>
+
+ <p>The secondary image field for AddSubMenu</p>
+
+<p>@added in SmartDeviceLink 7.0.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName">SDLImageFieldName</a></span> <span class="n">SDLImageFieldNameMenuSubMenuSecondaryImage</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">menuSubMenuSecondaryImage</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName">SDLImageFieldName</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLImageTypeStatic">
SDLImageTypeStatic
</h3>
@@ -6161,6 +6335,96 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
+ <h3 id="section-SDLKeyboardEventInputKeyMaskEnabled">
+ SDLKeyboardEventInputKeyMaskEnabled
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent">SDLKeyboardEvent</a></span> <span class="n">SDLKeyboardEventInputKeyMaskEnabled</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">inputKeyMaskEnabled</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent">SDLKeyboardEvent</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLKeyboardEventInputKeyMaskDisabled">
+ SDLKeyboardEventInputKeyMaskDisabled
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent">SDLKeyboardEvent</a></span> <span class="n">SDLKeyboardEventInputKeyMaskDisabled</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">inputKeyMaskDisabled</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent">SDLKeyboardEvent</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLKeyboardInputMaskEnableInputKeyMask">
+ SDLKeyboardInputMaskEnableInputKeyMask
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="k">const</span> <span class="n">SDLKeyboardInputMaskEnableInputKeyMask</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">enableInputKeyMask</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLKeyboardInputMaskDisableInputKeyMask">
+ SDLKeyboardInputMaskDisableInputKeyMask
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="k">const</span> <span class="n">SDLKeyboardInputMaskDisableInputKeyMask</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">disableInputKeyMask</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLKeyboardInputMaskUserChoiceInputKeyMask">
+ SDLKeyboardInputMaskUserChoiceInputKeyMask
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="k">const</span> <span class="n">SDLKeyboardInputMaskUserChoiceInputKeyMask</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">userChoiceInputKeyMask</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLKeyboardLayoutQWERTY">
SDLKeyboardLayoutQWERTY
</h3>
@@ -6215,6 +6479,24 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
+ <h3 id="section-SDLKeyboardLayoutNumeric">
+ SDLKeyboardLayoutNumeric
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span> <span class="n">SDLKeyboardLayoutNumeric</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">numeric</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLKeypressModeSingleKeypress">
SDLKeypressModeSingleKeypress
</h3>
@@ -13996,6 +14278,24 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
+ <h3 id="section-SDLRPCFunctionNameOnAppCapabilityUpdated">
+ SDLRPCFunctionNameOnAppCapabilityUpdated
+ </h3>
+
+ <p>Function name for an OnAppCapabilityUpdated notification RPC</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span> <span class="n">SDLRPCFunctionNameOnAppCapabilityUpdated</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">onAppCapabilityUpdated</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLRPCFunctionNameOnAppInterfaceUnregistered">
SDLRPCFunctionNameOnAppInterfaceUnregistered
</h3>
@@ -16485,7 +16785,7 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
SDLSeatMemoryActionTypeSave
</h3>
- <p>@abstract Save current seat postions and settings to seat memory.</p>
+ <p>@abstract Save current seat positions and settings to seat memory.</p>
@@ -16535,6 +16835,42 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
+ <h3 id="section-SDLSeekIndicatorTypeTrack">
+ SDLSeekIndicatorTypeTrack
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="k">const</span> <span class="n">SDLSeekIndicatorTypeTrack</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">track</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLSeekIndicatorTypeTime">
+ SDLSeekIndicatorTypeTime
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="k">const</span> <span class="n">SDLSeekIndicatorTypeTime</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">time</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLServiceUpdateReasonPublished">
SDLServiceUpdateReasonPublished
</h3>
@@ -17025,7 +17361,7 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
SDLStaticIconNameAuxillaryAudio
</h3>
- <p>Static icon auxillary audio</p>
+ <p>Static icon auxiliary audio</p>
@@ -17039,6 +17375,24 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
+ <h3 id="section-SDLStaticIconNameAuxiliaryAudio">
+ SDLStaticIconNameAuxiliaryAudio
+ </h3>
+
+ <p>Static icon auxiliary audio</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName">SDLStaticIconName</a></span> <span class="n">SDLStaticIconNameAuxiliaryAudio</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">auxiliaryAudio</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName">SDLStaticIconName</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLStaticIconNameBack">
SDLStaticIconNameBack
</h3>
@@ -21313,6 +21667,9 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
<p>@discussion This field is commonly used to show elapsed or remaining time in an audio track or audio capture.</p>
+<p>@deprecated in SmartDeviceLink 7.1.0
+ @added in SmartDeviceLink 1.0.0</p>
+
<h4>Objective-C</h4>
@@ -21755,6 +22112,46 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
+ <h3 id="section-SDLTextFieldNameTimeToDestination">
+ SDLTextFieldNameTimeToDestination
+ </h3>
+
+ <p>Optional time to destination field for ShowConstantTBT</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span> <span class="n">SDLTextFieldNameTimeToDestination</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">timeToDestination</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLTextFieldNameTurnText">
+ SDLTextFieldNameTurnText
+ </h3>
+
+ <p>Turn text for turnList parameter of UpdateTurnList</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span> <span class="n">SDLTextFieldNameTurnText</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">turnText</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLTextFieldNameSubtleAlertText1">
SDLTextFieldNameSubtleAlertText1
</h3>
@@ -21815,6 +22212,86 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
+ <h3 id="section-SDLTextFieldNameMenuCommandSecondaryText">
+ SDLTextFieldNameMenuCommandSecondaryText
+ </h3>
+
+ <p>Secondary text for AddCommand</p>
+
+<p>@added in SmartDeviceLink 7.0.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span> <span class="n">SDLTextFieldNameMenuCommandSecondaryText</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">menuCommandSecondaryText</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLTextFieldNameMenuCommandTertiaryText">
+ SDLTextFieldNameMenuCommandTertiaryText
+ </h3>
+
+ <p>Tertiary text for AddCommand</p>
+
+<p>@added in SmartDeviceLink 7.0.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span> <span class="n">SDLTextFieldNameMenuCommandTertiaryText</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">menuCommandTertiaryText</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLTextFieldNameMenuSubMenuSecondaryText">
+ SDLTextFieldNameMenuSubMenuSecondaryText
+ </h3>
+
+ <p>Secondary text for AddSubMenu</p>
+
+<p>@added in SmartDeviceLink 7.0.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span> <span class="n">SDLTextFieldNameMenuSubMenuSecondaryText</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">menuSubMenuSecondaryText</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLTextFieldNameMenuSubMenuTertiaryText">
+ SDLTextFieldNameMenuSubMenuTertiaryText
+ </h3>
+
+ <p>Tertiary text for AddSubMenu</p>
+
+<p>@added in SmartDeviceLink 7.0.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span> <span class="n">SDLTextFieldNameMenuSubMenuTertiaryText</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">menuSubMenuTertiaryText</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName">SDLTextFieldName</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLTimerModeUp">
SDLTimerModeUp
</h3>
@@ -22729,7 +23206,7 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
SDLVehicleDataStatusNoDataExists
</h3>
- <p>No data avaliable</p>
+ <p>No data available</p>
@@ -22928,7 +23405,9 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
SDLVehicleDataTypeExternalTemperature
</h3>
- <p>Vehicle external temperature data</p>
+ <p>Vehicle external temperature data
+@deprecated in SmartDeviceLink 7.1.0
+@added in SmartDeviceLink 2.0.0</p>
@@ -22942,6 +23421,24 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
+ <h3 id="section-SDLVehicleDataTypeVehicleDataClimateData">
+ SDLVehicleDataTypeVehicleDataClimateData
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType">SDLVehicleDataType</a></span> <span class="n">SDLVehicleDataTypeVehicleDataClimateData</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">vehicleDataClimateData</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType">SDLVehicleDataType</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLVehicleDataTypeVIN">
SDLVehicleDataTypeVIN
</h3>
@@ -23307,7 +23804,7 @@ Added in SDL 7.0.0</p>
SDLVehicleDataTypeAccelerationPedal
</h3>
- <p>Vehicle accleration pedal data</p>
+ <p>Vehicle acceleration pedal data</p>
@@ -23433,6 +23930,24 @@ Added in SDL 7.0.0</p>
+ <h3 id="section-SDLVehicleDataTypeSeatOccupancy">
+ SDLVehicleDataTypeSeatOccupancy
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType">SDLVehicleDataType</a></span> <span class="n">SDLVehicleDataTypeSeatOccupancy</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">seatOccupancy</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType">SDLVehicleDataType</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLVentilationModeUpper">
SDLVentilationModeUpper
</h3>
diff --git a/docs/Enums.html b/docs/Enums.html
index 1ccc4f81e..7316ee7b5 100644
--- a/docs/Enums.html
+++ b/docs/Enums.html
@@ -13,6 +13,7 @@
<li><a href="#section-SDLSubscribeButtonManagerError">SDLSubscribeButtonManagerError</a></li>
<li><a href="#section-SDLMenuManagerError">SDLMenuManagerError</a></li>
<li><a href="#section-SDLChoiceSetManagerError">SDLChoiceSetManagerError</a></li>
+ <li><a href="#section-SDLAlertManagerError">SDLAlertManagerError</a></li>
<li><a href="#section-SDLSystemCapabilityManagerError">SDLSystemCapabilityManagerError</a></li>
<li><a href="#section-SDLTransportError">SDLTransportError</a></li>
<li><a href="#section-SDLRPCStoreError">SDLRPCStoreError</a></li>
@@ -200,7 +201,7 @@
SDLMenuManagerError
</h3>
- <p>Errors associated with the ScreenManager class</p>
+ <p>Errors associated with the Menu Manager class</p>
<a href="Enums/SDLMenuManagerError.html" class="slightly-smaller">See more</a>
@@ -219,7 +220,7 @@
SDLChoiceSetManagerError
</h3>
- <p>Errors associated with Choice Set class</p>
+ <p>Errors associated with Choice Set Manager class</p>
<a href="Enums/SDLChoiceSetManagerError.html" class="slightly-smaller">See more</a>
@@ -234,6 +235,25 @@
+ <h3 id="section-SDLAlertManagerError">
+ SDLAlertManagerError
+ </h3>
+
+ <p>Errors associated with Alert Manager class</p>
+
+ <a href="Enums/SDLAlertManagerError.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">enum</span> <span class="n">SDLAlertManagerError</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">SDLAlertManagerError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
+
+
+
+
<h3 id="section-SDLSystemCapabilityManagerError">
SDLSystemCapabilityManagerError
</h3>
diff --git a/docs/Enums/SDLAlertManagerError.html b/docs/Enums/SDLAlertManagerError.html
new file mode 100644
index 000000000..86be42688
--- /dev/null
+++ b/docs/Enums/SDLAlertManagerError.html
@@ -0,0 +1,52 @@
+<h1>SDLAlertManagerError Enumeration Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLAlertManagerPresentationError">SDLAlertManagerPresentationError</a></li>
+ <li><a href="#section-SDLAlertManagerInvalidDataError">SDLAlertManagerInvalidDataError</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Errors associated with Alert Manager class</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLAlertManagerPresentationError">
+ SDLAlertManagerPresentationError
+ </h3>
+
+ <p>There was an error presenting the alert</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLAlertManagerPresentationError</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">presentationError</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLAlertManagerInvalidDataError">
+ SDLAlertManagerInvalidDataError
+ </h3>
+
+ <p>The alert data is invalid</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLAlertManagerInvalidDataError</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">invalidDataError</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLChoiceSetManagerError.html b/docs/Enums/SDLChoiceSetManagerError.html
index 03f5fe678..b72be0336 100644
--- a/docs/Enums/SDLChoiceSetManagerError.html
+++ b/docs/Enums/SDLChoiceSetManagerError.html
@@ -12,7 +12,7 @@
<h3>Overview</h3>
-<p>Errors associated with Choice Set class</p>
+<p>Errors associated with Choice Set Manager class</p>
<section class="section task-group-section">
diff --git a/docs/Enums/SDLMenuManagerError.html b/docs/Enums/SDLMenuManagerError.html
index 0ca316f74..71e27faa1 100644
--- a/docs/Enums/SDLMenuManagerError.html
+++ b/docs/Enums/SDLMenuManagerError.html
@@ -4,11 +4,12 @@
<ul>
<li><a href="#section-SDLMenuManagerErrorRPCsFailed">SDLMenuManagerErrorRPCsFailed</a></li>
+ <li><a href="#section-SDLMenuManagerErrorPendingUpdateSuperseded">SDLMenuManagerErrorPendingUpdateSuperseded</a></li>
</ul>
<h3>Overview</h3>
-<p>Errors associated with the ScreenManager class</p>
+<p>Errors associated with the Menu Manager class</p>
<section class="section task-group-section">
@@ -30,4 +31,22 @@
+ <h3 id="section-SDLMenuManagerErrorPendingUpdateSuperseded">
+ SDLMenuManagerErrorPendingUpdateSuperseded
+ </h3>
+
+ <p>Sending menu-related RPCs returned an error from the remote system</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLMenuManagerErrorPendingUpdateSuperseded</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">pendingUpdateSuperseded</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Enums/SDLSystemCapabilityManagerError.html b/docs/Enums/SDLSystemCapabilityManagerError.html
index 5262f82ac..846772d78 100644
--- a/docs/Enums/SDLSystemCapabilityManagerError.html
+++ b/docs/Enums/SDLSystemCapabilityManagerError.html
@@ -36,7 +36,7 @@
SDLSystemCapabilityManagerErrorHMINone
</h3>
- <p>You must be in an HMI Level other than NONE to request or subscribe to capabilites other than DISPLAYS</p>
+ <p>You must be in an HMI Level other than NONE to request or subscribe to capabilities other than DISPLAYS</p>
diff --git a/docs/Protocols.html b/docs/Protocols.html
index 346daf735..f432119b2 100644
--- a/docs/Protocols.html
+++ b/docs/Protocols.html
@@ -16,6 +16,7 @@
<li><a href="#section-SDLServiceEncryptionDelegate">SDLServiceEncryptionDelegate</a></li>
<li><a href="#section-SDLStreamingAudioManagerType">SDLStreamingAudioManagerType</a></li>
<li><a href="#section-SDLStreamingMediaManagerDataSource">SDLStreamingMediaManagerDataSource</a></li>
+ <li><a href="#section-SDLStreamingVideoDelegate">SDLStreamingVideoDelegate</a></li>
<li><a href="#section-SDLTouchManagerDelegate">SDLTouchManagerDelegate</a></li>
</ul>
@@ -120,7 +121,7 @@
SDLChoiceSetDelegate
</h3>
- <p>Delegate for the the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>
+ <p>Delegate for the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>
<a href="Protocols/SDLChoiceSetDelegate.html" class="slightly-smaller">See more</a>
@@ -273,6 +274,29 @@
+ <h3 id="section-SDLStreamingVideoDelegate">
+ SDLStreamingVideoDelegate
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Protocols/SDLStreamingVideoDelegate.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">@protocol</span> <span class="nc">SDLStreamingVideoDelegate</span> <span class="o">&lt;</span><span class="n">NSObject</span><span class="o">&gt;</span>
+
+<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">videoStreamingSizeDidUpdate</span><span class="p">:(</span><span class="n">CGSize</span><span class="p">)</span><span class="nv">displaySize</span> <span class="n">NS_SWIFT_NAME</span><span class="p">(</span><span class="n">videoStreamingSizeDidUpdate</span><span class="p">(</span><span class="n">toSize</span><span class="o">:</span><span class="p">));</span>
+
+<span class="k">@end</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">protocol</span> <span class="kt">SDLStreamingVideoDelegate</span> <span class="p">:</span> <span class="kt">NSObjectProtocol</span></code></pre>
+
+
+
+
<h3 id="section-SDLTouchManagerDelegate">
SDLTouchManagerDelegate
</h3>
diff --git a/docs/Protocols/SDLChoiceSetDelegate.html b/docs/Protocols/SDLChoiceSetDelegate.html
index 5fca8201d..dd5b87414 100644
--- a/docs/Protocols/SDLChoiceSetDelegate.html
+++ b/docs/Protocols/SDLChoiceSetDelegate.html
@@ -9,7 +9,7 @@
<h3>Overview</h3>
-<p>Delegate for the the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>
+<p>Delegate for the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>
<section class="section task-group-section">
diff --git a/docs/Protocols/SDLKeyboardDelegate.html b/docs/Protocols/SDLKeyboardDelegate.html
index 6df828c8a..d685fa7fb 100644
--- a/docs/Protocols/SDLKeyboardDelegate.html
+++ b/docs/Protocols/SDLKeyboardDelegate.html
@@ -9,6 +9,7 @@
<li><a href="#section--updateAutocompleteWithInput:autoCompleteResultsHandler:">-updateAutocompleteWithInput:autoCompleteResultsHandler:</a></li>
<li><a href="#section--updateCharacterSetWithInput:completionHandler:">-updateCharacterSetWithInput:completionHandler:</a></li>
<li><a href="#section--keyboardDidSendEvent:text:">-keyboardDidSendEvent:text:</a></li>
+ <li><a href="#section--keyboardDidUpdateInputMask:">-keyboardDidUpdateInputMask:</a></li>
</ul>
<h3>Overview</h3>
@@ -175,4 +176,28 @@
<dd><p>The user&rsquo;s full current input text</p></dd>
</dl>
+ <h3 id="section--keyboardDidUpdateInputMask:">
+ -keyboardDidUpdateInputMask:
+ </h3>
+
+ <p>Implement this to be notified of input key mask update (whether or not the user has changed the input to be hidden, like passwords)</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">keyboardDidUpdateInputMask</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">isEnabled</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">optional</span> <span class="kd">func</span> <span class="nf">keyboardDidUpdateInputMask</span><span class="p">(</span><span class="n">_</span> <span class="nv">isEnabled</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>isEnabled</dt>
+ <dd><p>- YES if the mask is enabled, NO if the mask is disabled
+@added in SmartDeviceLink 7.1.0</p></dd>
+ </dl>
+
</section>
diff --git a/docs/Protocols/SDLManagerDelegate.html b/docs/Protocols/SDLManagerDelegate.html
index 63581da26..914aaae3f 100644
--- a/docs/Protocols/SDLManagerDelegate.html
+++ b/docs/Protocols/SDLManagerDelegate.html
@@ -9,6 +9,7 @@
<li><a href="#section--videoStreamingState:didChangetoState:">-videoStreamingState:didChangetoState:</a></li>
<li><a href="#section--systemContext:didChangeToContext:">-systemContext:didChangeToContext:</a></li>
<li><a href="#section--managerShouldUpdateLifecycleToLanguage:hmiLanguage:">-managerShouldUpdateLifecycleToLanguage:hmiLanguage:</a></li>
+ <li><a href="#section--didReceiveSystemInfo:">-didReceiveSystemInfo:</a></li>
</ul>
<h3>Overview</h3>
@@ -172,4 +173,31 @@
<p>An object of SDLLifecycleConfigurationUpdate if the head unit language is supported, otherwise nil to indicate that the language is not supported.</p>
</div>
+ <h3 id="section--didReceiveSystemInfo:">
+ -didReceiveSystemInfo:
+ </h3>
+
+ <p>A way to determine if this SDL session should continue to be active while connected to the determined system information of the vehicle.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">didReceiveSystemInfo</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLSystemInfo.html">SDLSystemInfo</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">systemInfo</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">optional</span> <span class="kd">func</span> <span class="nf">didReceiveSystemInfo</span><span class="p">(</span><span class="n">_</span> <span class="nv">systemInfo</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLSystemInfo.html">SDLSystemInfo</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>systemInfo</dt>
+ <dd><p>The system information of the vehicle that this session is currently active on.</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>True if this session should continue, false if the session should end</p>
+ </div>
+
</section>
diff --git a/docs/Protocols/SDLServiceEncryptionDelegate.html b/docs/Protocols/SDLServiceEncryptionDelegate.html
index e7e6535c3..ad54b8e40 100644
--- a/docs/Protocols/SDLServiceEncryptionDelegate.html
+++ b/docs/Protocols/SDLServiceEncryptionDelegate.html
@@ -36,7 +36,7 @@
<dt>type</dt>
<dd><p>will return whichever type had an encryption update (for now probably only SDLServiceTypeRPC), but it could also apply to video / audio in the future.</p></dd>
<dt>encrypted</dt>
- <dd><p>return true if the the encryption service was setup successfully, will return false if the service is presently not encrypted.</p></dd>
+ <dd><p>return true if the encryption service was setup successfully, will return false if the service is presently not encrypted.</p></dd>
<dt>error</dt>
<dd><p>will return any error that happens or nil if there is no error.</p></dd>
</dl>
diff --git a/docs/Protocols/SDLStreamingVideoDelegate.html b/docs/Protocols/SDLStreamingVideoDelegate.html
new file mode 100644
index 000000000..bc1827780
--- /dev/null
+++ b/docs/Protocols/SDLStreamingVideoDelegate.html
@@ -0,0 +1,33 @@
+<h1>SDLStreamingVideoDelegate Protocol Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--videoStreamingSizeDidUpdate:">-videoStreamingSizeDidUpdate:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--videoStreamingSizeDidUpdate:">
+ -videoStreamingSizeDidUpdate:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">videoStreamingSizeDidUpdate</span><span class="p">:(</span><span class="n">CGSize</span><span class="p">)</span><span class="nv">displaySize</span> <span class="n">NS_SWIFT_NAME</span><span class="p">(</span><span class="n">videoStreamingSizeDidUpdate</span><span class="p">(</span><span class="n">toSize</span><span class="o">:</span><span class="p">));</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">videoStreamingSizeDidUpdate</span><span class="p">(</span><span class="n">_</span> <span class="nv">displaySize</span><span class="p">:</span> <span class="kt">CGSize</span><span class="p">)</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Protocols/SDLTouchManagerDelegate.html b/docs/Protocols/SDLTouchManagerDelegate.html
index 61c216ede..f58face5d 100644
--- a/docs/Protocols/SDLTouchManagerDelegate.html
+++ b/docs/Protocols/SDLTouchManagerDelegate.html
@@ -245,7 +245,7 @@
<h4>Parameters</h4>
<dl>
<dt>manager</dt>
- <dd><p>Current initalized SDLTouchManager issuing the callback.</p></dd>
+ <dd><p>Current initialized SDLTouchManager issuing the callback.</p></dd>
<dt>point</dt>
<dd><p>Center point of the pinch in the head unit&rsquo;s coordinate system.</p></dd>
<dt>scale</dt>
diff --git a/docs/Type Definitions.html b/docs/Type Definitions.html
index 345c40149..6800daef7 100644
--- a/docs/Type Definitions.html
+++ b/docs/Type Definitions.html
@@ -3,7 +3,9 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section-SDLAlertCanceledHandler">SDLAlertCanceledHandler</a></li>
<li><a href="#section-SDLAmbientLightStatus">SDLAmbientLightStatus</a></li>
+ <li><a href="#section-SDLAppCapabilityType">SDLAppCapabilityType</a></li>
<li><a href="#section-SDLAppHMIType">SDLAppHMIType</a></li>
<li><a href="#section-SDLAppInterfaceUnregisteredReason">SDLAppInterfaceUnregisteredReason</a></li>
<li><a href="#section-SDLAppServiceType">SDLAppServiceType</a></li>
@@ -28,6 +30,7 @@
<li><a href="#section-SDLDisplayMode">SDLDisplayMode</a></li>
<li><a href="#section-SDLDisplayType">SDLDisplayType</a></li>
<li><a href="#section-SDLDistanceUnit">SDLDistanceUnit</a></li>
+ <li><a href="#section-SDLDoorStatusType">SDLDoorStatusType</a></li>
<li><a href="#section-SDLDriverDistractionState">SDLDriverDistractionState</a></li>
<li><a href="#section-SDLECallConfirmationStatus">SDLECallConfirmationStatus</a></li>
<li><a href="#section-SDLElectronicParkBrakeStatus">SDLElectronicParkBrakeStatus</a></li>
@@ -61,6 +64,7 @@
<li><a href="#section-SDLKeyboardAutoCompleteResultsHandler">SDLKeyboardAutoCompleteResultsHandler</a></li>
<li><a href="#section-SDLKeyboardCharacterSetCompletionHandler">SDLKeyboardCharacterSetCompletionHandler</a></li>
<li><a href="#section-SDLKeyboardEvent">SDLKeyboardEvent</a></li>
+ <li><a href="#section-SDLKeyboardInputMask">SDLKeyboardInputMask</a></li>
<li><a href="#section-SDLKeyboardLayout">SDLKeyboardLayout</a></li>
<li><a href="#section-SDLKeypressMode">SDLKeypressMode</a></li>
<li><a href="#section-SDLLanguage">SDLLanguage</a></li>
@@ -114,6 +118,7 @@
<li><a href="#section-SDLPreloadChoiceCompletionHandler">SDLPreloadChoiceCompletionHandler</a></li>
<li><a href="#section-SDLSubscribeButtonHandler">SDLSubscribeButtonHandler</a></li>
<li><a href="#section-SDLSeatMemoryActionType">SDLSeatMemoryActionType</a></li>
+ <li><a href="#section-SDLSeekIndicatorType">SDLSeekIndicatorType</a></li>
<li><a href="#section-SDLServiceUpdateReason">SDLServiceUpdateReason</a></li>
<li><a href="#section-SDLSoftButtonType">SDLSoftButtonType</a></li>
<li><a href="#section-SDLSpeechCapabilities">SDLSpeechCapabilities</a></li>
@@ -164,6 +169,24 @@
<section class="section task-group-section">
+ <h3 id="section-SDLAlertCanceledHandler">
+ SDLAlertCanceledHandler
+ </h3>
+
+ <p>Notifies the subscriber that the alert should be cancelled.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">typedef</span> <span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="n">SDLAlertCanceledHandler</span><span class="p">)(</span><span class="kt">void</span><span class="p">)</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">typealias</span> <span class="kt">SDLAlertCanceledHandler</span> <span class="o">=</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Void</span></code></pre>
+
+
+
+
<h3 id="section-SDLAmbientLightStatus">
SDLAmbientLightStatus
</h3>
@@ -184,6 +207,26 @@
+ <h3 id="section-SDLAppCapabilityType">
+ SDLAppCapabilityType
+ </h3>
+
+ <p>Enumerations of all available app capability types</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">typedef</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum">SDLEnum</a></span> <span class="n">SDLAppCapabilityType</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">struct</span> <span class="kt">SDLAppCapabilityType</span> <span class="p">:</span> <span class="n">_ObjectiveCBridgeable</span><span class="p">,</span> <span class="kt">Hashable</span><span class="p">,</span> <span class="kt">Equatable</span><span class="p">,</span> <span class="n">_SwiftNewtypeWrapper</span><span class="p">,</span> <span class="kt">RawRepresentable</span></code></pre>
+
+
+
+
<h3 id="section-SDLAppHMIType">
SDLAppHMIType
</h3>
@@ -664,6 +707,24 @@
+ <h3 id="section-SDLDoorStatusType">
+ SDLDoorStatusType
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">typedef</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum">SDLEnum</a></span> <span class="n">SDLDoorStatusType</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">struct</span> <span class="kt">SDLDoorStatusType</span> <span class="p">:</span> <span class="n">_ObjectiveCBridgeable</span><span class="p">,</span> <span class="kt">Hashable</span><span class="p">,</span> <span class="kt">Equatable</span><span class="p">,</span> <span class="n">_SwiftNewtypeWrapper</span><span class="p">,</span> <span class="kt">RawRepresentable</span></code></pre>
+
+
+
+
<h3 id="section-SDLDriverDistractionState">
SDLDriverDistractionState
</h3>
@@ -820,7 +881,7 @@ This is for internal use only.</p>
SDLFileManagerUploadCompletionHandler
</h3>
- <p>A completion handler called after a response from Core to a upload request.</p>
+ <p>A completion handler called after a response from Core to an upload request.</p>
@@ -841,7 +902,7 @@ This is for internal use only.</p>
<dt>bytesAvailable</dt>
<dd><p>The amount of space left for files on Core</p></dd>
<dt>error</dt>
- <dd><p>The error that occurred during the request if one occurred, nil if no error occured</p></dd>
+ <dd><p>The error that occurred during the request if one occurred, nil if no error occurred</p></dd>
</dl>
<h3 id="section-SDLFileManagerMultiUploadCompletionHandler">
@@ -893,7 +954,7 @@ This is for internal use only.</p>
<dt>uploadPercentage</dt>
<dd><p>The percentage of uploaded data. The upload percentage is calculated as the total file size of all attempted file uploads (regardless of the successfulness of the upload) divided by the sum of the data in all the files</p></dd>
<dt>error</dt>
- <dd><p>The error that occurred during the request if one occurred, nil if no error occured</p></dd>
+ <dd><p>The error that occurred during the request if one occurred, nil if no error occurred</p></dd>
</dl>
<div>
<h4>Return Value</h4>
@@ -925,7 +986,7 @@ This is for internal use only.</p>
<dt>bytesAvailable</dt>
<dd><p>The amount of space left for files on Core</p></dd>
<dt>error</dt>
- <dd><p>The error that occurred during the request if one occurred, nil if no error occured</p></dd>
+ <dd><p>The error that occurred during the request if one occurred, nil if no error occurred</p></dd>
</dl>
<h3 id="section-SDLFileManagerMultiDeleteCompletionHandler">
@@ -978,14 +1039,14 @@ This is for internal use only.</p>
<dt>fileNames</dt>
<dd><p>The names of the files stored on SDL Core</p></dd>
<dt>error</dt>
- <dd><p>The error that occurred during the request if one occurred, nil if no error occured</p></dd>
+ <dd><p>The error that occurred during the request if one occurred, nil if no error occurred</p></dd>
</dl>
<h3 id="section-SDLFileManagerUploadArtworkCompletionHandler">
SDLFileManagerUploadArtworkCompletionHandler
</h3>
- <p>A completion handler called after a response from Core to a artwork upload request.</p>
+ <p>A completion handler called after a response from Core to an artwork upload request.</p>
@@ -1064,7 +1125,7 @@ This is for internal use only.</p>
<dt>uploadPercentage</dt>
<dd><p>The percentage of uploaded data. The upload percentage is calculated as the total file size of all attempted artwork uploads (regardless of the successfulness of the upload) divided by the sum of the data in all the files</p></dd>
<dt>error</dt>
- <dd><p>The error that occurred during the upload request if one occurred, nil if no error occured</p></dd>
+ <dd><p>The error that occurred during the upload request if one occurred, nil if no error occurred</p></dd>
</dl>
<div>
<h4>Return Value</h4>
@@ -1398,6 +1459,26 @@ This is for internal use only.</p>
+ <h3 id="section-SDLKeyboardInputMask">
+ SDLKeyboardInputMask
+ </h3>
+
+ <p>Enumeration listing possible input character masking.</p>
+
+<p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">typedef</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum">SDLEnum</a></span> <span class="n">SDLKeyboardInputMask</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">struct</span> <span class="kt">SDLKeyboardInputMask</span> <span class="p">:</span> <span class="n">_ObjectiveCBridgeable</span><span class="p">,</span> <span class="kt">Hashable</span><span class="p">,</span> <span class="kt">Equatable</span><span class="p">,</span> <span class="n">_SwiftNewtypeWrapper</span><span class="p">,</span> <span class="kt">RawRepresentable</span></code></pre>
+
+
+
+
<h3 id="section-SDLKeyboardLayout">
SDLKeyboardLayout
</h3>
@@ -1567,7 +1648,7 @@ This is for internal use only.</p>
SDLMaintenanceModeStatus
</h3>
- <p>Describes the maintenence mode. Used in nothing.</p>
+ <p>Describes the maintenance mode. Used in nothing.</p>
@@ -2532,6 +2613,24 @@ c = character <br></p>
+ <h3 id="section-SDLSeekIndicatorType">
+ SDLSeekIndicatorType
+ </h3>
+
+ <p>@added in SmartDeviceLink 7.1.0</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">typedef</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum">SDLEnum</a></span> <span class="n">SDLSeekIndicatorType</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">struct</span> <span class="kt">SDLSeekIndicatorType</span> <span class="p">:</span> <span class="n">_ObjectiveCBridgeable</span><span class="p">,</span> <span class="kt">Hashable</span><span class="p">,</span> <span class="kt">Equatable</span><span class="p">,</span> <span class="n">_SwiftNewtypeWrapper</span><span class="p">,</span> <span class="kt">RawRepresentable</span></code></pre>
+
+
+
+
<h3 id="section-SDLServiceUpdateReason">
SDLServiceUpdateReason
</h3>
diff --git a/docs/badge.svg b/docs/badge.svg
index a096feca8..f47d948fa 100644
--- a/docs/badge.svg
+++ b/docs/badge.svg
@@ -1,15 +1,15 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="136" height="20">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="20">
<linearGradient id="b" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/>
</linearGradient>
<clipPath id="a">
- <rect width="136" height="20" rx="3" fill="#fff"/>
+ <rect width="128" height="20" rx="3" fill="#fff"/>
</clipPath>
<g clip-path="url(#a)">
<path fill="#555" d="M0 0h93v20H0z"/>
- <path fill="#4c1" d="M93 0h43v20H93z"/>
- <path fill="url(#b)" d="M0 0h136v20H0z"/>
+ <path fill="#4c1" d="M93 0h35v20H93z"/>
+ <path fill="url(#b)" d="M0 0h128v20H0z"/>
</g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110">
<text x="475" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="830">
@@ -18,11 +18,11 @@
<text x="475" y="140" transform="scale(.1)" textLength="830">
documentation
</text>
- <text x="1135" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="330">
- 100%
+ <text x="1095" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">
+ 98%
</text>
- <text x="1135" y="140" transform="scale(.1)" textLength="330">
- 100%
+ <text x="1095" y="140" transform="scale(.1)" textLength="250">
+ 98%
</text>
</g>
</svg>
diff --git a/docs/index.html b/docs/index.html
index 503391d97..70b25caf9 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -16,12 +16,18 @@
url: Classes/SDLAirbagStatus.html
- name: SDLAlert
url: Classes/SDLAlert.html
+ - name: SDLAlertAudioData
+ url: Classes/SDLAlertAudioData.html
- name: SDLAlertManeuver
url: Classes/SDLAlertManeuver.html
- name: SDLAlertManeuverResponse
url: Classes.html#/c:objc(cs)SDLAlertManeuverResponse
- name: SDLAlertResponse
url: Classes/SDLAlertResponse.html
+ - name: SDLAlertView
+ url: Classes/SDLAlertView.html
+ - name: SDLAppCapability
+ url: Classes/SDLAppCapability.html
- name: SDLAppInfo
url: Classes/SDLAppInfo.html
- name: SDLAppServiceCapability
@@ -40,6 +46,8 @@
url: Classes/SDLAudioControlCapabilities.html
- name: SDLAudioControlData
url: Classes/SDLAudioControlData.html
+ - name: SDLAudioData
+ url: Classes/SDLAudioData.html
- name: SDLAudioFile
url: Classes/SDLAudioFile.html
- name: SDLAudioPassThruCapabilities
@@ -76,6 +84,8 @@
url: Classes/SDLClimateControlCapabilities.html
- name: SDLClimateControlData
url: Classes/SDLClimateControlData.html
+ - name: SDLClimateData
+ url: Classes/SDLClimateData.html
- name: SDLCloseApplication
url: Classes.html#/c:objc(cs)SDLCloseApplication
- name: SDLCloseApplicationResponse
@@ -134,6 +144,8 @@
url: Classes/SDLDisplayCapabilities.html
- name: SDLDisplayCapability
url: Classes/SDLDisplayCapability.html
+ - name: SDLDoorStatus
+ url: Classes/SDLDoorStatus.html
- name: SDLDriverDistractionCapability
url: Classes/SDLDriverDistractionCapability.html
- name: SDLDynamicUpdateCapabilities
@@ -166,6 +178,8 @@
url: Classes/SDLFunctionID.html
- name: SDLGPSData
url: Classes/SDLGPSData.html
+ - name: SDLGateStatus
+ url: Classes/SDLGateStatus.html
- name: SDLGearStatus
url: Classes/SDLGearStatus.html
- name: SDLGenericResponse
@@ -226,6 +240,10 @@
url: Classes/SDLImageField.html
- name: SDLImageResolution
url: Classes/SDLImageResolution.html
+ - name: SDLKeyboardCapabilities
+ url: Classes/SDLKeyboardCapabilities.html
+ - name: SDLKeyboardLayoutCapability
+ url: Classes/SDLKeyboardLayoutCapability.html
- name: SDLKeyboardProperties
url: Classes/SDLKeyboardProperties.html
- name: SDLLifecycleConfiguration
@@ -304,6 +322,8 @@
url: Classes/SDLNotificationConstants.html
- name: SDLOasisAddress
url: Classes/SDLOasisAddress.html
+ - name: SDLOnAppCapabilityUpdated
+ url: Classes/SDLOnAppCapabilityUpdated.html
- name: SDLOnAppInterfaceUnregistered
url: Classes/SDLOnAppInterfaceUnregistered.html
- name: SDLOnAppServiceData
@@ -434,6 +454,8 @@
url: Classes/SDLResetGlobalProperties.html
- name: SDLResetGlobalPropertiesResponse
url: Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse
+ - name: SDLRoofStatus
+ url: Classes/SDLRoofStatus.html
- name: SDLSISData
url: Classes/SDLSISData.html
- name: SDLScreenManager
@@ -454,6 +476,12 @@
url: Classes/SDLSeatLocationCapability.html
- name: SDLSeatMemoryAction
url: Classes/SDLSeatMemoryAction.html
+ - name: SDLSeatOccupancy
+ url: Classes/SDLSeatOccupancy.html
+ - name: SDLSeatStatus
+ url: Classes/SDLSeatStatus.html
+ - name: SDLSeekStreamingIndicator
+ url: Classes/SDLSeekStreamingIndicator.html
- name: SDLSendHapticData
url: Classes/SDLSendHapticData.html
- name: SDLSendHapticDataResponse
@@ -552,6 +580,8 @@
url: Classes/SDLSystemCapability.html
- name: SDLSystemCapabilityManager
url: Classes/SDLSystemCapabilityManager.html
+ - name: SDLSystemInfo
+ url: Classes/SDLSystemInfo.html
- name: SDLSystemRequest
url: Classes/SDLSystemRequest.html
- name: SDLSystemRequestResponse
@@ -616,6 +646,8 @@
url: Classes/SDLVideoStreamingCapability.html
- name: SDLVideoStreamingFormat
url: Classes/SDLVideoStreamingFormat.html
+ - name: SDLVideoStreamingRange
+ url: Classes/SDLVideoStreamingRange.html
- name: SDLVoiceCommand
url: Classes/SDLVoiceCommand.html
- name: SDLWeatherAlert
@@ -652,6 +684,8 @@
url: Constants.html#/c:@SDLAmbientLightStatusTwilight4
- name: SDLAmbientLightStatusUnknown
url: Constants.html#/c:@SDLAmbientLightStatusUnknown
+ - name: SDLAppCapabilityTypeVideoStreaming
+ url: Constants.html#/c:@SDLAppCapabilityTypeVideoStreaming
- name: SDLAppHMITypeBackgroundProcess
url: Constants.html#/c:@SDLAppHMITypeBackgroundProcess
- name: SDLAppHMITypeCommunication
@@ -1298,6 +1332,14 @@
url: Constants.html#/c:@SDLDistanceUnitKilometers
- name: SDLDistanceUnitMiles
url: Constants.html#/c:@SDLDistanceUnitMiles
+ - name: SDLDoorStatusTypeAjar
+ url: Constants.html#/c:@SDLDoorStatusTypeAjar
+ - name: SDLDoorStatusTypeClosed
+ url: Constants.html#/c:@SDLDoorStatusTypeClosed
+ - name: SDLDoorStatusTypeLocked
+ url: Constants.html#/c:@SDLDoorStatusTypeLocked
+ - name: SDLDoorStatusTypeRemoved
+ url: Constants.html#/c:@SDLDoorStatusTypeRemoved
- name: SDLDriverDistractionStateOff
url: Constants.html#/c:@SDLDriverDistractionStateOff
- name: SDLDriverDistractionStateOn
@@ -1340,6 +1382,8 @@
url: Constants.html#/c:@SDLEmergencyEventTypeRollover
- name: SDLEmergencyEventTypeSide
url: Constants.html#/c:@SDLEmergencyEventTypeSide
+ - name: SDLErrorDomainAlertManager
+ url: Constants.html#/c:@SDLErrorDomainAlertManager
- name: SDLErrorDomainAudioStreamManager
url: Constants.html#/c:@SDLErrorDomainAudioStreamManager
- name: SDLErrorDomainCacheFileManager
@@ -1466,8 +1510,12 @@
url: Constants.html#/c:@SDLImageFieldNameGraphic
- name: SDLImageFieldNameLocationImage
url: Constants.html#/c:@SDLImageFieldNameLocationImage
+ - name: SDLImageFieldNameMenuCommandSecondaryImage
+ url: Constants.html#/c:@SDLImageFieldNameMenuCommandSecondaryImage
- name: SDLImageFieldNameMenuIcon
url: Constants.html#/c:@SDLImageFieldNameMenuIcon
+ - name: SDLImageFieldNameMenuSubMenuSecondaryImage
+ url: Constants.html#/c:@SDLImageFieldNameMenuSubMenuSecondaryImage
- name: SDLImageFieldNameSecondaryGraphic
url: Constants.html#/c:@SDLImageFieldNameSecondaryGraphic
- name: SDLImageFieldNameShowConstantTBTIcon
@@ -1498,14 +1546,26 @@
url: Constants.html#/c:@SDLKeyboardEventAborted
- name: SDLKeyboardEventCancelled
url: Constants.html#/c:@SDLKeyboardEventCancelled
+ - name: SDLKeyboardEventInputKeyMaskDisabled
+ url: Constants.html#/c:@SDLKeyboardEventInputKeyMaskDisabled
+ - name: SDLKeyboardEventInputKeyMaskEnabled
+ url: Constants.html#/c:@SDLKeyboardEventInputKeyMaskEnabled
- name: SDLKeyboardEventKeypress
url: Constants.html#/c:@SDLKeyboardEventKeypress
- name: SDLKeyboardEventSubmitted
url: Constants.html#/c:@SDLKeyboardEventSubmitted
- name: SDLKeyboardEventVoice
url: Constants.html#/c:@SDLKeyboardEventVoice
+ - name: SDLKeyboardInputMaskDisableInputKeyMask
+ url: Constants.html#/c:@SDLKeyboardInputMaskDisableInputKeyMask
+ - name: SDLKeyboardInputMaskEnableInputKeyMask
+ url: Constants.html#/c:@SDLKeyboardInputMaskEnableInputKeyMask
+ - name: SDLKeyboardInputMaskUserChoiceInputKeyMask
+ url: Constants.html#/c:@SDLKeyboardInputMaskUserChoiceInputKeyMask
- name: SDLKeyboardLayoutAZERTY
url: Constants.html#/c:@SDLKeyboardLayoutAZERTY
+ - name: SDLKeyboardLayoutNumeric
+ url: Constants.html#/c:@SDLKeyboardLayoutNumeric
- name: SDLKeyboardLayoutQWERTY
url: Constants.html#/c:@SDLKeyboardLayoutQWERTY
- name: SDLKeyboardLayoutQWERTZ
@@ -2048,6 +2108,8 @@
url: Constants.html#/c:@SDLRPCFunctionNameGetWayPoints
- name: SDLRPCFunctionNameListFiles
url: Constants.html#/c:@SDLRPCFunctionNameListFiles
+ - name: SDLRPCFunctionNameOnAppCapabilityUpdated
+ url: Constants.html#/c:@SDLRPCFunctionNameOnAppCapabilityUpdated
- name: SDLRPCFunctionNameOnAppInterfaceUnregistered
url: Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered
- name: SDLRPCFunctionNameOnAppServiceData
@@ -2330,6 +2392,10 @@
url: Constants.html#/c:@SDLSeatMemoryActionTypeRestore
- name: SDLSeatMemoryActionTypeSave
url: Constants.html#/c:@SDLSeatMemoryActionTypeSave
+ - name: SDLSeekIndicatorTypeTime
+ url: Constants.html#/c:@SDLSeekIndicatorTypeTime
+ - name: SDLSeekIndicatorTypeTrack
+ url: Constants.html#/c:@SDLSeekIndicatorTypeTrack
- name: SDLServiceUpdateActivated
url: Constants.html#/c:@SDLServiceUpdateActivated
- name: SDLServiceUpdateDeactivated
@@ -2384,6 +2450,8 @@
url: Constants.html#/c:@SDLStaticIconNameAudiobookEpisode
- name: SDLStaticIconNameAudiobookNarrator
url: Constants.html#/c:@SDLStaticIconNameAudiobookNarrator
+ - name: SDLStaticIconNameAuxiliaryAudio
+ url: Constants.html#/c:@SDLStaticIconNameAuxiliaryAudio
- name: SDLStaticIconNameAuxillaryAudio
url: Constants.html#/c:@SDLStaticIconNameAuxillaryAudio
- name: SDLStaticIconNameBack
@@ -2836,8 +2904,16 @@
url: Constants.html#/c:@SDLTextFieldNameMediaClock
- name: SDLTextFieldNameMediaTrack
url: Constants.html#/c:@SDLTextFieldNameMediaTrack
+ - name: SDLTextFieldNameMenuCommandSecondaryText
+ url: Constants.html#/c:@SDLTextFieldNameMenuCommandSecondaryText
+ - name: SDLTextFieldNameMenuCommandTertiaryText
+ url: Constants.html#/c:@SDLTextFieldNameMenuCommandTertiaryText
- name: SDLTextFieldNameMenuName
url: Constants.html#/c:@SDLTextFieldNameMenuName
+ - name: SDLTextFieldNameMenuSubMenuSecondaryText
+ url: Constants.html#/c:@SDLTextFieldNameMenuSubMenuSecondaryText
+ - name: SDLTextFieldNameMenuSubMenuTertiaryText
+ url: Constants.html#/c:@SDLTextFieldNameMenuSubMenuTertiaryText
- name: SDLTextFieldNameMenuTitle
url: Constants.html#/c:@SDLTextFieldNameMenuTitle
- name: SDLTextFieldNameNavigationText1
@@ -2866,8 +2942,12 @@
url: Constants.html#/c:@SDLTextFieldNameTemplateTitle
- name: SDLTextFieldNameTertiaryText
url: Constants.html#/c:@SDLTextFieldNameTertiaryText
+ - name: SDLTextFieldNameTimeToDestination
+ url: Constants.html#/c:@SDLTextFieldNameTimeToDestination
- name: SDLTextFieldNameTotalDistance
url: Constants.html#/c:@SDLTextFieldNameTotalDistance
+ - name: SDLTextFieldNameTurnText
+ url: Constants.html#/c:@SDLTextFieldNameTurnText
- name: SDLTimerModeDown
url: Constants.html#/c:@SDLTimerModeDown
- name: SDLTimerModeNone
@@ -3038,6 +3118,8 @@
url: Constants.html#/c:@SDLVehicleDataTypePRNDL
- name: SDLVehicleDataTypeRPM
url: Constants.html#/c:@SDLVehicleDataTypeRPM
+ - name: SDLVehicleDataTypeSeatOccupancy
+ url: Constants.html#/c:@SDLVehicleDataTypeSeatOccupancy
- name: SDLVehicleDataTypeSpeed
url: Constants.html#/c:@SDLVehicleDataTypeSpeed
- name: SDLVehicleDataTypeStabilityControlsStatus
@@ -3050,6 +3132,8 @@
url: Constants.html#/c:@SDLVehicleDataTypeTurnSignal
- name: SDLVehicleDataTypeVIN
url: Constants.html#/c:@SDLVehicleDataTypeVIN
+ - name: SDLVehicleDataTypeVehicleDataClimateData
+ url: Constants.html#/c:@SDLVehicleDataTypeVehicleDataClimateData
- name: SDLVehicleDataTypeWindowStatus
url: Constants.html#/c:@SDLVehicleDataTypeWindowStatus
- name: SDLVehicleDataTypeWiperStatus
@@ -3156,6 +3240,8 @@
sub_nav:
- name: MenuCellState
url: Enums/MenuCellState.html
+ - name: SDLAlertManagerError
+ url: Enums/SDLAlertManagerError.html
- name: SDLArtworkImageFormat
url: Enums/SDLArtworkImageFormat.html
- name: SDLAudioStreamManagerError
@@ -3246,14 +3332,20 @@
url: Protocols/SDLStreamingAudioManagerType.html
- name: SDLStreamingMediaManagerDataSource
url: Protocols/SDLStreamingMediaManagerDataSource.html
+ - name: SDLStreamingVideoDelegate
+ url: Protocols/SDLStreamingVideoDelegate.html
- name: SDLTouchManagerDelegate
url: Protocols/SDLTouchManagerDelegate.html
- name: SDLUInt
url: Protocols.html#/c:objc(pl)SDLUInt
- name: Type Definitions
sub_nav:
+ - name: SDLAlertCanceledHandler
+ url: Type%20Definitions.html#/c:SDLAlertView.h@T@SDLAlertCanceledHandler
- name: SDLAmbientLightStatus
url: Type%20Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus
+ - name: SDLAppCapabilityType
+ url: Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType
- name: SDLAppHMIType
url: Type%20Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType
- name: SDLAppInterfaceUnregisteredReason
@@ -3312,6 +3404,8 @@
url: Type%20Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType
- name: SDLDistanceUnit
url: Type%20Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit
+ - name: SDLDoorStatusType
+ url: Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType
- name: SDLDriverDistractionState
url: Type%20Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState
- name: SDLECallConfirmationStatus
@@ -3378,6 +3472,8 @@
url: Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler
- name: SDLKeyboardEvent
url: Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent
+ - name: SDLKeyboardInputMask
+ url: Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask
- name: SDLKeyboardLayout
url: Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout
- name: SDLKeypressMode
@@ -3478,6 +3574,8 @@
url: Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler
- name: SDLSeatMemoryActionType
url: Type%20Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType
+ - name: SDLSeekIndicatorType
+ url: Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType
- name: SDLServiceUpdateReason
url: Type%20Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason
- name: SDLSoftButtonType
diff --git a/docs/search.json b/docs/search.json
index ba00d7a6b..167d100d9 100644
--- a/docs/search.json
+++ b/docs/search.json
@@ -1 +1 @@
-{"Type%20Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus":{"name":"SDLAmbientLightStatus","abstract":"<p>Reflects the status of the ambient light sensor for headlamps</p>"},"Type%20Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType":{"name":"SDLAppHMIType","abstract":"<p>Enumeration listing possible app hmi types.</p>"},"Type%20Definitions.html#/c:SDLAppInterfaceUnregisteredReason.h@T@SDLAppInterfaceUnregisteredReason":{"name":"SDLAppInterfaceUnregisteredReason","abstract":"<p>Indicates reason why app interface was unregistered. The application is being disconnected by SDL.</p>"},"Type%20Definitions.html#/c:SDLAppServiceType.h@T@SDLAppServiceType":{"name":"SDLAppServiceType","abstract":"<p>Enumeration listing possible app service types.</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator":{"name":"SDLAudioStreamingIndicator","abstract":"<p>Enumeration listing possible indicators of audio streaming changes</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingState.h@T@SDLAudioStreamingState":{"name":"SDLAudioStreamingState","abstract":"<p>Describes whether or not streaming audio is currently audible to the user. Though provided in every OnHMIStatus notification, this information is only relevant for applications that declare themselves as media apps in RegisterAppInterface</p>"},"Type%20Definitions.html#/c:SDLAudioType.h@T@SDLAudioType":{"name":"SDLAudioType","abstract":"<p>Describes different audio type options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLBitsPerSample.h@T@SDLBitsPerSample":{"name":"SDLBitsPerSample","abstract":"<p>Describes different bit depth options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLButtonEventMode.h@T@SDLButtonEventMode":{"name":"SDLButtonEventMode","abstract":"<p>Indicates whether the button was depressed or released. A BUTTONUP event will always be preceded by a BUTTONDOWN event.</p>"},"Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName":{"name":"SDLButtonName","abstract":"<p>Defines logical buttons which, on a given SDL unit, would correspond to either physical or soft (touchscreen) buttons. These logical buttons present a standard functional abstraction which the developer can rely upon, independent of the SDL unit. For example, the developer can rely upon the OK button having the same meaning to the user across SDL platforms.</p>"},"Type%20Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode":{"name":"SDLButtonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press</p>"},"Type%20Definitions.html#/c:SDLCapacityUnit.h@T@SDLCapacityUnit":{"name":"SDLCapacityUnit","abstract":"<p>@since SDL 7.0.0</p>"},"Type%20Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus":{"name":"SDLCarModeStatus","abstract":"<p>Describes the carmode the vehicle is in. Used in ClusterModeStatus</p>"},"Type%20Definitions.html#/c:SDLCharacterSet.h@T@SDLCharacterSet":{"name":"SDLCharacterSet","abstract":"<p>The list of potential character sets</p>"},"Type%20Definitions.html#/c:SDLChoiceSet.h@T@SDLChoiceSetCanceledHandler":{"name":"SDLChoiceSetCanceledHandler","abstract":"<p>Notifies the subscriber that the choice set should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLCompassDirection.h@T@SDLCompassDirection":{"name":"SDLCompassDirection","abstract":"<p>The list of potential compass directions. Used in GPS data</p>"},"Type%20Definitions.html#/c:SDLComponentVolumeStatus.h@T@SDLComponentVolumeStatus":{"name":"SDLComponentVolumeStatus","abstract":"<p>The volume status of a vehicle component. Used in SingleTireStatus and VehicleData Fuel Level</p>"},"Type%20Definitions.html#/c:SDLDefrostZone.h@T@SDLDefrostZone":{"name":"SDLDefrostZone","abstract":"<p>Enumeration listing possible defrost zones. Used in ClimateControlCapabilities and Data.</p>"},"Type%20Definitions.html#/c:SDLDeliveryMode.h@T@SDLDeliveryMode":{"name":"SDLDeliveryMode","abstract":"<p>Specifies the mode in which the sendLocation request is sent. Used in SendLocation.</p>"},"Type%20Definitions.html#/c:SDLDeviceLevelStatus.h@T@SDLDeviceLevelStatus":{"name":"SDLDeviceLevelStatus","abstract":"<p>Reflects the reported battery status of the connected device, if reported. Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLDimension.h@T@SDLDimension":{"name":"SDLDimension","abstract":"<p>The supported dimensions of the GPS. Used in GPSData</p>"},"Type%20Definitions.html#/c:SDLDirection.h@T@SDLDirection":{"name":"SDLDirection","abstract":"<p>A navigation direction.</p>"},"Type%20Definitions.html#/c:SDLDisplayMode.h@T@SDLDisplayMode":{"name":"SDLDisplayMode","abstract":"<p>Identifies the various display types used by SDL.</p>"},"Type%20Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType":{"name":"SDLDisplayType","abstract":"<p>Identifies the various display types used by SDL. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit":{"name":"SDLDistanceUnit","abstract":"<p>Wiper Status</p>"},"Type%20Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState":{"name":"SDLDriverDistractionState","abstract":"<p>Enumeration that describes possible states of driver distraction. Used in OnDriverDistraction.</p>"},"Type%20Definitions.html#/c:SDLECallConfirmationStatus.h@T@SDLECallConfirmationStatus":{"name":"SDLECallConfirmationStatus","abstract":"<p>Reflects the status of the eCall Notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus":{"name":"SDLElectronicParkBrakeStatus","abstract":"<p>Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.</p>"},"Type%20Definitions.html#/c:SDLEmergencyEventType.h@T@SDLEmergencyEventType":{"name":"SDLEmergencyEventType","abstract":"<p>Reflects the emergency event status of the vehicle. Used in EmergencyEvent</p>"},"Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum":{"name":"SDLEnum","abstract":"<p>NSString SDLEnum typedef</p>"},"Type%20Definitions.html#/c:SDLErrorConstants.h@T@SDLErrorDomain":{"name":"SDLErrorDomain","abstract":"<p>A typedef declaration of the SDL error domain</p>"},"Type%20Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler":{"name":"SDLFileManagerStartupCompletionHandler","abstract":"<p>The handler that is called when the manager is set up or failed to set up with an error."},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileName":{"name":"SDLFileName","abstract":"<p>Typedef SDLFileName</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler":{"name":"SDLFileManagerUploadCompletionHandler","abstract":"<p>A completion handler called after a response from Core to a upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler":{"name":"SDLFileManagerMultiUploadCompletionHandler","abstract":"<p>A completion handler called after a set of upload requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler":{"name":"SDLFileManagerMultiUploadProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to a upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler":{"name":"SDLFileManagerDeleteCompletionHandler","abstract":"<p>A completion handler called after a response from Core to a delete request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler":{"name":"SDLFileManagerMultiDeleteCompletionHandler","abstract":"<p>A completion handler called after a set of delete requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler":{"name":"SDLFileManagerListFilesCompletionHandler","abstract":"<p>A completion handler called after response from Core to a list files request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler":{"name":"SDLFileManagerUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a response from Core to a artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler":{"name":"SDLFileManagerMultiUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a set of upload artwork requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler":{"name":"SDLFileManagerMultiUploadArtworkProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileType.h@T@SDLFileType":{"name":"SDLFileType","abstract":"<p>Enumeration listing possible file types. Used in SDLFile, PutFile, ImageField, OnSystemRequest</p>"},"Type%20Definitions.html#/c:SDLFuelCutoffStatus.h@T@SDLFuelCutoffStatus":{"name":"SDLFuelCutoffStatus","abstract":"<p>Reflects the status of the Restraints Control Module fuel pump cutoff. The fuel pump is cut off typically after the vehicle has had a collision. Used in EmergencyEvent.</p>"},"Type%20Definitions.html#/c:SDLFuelType.h@T@SDLFuelType":{"name":"SDLFuelType","abstract":"<p>Enumeration listing possible fuel types.</p>"},"Type%20Definitions.html#/c:SDLGlobalProperty.h@T@SDLGlobalProperty":{"name":"SDLGlobalProperty","abstract":"<p>Properties of a user-initiated VR interaction (i.e. interactions started by the user pressing the PTT button). Used in RPCs related to ResetGlobalProperties</p>"},"Type%20Definitions.html#/c:SDLHMILevel.h@T@SDLHMILevel":{"name":"SDLHMILevel","abstract":"<p>Specifies current level of the HMI. An HMI level indicates the degree of user interaction possible through the HMI (e.g. TTS only, display only, VR, etc.). The HMI level varies for an application based on the type of display (i.e. Nav or non-Nav) and the user directing &ldquo;focus&rdquo; to other applications (e.g. phone, other mobile applications, etc.). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLHMIZoneCapabilities.h@T@SDLHMIZoneCapabilities":{"name":"SDLHMIZoneCapabilities","abstract":"<p>Specifies HMI Zones in the vehicle. Used in RegisterAppInterfaceResponse</p>"},"Type%20Definitions.html#/c:SDLHybridAppPreference.h@T@SDLHybridAppPreference":{"name":"SDLHybridAppPreference","abstract":"<p>Enumeration for the user&rsquo;s preference of which app type to use when both are available.</p>"},"Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus":{"name":"SDLIgnitionStableStatus","abstract":"<p>Reflects the ignition switch stability. Used in BodyInformation</p>"},"Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus":{"name":"SDLIgnitionStatus","abstract":"<p>Reflects the status of ignition. Used in BodyInformation.</p>"},"Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName":{"name":"SDLImageFieldName","abstract":"<p>The name that identifies the field. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLImageType.h@T@SDLImageType":{"name":"SDLImageType","abstract":"<p>Contains information about the type of image. Used in Image.</p>"},"Type%20Definitions.html#/c:SDLInteractionMode.h@T@SDLInteractionMode":{"name":"SDLInteractionMode","abstract":"<p>For application-initiated interactions (SDLPerformInteraction), this specifies the mode by which the user is prompted and by which the user&rsquo;s selection is indicated. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutocompleteCompletionHandler":{"name":"SDLKeyboardAutocompleteCompletionHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutoCompleteResultsHandler":{"name":"SDLKeyboardAutoCompleteResultsHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler":{"name":"SDLKeyboardCharacterSetCompletionHandler","abstract":"<p>This handler is called when you wish to update your keyboard&rsquo;s limitedCharacterSet in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent":{"name":"SDLKeyboardEvent","abstract":"<p>Enumeration listing possible keyboard events. Used in OnKeyboardInput.</p>"},"Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout":{"name":"SDLKeyboardLayout","abstract":"<p>Enumeration listing possible keyboard layouts. Used in KeyboardProperties.</p>"},"Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode":{"name":"SDLKeypressMode","abstract":"<p>Enumeration listing possible keyboard events.</p>"},"Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage":{"name":"SDLLanguage","abstract":"<p>Specifies the language to be used for TTS, VR, displayed messages/menus. Used in ChangeRegistration and RegisterAppInterface.</p>"},"Type%20Definitions.html#/c:SDLLayoutMode.h@T@SDLLayoutMode":{"name":"SDLLayoutMode","abstract":"<p>For touchscreen interactions, the mode of how the choices are presented. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLLightName.h@T@SDLLightName":{"name":"SDLLightName","abstract":"<p>The name that identifies the Light</p>"},"Type%20Definitions.html#/c:SDLLightStatus.h@T@SDLLightStatus":{"name":"SDLLightStatus","abstract":"<p>Reflects the status of Light.</p>"},"Type%20Definitions.html#/c:SDLLockScreenViewController.h@T@SwipeGestureCallbackBlock":{"name":"SwipeGestureCallbackBlock","abstract":"<p>A block that can be used to close the lockscreen when the user swipes on the lockscreen. Override this in your own custom view controllers if you build a custom lock screen.</p>"},"Type%20Definitions.html#/c:SDLLogConstants.h@T@SDLLogFilterBlock":{"name":"SDLLogFilterBlock","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>"},"Type%20Definitions.html#/c:SDLMaintenanceModeStatus.h@T@SDLMaintenanceModeStatus":{"name":"SDLMaintenanceModeStatus","abstract":"<p>Describes the maintenence mode. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock":{"name":"SDLManagerReadyBlock","abstract":"<p>The block called when the manager is ready to be used or an error occurs while attempting to become ready.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock":{"name":"SDLRPCUpdatedBlock","abstract":"<p>The block that will be called every time an RPC is received when subscribed to an RPC.</p>"},"Type%20Definitions.html#/c:SDLMassageCushion.h@T@SDLMassageCushion":{"name":"SDLMassageCushion","abstract":"<p>The List possible cushions of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMassageMode.h@T@SDLMassageMode":{"name":"SDLMassageMode","abstract":"<p>The List possible modes of a massage zone.</p>"},"Type%20Definitions.html#/c:SDLMassageZone.h@T@SDLMassageZone":{"name":"SDLMassageZone","abstract":"<p>List possible zones of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMediaClockFormat.h@T@SDLMediaClockFormat":{"name":"SDLMediaClockFormat","abstract":"<p>Indicates the format of the time displayed on the connected SDL unit.</p>"},"Type%20Definitions.html#/c:SDLMediaType.h@T@SDLMediaType":{"name":"SDLMediaType","abstract":"<p>Enumeration listing possible media types.</p>"},"Type%20Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler":{"name":"SDLMenuCellSelectionHandler","abstract":"<p>The handler to run when a menu item is selected.</p>"},"Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout":{"name":"SDLMenuLayout","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLMetadataType.h@T@SDLMetadataType":{"name":"SDLMetadataType","abstract":"<p>Text Field metadata types. Used in Show.</p>"},"Type%20Definitions.html#/c:SDLModuleType.h@T@SDLModuleType":{"name":"SDLModuleType","abstract":"<p>The type of remote control data. Used in ButtonPress, GetInteriorVehicleData, and ModuleData</p>"},"Type%20Definitions.html#/c:SDLNavigationAction.h@T@SDLNavigationAction":{"name":"SDLNavigationAction","abstract":"<p>A navigation action.</p>"},"Type%20Definitions.html#/c:SDLNavigationJunction.h@T@SDLNavigationJunction":{"name":"SDLNavigationJunction","abstract":"<p>A navigation junction type.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName":{"name":"SDLNotificationName","abstract":"<p>NSNotification names specific to incoming SDL RPC</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey":{"name":"SDLNotificationUserInfoKey","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userInfo dictionary.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLAudioPassThruHandler":{"name":"SDLAudioPassThruHandler","abstract":"<p>A handler used on SDLPerformAudioPassThru.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler":{"name":"SDLResponseHandler","abstract":"<p>A handler used on all RPC requests which fires when the response is received.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler":{"name":"SDLMultipleRequestCompletionHandler","abstract":"<p>A completion handler called after a sequential or simultaneous set of requests have completed sending.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler":{"name":"SDLMultipleSequentialRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler":{"name":"SDLMultipleAsyncRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCButtonNotificationHandler":{"name":"SDLRPCButtonNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLSubscribeButton or SDLSoftButton has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler":{"name":"SDLRPCCommandNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLAddCommand has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLPRNDL.h@T@SDLPRNDL":{"name":"SDLPRNDL","abstract":"<p>The selected gear the car is in. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName":{"name":"SDLPermissionRPCName","abstract":"<p>NSString typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier":{"name":"SDLPermissionObserverIdentifier","abstract":"<p>NSUUID typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler":{"name":"SDLPermissionsChangedHandler","abstract":"<p>This is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler":{"name":"SDLRPCPermissionStatusChangedHandler","abstract":"<p>A block that will be called when specified permissions change. It will return whether each RPC and its parameters are allowed as well as the permission group status of all the RPCs.</p>"},"Type%20Definitions.html#/c:SDLPermissionStatus.h@T@SDLPermissionStatus":{"name":"SDLPermissionStatus","abstract":"<p>Enumeration that describes possible permission states of a policy table entry. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLPowerModeQualificationStatus.h@T@SDLPowerModeQualificationStatus":{"name":"SDLPowerModeQualificationStatus","abstract":"<p>Describes the power mode qualification status. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPowerModeStatus.h@T@SDLPowerModeStatus":{"name":"SDLPowerModeStatus","abstract":"<p>The status of the car&rsquo;s power. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPredefinedLayout.h@T@SDLPredefinedLayout":{"name":"SDLPredefinedLayout","abstract":"<p>A template layout an app uses to display information. The broad details of the layout are defined, but the details depend on the IVI system. Used in SetDisplayLayout.</p>"},"Type%20Definitions.html#/c:SDLPrerecordedSpeech.h@T@SDLPrerecordedSpeech":{"name":"SDLPrerecordedSpeech","abstract":"<p>Contains information about the speech capabilities on the SDL platform. Used in RegisterAppInterfaceResponse to indicate capability.</p>"},"Type%20Definitions.html#/c:SDLPrimaryAudioSource.h@T@SDLPrimaryAudioSource":{"name":"SDLPrimaryAudioSource","abstract":"<p>Reflects the current primary audio source of SDL (if selected). Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName":{"name":"SDLRPCFunctionName","abstract":"<p>All RPC request / response / notification names</p>"},"Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName":{"name":"SDLRPCMessageTypeName","abstract":"<p>A type of RPC message</p>"},"Type%20Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand":{"name":"SDLRadioBand","abstract":"<p>Radio bands, such as AM and FM, used in RadioControlData</p>"},"Type%20Definitions.html#/c:SDLRadioState.h@T@SDLRadioState":{"name":"SDLRadioState","abstract":"<p>List possible states of a remote control radio module. Used in RadioControlData.</p>"},"Type%20Definitions.html#/c:SDLRequestType.h@T@SDLRequestType":{"name":"SDLRequestType","abstract":"<p>A type of system request. Used in SystemRequest.</p>"},"Type%20Definitions.html#/c:SDLResult.h@T@SDLResult":{"name":"SDLResult","abstract":"<p>Defines the possible result codes returned by SDL to the application in a response to a requested operation. Used in RPC responses</p>"},"Type%20Definitions.html#/c:SDLSamplingRate.h@T@SDLSamplingRate":{"name":"SDLSamplingRate","abstract":"<p>Describes different sampling rates for PerformAudioPassThru and AudioPassThruCapabilities</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler":{"name":"SDLScreenManagerUpdateCompletionHandler","abstract":"<p>The handler run when the update has completed</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler":{"name":"SDLPreloadChoiceCompletionHandler","abstract":"<p>Return an error with userinfo [key: SDLChoiceCell, value: NSError] if choices failed to upload</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler":{"name":"SDLSubscribeButtonHandler","abstract":"<p>A handler run when the subscribe button has been selected</p>"},"Type%20Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType":{"name":"SDLSeatMemoryActionType","abstract":"<p>List of possible actions on Seat Meomry</p>"},"Type%20Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason":{"name":"SDLServiceUpdateReason","abstract":"<p>Enumeration listing possible service update reasons.</p>"},"Type%20Definitions.html#/c:SDLSoftButtonType.h@T@SDLSoftButtonType":{"name":"SDLSoftButtonType","abstract":"<p>SoftButtonType (TEXT / IMAGE / BOTH). Used by SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities":{"name":"SDLSpeechCapabilities","abstract":"<p>Contains information about TTS capabilities on the SDL platform. Used in RegisterAppInterfaceResponse, and TTSChunk.</p>"},"Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName":{"name":"SDLStaticIconName","abstract":"<p>Static icon names</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLVideoStreamManagerState":{"name":"SDLVideoStreamManagerState","abstract":"<p>The current state of the video stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAudioStreamManagerState":{"name":"SDLAudioStreamManagerState","abstract":"<p>The current state of the audio stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAppState":{"name":"SDLAppState","abstract":"<p>Typedef SDLAppState</p>"},"Type%20Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat":{"name":"SDLSupportedSeat","abstract":"<p>List possible seats that is a remote controllable seat.</p>"},"Type%20Definitions.html#/c:SDLSystemAction.h@T@SDLSystemAction":{"name":"SDLSystemAction","abstract":"<p>Enumeration that describes system actions that can be triggered. Used in SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler":{"name":"SDLUpdateCapabilityHandler","abstract":"<p>A completion handler called after a request for the capability type is returned from the remote system.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateHandler":{"name":"SDLCapabilityUpdateHandler","abstract":"<p>An observer block for whenever a subscription is called.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateWithErrorHandler":{"name":"SDLCapabilityUpdateWithErrorHandler","abstract":"<p>An observer block for whenever a subscription or value is retrieved.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType":{"name":"SDLSystemCapabilityType","abstract":"<p>The type of system capability to get more information on. Used in GetSystemCapability.</p>"},"Type%20Definitions.html#/c:SDLSystemContext.h@T@SDLSystemContext":{"name":"SDLSystemContext","abstract":"<p>Indicates whether or not a user-initiated interaction is in progress, and if so, in what mode (i.e. MENU or VR). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLTBTState.h@T@SDLTBTState":{"name":"SDLTBTState","abstract":"<p>The turn-by-turn state, used in OnTBTClientState.</p>"},"Type%20Definitions.html#/c:SDLTPMS.h@T@SDLTPMS":{"name":"SDLTPMS","abstract":"<p>An enum representing values of the tire pressure monitoring system</p>"},"Type%20Definitions.html#/c:SDLTemperatureUnit.h@T@SDLTemperatureUnit":{"name":"SDLTemperatureUnit","abstract":"<p>The unit of temperature to display. Used in Temperature.</p>"},"Type%20Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment":{"name":"SDLTextAlignment","abstract":"<p>The list of possible alignments of text in a field. May only work on some display types. used in Show.</p>"},"Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName":{"name":"SDLTextFieldName","abstract":"<p>Names of the text fields that can appear on a SDL display. Used in TextFieldName.</p>"},"Type%20Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode":{"name":"SDLTimerMode","abstract":"<p>The direction of a timer. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler":{"name":"SDLTouchEventHandler","abstract":"<p>Handler for touch events</p>"},"Type%20Definitions.html#/c:SDLTouchType.h@T@SDLTouchType":{"name":"SDLTouchType","abstract":"<p>The type of a touch in a projection application. Used in OnTouchEvent.</p>"},"Type%20Definitions.html#/c:SDLTransmissionType.h@T@SDLTransmissionType":{"name":"SDLTransmissionType","abstract":"<p>Type of transmission used in the vehicle.</p>"},"Type%20Definitions.html#/c:SDLTriggerSource.h@T@SDLTriggerSource":{"name":"SDLTriggerSource","abstract":"<p>Indicates whether choice/command was selected via VR or via a menu selection (using SEEKRIGHT/SEEKLEFT, TUNEUP, TUNEDOWN, OK buttons). Used in PerformInteractionResponse and OnCommand.</p>"},"Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal":{"name":"SDLTurnSignal","abstract":"<p>Enumeration that describes the status of the turn light indicator.</p>"},"Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode":{"name":"SDLUpdateMode","abstract":"<p>Specifies what function should be performed on the media clock/counter. Used in SetMediaClockTimer.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataActiveStatus.h@T@SDLVehicleDataActiveStatus":{"name":"SDLVehicleDataActiveStatus","abstract":"<p>Vehicle Data Activity Status. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus":{"name":"SDLVehicleDataEventStatus","abstract":"<p>Reflects the status of a vehicle data event; e.g. a seat belt event status. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataNotificationStatus.h@T@SDLVehicleDataNotificationStatus":{"name":"SDLVehicleDataNotificationStatus","abstract":"<p>Reflects the status of a vehicle data notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLVehicleDataResultCode.h@T@SDLVehicleDataResultCode":{"name":"SDLVehicleDataResultCode","abstract":"<p>Vehicle Data Result Code. Used in DIDResult.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataStatus.h@T@SDLVehicleDataStatus":{"name":"SDLVehicleDataStatus","abstract":"<p>Reflects the status of a binary vehicle data item. Used in MyKey.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType":{"name":"SDLVehicleDataType","abstract":"<p>Defines the vehicle data types that can be published and/or subscribed to using SDLSubscribeVehicleData. Used in VehicleDataResult</p>"},"Type%20Definitions.html#/c:SDLVentilationMode.h@T@SDLVentilationMode":{"name":"SDLVentilationMode","abstract":"<p>The ventilation mode. Used in ClimateControlCapabilities</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingCodec.h@T@SDLVideoStreamingCodec":{"name":"SDLVideoStreamingCodec","abstract":"<p>Enum for each type of video streaming codec. Used in VideoStreamingFormat.</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingProtocol.h@T@SDLVideoStreamingProtocol":{"name":"SDLVideoStreamingProtocol","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingState.h@T@SDLVideoStreamingState":{"name":"SDLVideoStreamingState","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVoiceCommand.h@T@SDLVoiceCommandSelectionHandler":{"name":"SDLVoiceCommandSelectionHandler","abstract":"<p>The handler that will be called when the command is activated</p>"},"Type%20Definitions.html#/c:SDLVrCapabilities.h@T@SDLVRCapabilities":{"name":"SDLVRCapabilities","abstract":"<p>The VR capabilities of the connected SDL platform. Used in RegisterAppInterfaceResponse.</p>"},"Type%20Definitions.html#/c:SDLWarningLightStatus.h@T@SDLWarningLightStatus":{"name":"SDLWarningLightStatus","abstract":"<p>Reflects the status of a cluster instrument warning light. Used in TireStatus</p>"},"Type%20Definitions.html#/c:SDLWayPointType.h@T@SDLWayPointType":{"name":"SDLWayPointType","abstract":"<p>The type of a navigation waypoint. Used in GetWayPoints.</p>"},"Type%20Definitions.html#/c:SDLWindowType.h@T@SDLWindowType":{"name":"SDLWindowType","abstract":"<p>The type of the window to be created. Main window or widget.</p>"},"Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus":{"name":"SDLWiperStatus","abstract":"<p>The status of the windshield wipers. Used in retrieving vehicle data.</p>"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveSingleTapForView:atPoint:":{"name":"-touchManager:didReceiveSingleTapForView:atPoint:","abstract":"<p>A single tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveDoubleTapForView:atPoint:":{"name":"-touchManager:didReceiveDoubleTapForView:atPoint:","abstract":"<p>A double tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidStartInView:atPoint:":{"name":"-touchManager:panningDidStartInView:atPoint:","abstract":"<p>Panning started</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePanningFromPoint:toPoint:":{"name":"-touchManager:didReceivePanningFromPoint:toPoint:","abstract":"<p>Panning moved between points</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidEndInView:atPoint:":{"name":"-touchManager:panningDidEndInView:atPoint:","abstract":"<p>Panning ended</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningCanceledAtPoint:":{"name":"-touchManager:panningCanceledAtPoint:","abstract":"<p>Panning canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidStartInView:atCenterPoint:":{"name":"-touchManager:pinchDidStartInView:atCenterPoint:","abstract":"<p>Pinch did start</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchAtCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchAtCenterPoint:withScale:","abstract":"<p>@abstract","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchInView:atCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchInView:atCenterPoint:withScale:","abstract":"<p>Pinch moved and changed scale</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidEndInView:atCenterPoint:":{"name":"-touchManager:pinchDidEndInView:atCenterPoint:","abstract":"<p>Pinch did end</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchCanceledAtCenterPoint:":{"name":"-touchManager:pinchCanceledAtCenterPoint:","abstract":"<p>Pinch canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)preferredVideoFormatOrderFromHeadUnitPreferredOrder:":{"name":"-preferredVideoFormatOrderFromHeadUnitPreferredOrder:","abstract":"<p>Implement to return a different preferred order of attempted format usage than the head unit&rsquo;s preferred order. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing).</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)resolutionFromHeadUnitPreferredResolution:":{"name":"-resolutionFromHeadUnitPreferredResolution:","abstract":"<p>Implement to return a different resolution to use for video streaming than the head unit&rsquo;s requested resolution. If you return a resolution that the head unit does not like, the manager will fail to start up. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing), and adapt your UI to the head unit&rsquo;s preferred resolution instead.</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio byte stream is currently connected</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>Send audio data bytes over the audio byte stream</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLServiceEncryptionDelegate.html#/c:objc(pl)SDLServiceEncryptionDelegate(im)serviceEncryptionUpdatedOnService:encrypted:error:":{"name":"-serviceEncryptionUpdatedOnService:encrypted:error:","abstract":"<p>Called when the encryption service has been.</p>","parent_name":"SDLServiceEncryptionDelegate"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(py)appId":{"name":"appId","abstract":"<p>The app id of the app</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)initializeWithAppId:completionHandler:":{"name":"-initializeWithAppId:completionHandler:","abstract":"<p>Initialize the SDL security library with the app&rsquo;s id and a completion handler</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)stop":{"name":"-stop","abstract":"<p>Stop the security library</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)runHandshakeWithClientData:error:":{"name":"-runHandshakeWithClientData:error:","abstract":"<p>Run the SSL/TLS handshake</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)encryptData:withError:":{"name":"-encryptData:withError:","abstract":"<p>Encrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)decryptData:withError:":{"name":"-decryptData:withError:","abstract":"<p>Decrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(cm)availableMakes":{"name":"+availableMakes","abstract":"<p>The vehicle makes this security library covers</p>","parent_name":"SDLSecurityType"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerDidDisconnect":{"name":"-managerDidDisconnect","abstract":"<p>Called upon a disconnection from the remote system.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)hmiLevel:didChangeToLevel:":{"name":"-hmiLevel:didChangeToLevel:","abstract":"<p>Called when the HMI level state of this application changes on the remote system. This is equivalent to the application&rsquo;s state changes in iOS such as foreground, background, or closed.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)audioStreamingState:didChangeToState:":{"name":"-audioStreamingState:didChangeToState:","abstract":"<p>Called when the audio streaming state of this application changes on the remote system. This refers to when streaming audio is audible to the user.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)videoStreamingState:didChangetoState:":{"name":"-videoStreamingState:didChangetoState:","abstract":"<p>Called when the video streaming state of this application changes. This refers to streaming video for navigation purposes. If you are &ldquo;autostreaming&rdquo; via CarWindow, you should not do anything with this method. Everything should be handled for you automatically.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)systemContext:didChangeToContext:":{"name":"-systemContext:didChangeToContext:","abstract":"<p>Called when the system context of this application changes on the remote system. This refers to whether or not a user-initiated interaction is in progress, and if so, what it is.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerShouldUpdateLifecycleToLanguage:hmiLanguage:":{"name":"-managerShouldUpdateLifecycleToLanguage:hmiLanguage:","abstract":"<p>Called when the lifecycle manager detected a language mismatch. In case of a language mismatch the manager should change the apps registration by updating the lifecycle configuration to the specified language. If the app can support the specified language it should return an Object of SDLLifecycleConfigurationUpdate, otherwise it should return nil to indicate that the language is not supported.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(cm)logger":{"name":"+logger","abstract":"<p>A simple convenience initializer to create the object. This <em>should not</em> start up the logger.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)setupLogger":{"name":"-setupLogger","abstract":"<p>A call to setup the logger in whatever manner it needs to do so.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)logWithLog:formattedLog:":{"name":"-logWithLog:formattedLog:","abstract":"<p>Log a particular log using the model and the formatted log message to the target.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)teardownLogger":{"name":"-teardownLogger","abstract":"<p>The log target should be torn down. e.g. file handles should be closed</p>","parent_name":"SDLLogTarget"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)userDidSubmitInput:withEvent:":{"name":"-userDidSubmitInput:withEvent:","abstract":"<p>The keyboard session completed with some input.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidAbortWithReason:":{"name":"-keyboardDidAbortWithReason:","abstract":"<p>The keyboard session aborted.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)customKeyboardConfiguration":{"name":"-customKeyboardConfiguration","abstract":"<p>Implement this in order to provide a custom keyboard configuration to just this keyboard. To apply default settings to all keyboards, see SDLScreenManager.keyboardConfiguration</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateAutocompleteWithInput:autoCompleteResultsHandler:":{"name":"-updateAutocompleteWithInput:autoCompleteResultsHandler:","abstract":"<p>Implement this if you wish to updated the KeyboardProperties.autoCompleteList as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateCharacterSetWithInput:completionHandler:":{"name":"-updateCharacterSetWithInput:completionHandler:","abstract":"<p>Implement this if you wish to update the limitedCharacterSet as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidSendEvent:text:":{"name":"-keyboardDidSendEvent:text:","abstract":"<p>Implement this to be notified of all events occurring on the keyboard</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didSelectChoice:withSource:atRowIndex:":{"name":"-choiceSet:didSelectChoice:withSource:atRowIndex:","abstract":"<p>Delegate method called after a choice set item is selected</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didReceiveError:":{"name":"-choiceSet:didReceiveError:","abstract":"<p>Delegate method called on an error</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:fileDidFinishPlaying:successfully:":{"name":"-audioStreamManager:fileDidFinishPlaying:successfully:","abstract":"<p>Called when a file from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForFile:error:":{"name":"-audioStreamManager:errorDidOccurForFile:error:","abstract":"<p>Called when a file from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:dataBufferDidFinishPlayingSuccessfully:":{"name":"-audioStreamManager:dataBufferDidFinishPlayingSuccessfully:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForDataBuffer:":{"name":"-audioStreamManager:errorDidOccurForDataBuffer:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols.html#/c:objc(pl)SDLInt":{"name":"SDLInt","abstract":"<p>A declaration that this NSNumber contains an NSInteger.</p>"},"Protocols.html#/c:objc(pl)SDLUInt":{"name":"SDLUInt","abstract":"<p>A declaration that this NSNumber contains an NSUInteger.</p>"},"Protocols.html#/c:objc(pl)SDLBool":{"name":"SDLBool","abstract":"<p>A declaration that this NSNumber contains a BOOL.</p>"},"Protocols.html#/c:objc(pl)SDLFloat":{"name":"SDLFloat","abstract":"<p>A declaration that this NSNumber contains a float.</p>"},"Protocols/SDLAudioStreamManagerDelegate.html":{"name":"SDLAudioStreamManagerDelegate","abstract":"<p>Delegate for the AudioStreamManager</p>"},"Protocols/SDLChoiceSetDelegate.html":{"name":"SDLChoiceSetDelegate","abstract":"<p>Delegate for the the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>"},"Protocols/SDLKeyboardDelegate.html":{"name":"SDLKeyboardDelegate","abstract":"<p>They delegate of a keyboard popup allowing customization at runtime of the keyboard.</p>"},"Protocols/SDLLogTarget.html":{"name":"SDLLogTarget","abstract":"<p>A protocol describing a place logs from SDLLogManager are logged to</p>"},"Protocols/SDLManagerDelegate.html":{"name":"SDLManagerDelegate","abstract":"<p>The manager&rsquo;s delegate</p>"},"Protocols/SDLSecurityType.html":{"name":"SDLSecurityType","abstract":"<p>A protocol used by SDL Security libraries.</p>"},"Protocols/SDLServiceEncryptionDelegate.html":{"name":"SDLServiceEncryptionDelegate","abstract":"<p>Delegate for the encryption service.</p>"},"Protocols/SDLStreamingAudioManagerType.html":{"name":"SDLStreamingAudioManagerType","abstract":"<p>Streaming audio manager</p>"},"Protocols/SDLStreamingMediaManagerDataSource.html":{"name":"SDLStreamingMediaManagerDataSource","abstract":"<p>A data source for the streaming manager&rsquo;s preferred resolutions and preferred formats.</p>"},"Protocols/SDLTouchManagerDelegate.html":{"name":"SDLTouchManagerDelegate","abstract":"<p>The delegate to be notified of processed touches such as pinches, pans, and taps</p>"},"Enums/SDLTouchIdentifier.html#/c:@E@SDLTouchIdentifier@SDLTouchIdentifierFirstFinger":{"name":"SDLTouchIdentifierFirstFinger","abstract":"<p>Touch was first finger</p>","parent_name":"SDLTouchIdentifier"},"Enums/SDLTouchIdentifier.html#/c:@E@SDLTouchIdentifier@SDLTouchIdentifierSecondFinger":{"name":"SDLTouchIdentifierSecondFinger","abstract":"<p>Touch was second finger</p>","parent_name":"SDLTouchIdentifier"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagNone":{"name":"SDLStreamingEncryptionFlagNone","abstract":"<p>It should not be encrypted at all</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateOnly":{"name":"SDLStreamingEncryptionFlagAuthenticateOnly","abstract":"<p>It should use SSL/TLS only to authenticate</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateAndEncrypt":{"name":"SDLStreamingEncryptionFlagAuthenticateAndEncrypt","abstract":"<p>All data on these services should be encrypted using SSL/TLS</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeLayer":{"name":"SDLCarWindowRenderingTypeLayer","abstract":"<p>Instead of rendering your UIViewController&rsquo;s view, this will render the layer using renderInContext</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewAfterScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewAfterScreenUpdates","abstract":"<p>Renders your UIViewController&rsquo;s view using drawViewHierarchyInRect:bounds afterScreenUpdates:YES</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewBeforeScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewBeforeScreenUpdates","abstract":"<p>Renders your UIViewController&rsquo;s view using drawViewHierarchyInRect:bounds afterScreenUpdates:NO</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeRequest":{"name":"SDLRPCMessageTypeRequest","abstract":"<p>A request that will require a response</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeResponse":{"name":"SDLRPCMessageTypeResponse","abstract":"<p>A response to a request</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeNotification":{"name":"SDLRPCMessageTypeNotification","abstract":"<p>A message that does not have a response</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoHeartbeat":{"name":"SDLFrameInfoHeartbeat","abstract":"<p>A ping packet that is sent to ensure the connection is still active and the service is still valid.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartService":{"name":"SDLFrameInfoStartService","abstract":"<p>Requests that a specific type of service is started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartServiceACK":{"name":"SDLFrameInfoStartServiceACK","abstract":"<p>Acknowledges that the specific service has been started successfully.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartServiceNACK":{"name":"SDLFrameInfoStartServiceNACK","abstract":"<p>Negatively acknowledges that the specific service was not started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndService":{"name":"SDLFrameInfoEndService","abstract":"<p>Requests that a specific type of service is ended.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndServiceACK":{"name":"SDLFrameInfoEndServiceACK","abstract":"<p>Acknowledges that the specific service has been ended successfully.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndServiceNACK":{"name":"SDLFrameInfoEndServiceNACK","abstract":"<p>Negatively acknowledges that the specific service was not ended or has not yet been started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransport":{"name":"SDLFrameInfoRegisterSecondaryTransport","abstract":"<p>Notifies that a Secondary Transport has been established.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransportACK":{"name":"SDLFrameInfoRegisterSecondaryTransportACK","abstract":"<p>Acknowledges that the Secondary Transport has been recognized.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransportNACK":{"name":"SDLFrameInfoRegisterSecondaryTransportNACK","abstract":"<p>Negatively acknowledges that the Secondary Transport has not been recognized.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoTransportEventUpdate":{"name":"SDLFrameInfoTransportEventUpdate","abstract":"<p>Indicates the status or configuration of transport(s) is/are updated.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoServiceDataAck":{"name":"SDLFrameInfoServiceDataAck","abstract":"<p>Deprecated.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoHeartbeatACK":{"name":"SDLFrameInfoHeartbeatACK","abstract":"<p>Acknowledges that a Heartbeat control packet has been received.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoSingleFrame":{"name":"SDLFrameInfoSingleFrame","abstract":"<p>Payload contains a single packet.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoFirstFrame":{"name":"SDLFrameInfoFirstFrame","abstract":"<p>First frame in a multiple frame payload.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoConsecutiveLastFrame":{"name":"SDLFrameInfoConsecutiveLastFrame","abstract":"<p>Frame in a multiple frame payload.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeControl":{"name":"SDLServiceTypeControl","abstract":"<p>The lowest level service available.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeRPC":{"name":"SDLServiceTypeRPC","abstract":"<p>Used to send requests, responses, and notifications between an application and a head unit.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeAudio":{"name":"SDLServiceTypeAudio","abstract":"<p>The application can start the audio service to send PCM audio data to the head unit. After the StartService packet is sent and the ACK received, the payload for the Audio Service is only PCM audio data.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeVideo":{"name":"SDLServiceTypeVideo","abstract":"<p>The application can start the video service to send H.264 video data to the head unit. After the StartService packet is sent and the ACK received, the payload for the Video Service is only H.264 video data.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeBulkData":{"name":"SDLServiceTypeBulkData","abstract":"<p>Similar to the RPC Service but adds a bulk data field. The payload of a message sent via the Hybrid service consists of a Binary Header, JSON Data, and Bulk Data.</p>","parent_name":"SDLServiceType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeControl":{"name":"SDLFrameTypeControl","abstract":"<p>Lowest-level type of packets. They can be sent over any of the defined services. They are used for the control of the services in which they are sent.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeSingle":{"name":"SDLFrameTypeSingle","abstract":"<p>Contains all the data for a particular packet in the payload. The majority of frames sent over the protocol utilize this frame type.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeFirst":{"name":"SDLFrameTypeFirst","abstract":"<p>The First Frame in a multiple frame payload contains information about the entire sequence of frames so that the receiving end can correctly parse all the frames and reassemble the entire payload. The payload of this frame is only eight bytes and contains information regarding the rest of the sequence.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeConsecutive":{"name":"SDLFrameTypeConsecutive","abstract":"<p>The Consecutive Frames in a multiple frame payload contain the actual raw data of the original payload. The parsed payload contained in each of the Consecutive Frames&rsquo; payloads should be buffered until the entire sequence is complete.</p>","parent_name":"SDLFrameType"},"Enums/SDLPredefinedWindows.html#/c:@E@SDLPredefinedWindows@SDLPredefinedWindowsDefaultWindow":{"name":"SDLPredefinedWindowsDefaultWindow","abstract":"<p>The default window is a main window pre-created on behalf of the app.</p>","parent_name":"SDLPredefinedWindows"},"Enums/SDLPredefinedWindows.html#/c:@E@SDLPredefinedWindows@SDLPredefinedWindowsPrimaryWidget":{"name":"SDLPredefinedWindowsPrimaryWidget","abstract":"<p>The primary widget of the app.</p>","parent_name":"SDLPredefinedWindows"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusAllowed":{"name":"SDLPermissionGroupStatusAllowed","abstract":"<p>Every RPC in the group is currently allowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusDisallowed":{"name":"SDLPermissionGroupStatusDisallowed","abstract":"<p>Every RPC in the group is currently disallowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusMixed":{"name":"SDLPermissionGroupStatusMixed","abstract":"<p>Some RPCs in the group are allowed and some disallowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusUnknown":{"name":"SDLPermissionGroupStatusUnknown","abstract":"<p>The current status of the group is unknown.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAllAllowed":{"name":"SDLPermissionGroupTypeAllAllowed","abstract":"<p>Be notified when all of the RPC in the group are allowed, or, when they all stop being allowed in some sense, that is, when they were all allowed, and now they are not.</p>","parent_name":"SDLPermissionGroupType"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAny":{"name":"SDLPermissionGroupTypeAny","abstract":"<p>Be notified when any change in availability occurs among the group.</p>","parent_name":"SDLPermissionGroupType"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateDelete":{"name":"MenuCellStateDelete","abstract":"<p>Marks the cell to be deleted</p>","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateAdd":{"name":"MenuCellStateAdd","abstract":"<p>Marks the cell to be added</p>","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateKeep":{"name":"MenuCellStateKeep","abstract":"<p>Marks the cell to be kept</p>","parent_name":"MenuCellState"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOn":{"name":"SDLDynamicMenuUpdatesModeForceOn","abstract":"<p>Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOff":{"name":"SDLDynamicMenuUpdatesModeForceOff","abstract":"<p>This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeOnWithCompatibility":{"name":"SDLDynamicMenuUpdatesModeOnWithCompatibility","abstract":"<p>This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeSimple":{"name":"SDLLogFormatTypeSimple","abstract":"<p>A bare-bones log format: <code>09:52:07:324 🔹 (SDL)Protocol – a random test i guess</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDefault":{"name":"SDLLogFormatTypeDefault","abstract":"<p>A middle detail default log format: <code>09:52:07:324 🔹 (SDL)Protocol:SDLV2ProtocolHeader:25 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDetailed":{"name":"SDLLogFormatTypeDetailed","abstract":"<p>A very detailed log format: <code>09:52:07:324 🔹 DEBUG com.apple.main-thread:(SDL)Protocol:[SDLV2ProtocolHeader parse:]:74 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDefault":{"name":"SDLLogLevelDefault","abstract":"<p>This is used to describe that a &ldquo;specific&rdquo; logging will instead use the global log level, for example, a module may use the global log level instead of its own by specifying this level.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelOff":{"name":"SDLLogLevelOff","abstract":"<p>This is used to describe a level that involves absolutely no logs being output.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelError":{"name":"SDLLogLevelError","abstract":"<p>Only error level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelWarning":{"name":"SDLLogLevelWarning","abstract":"<p>Both error and warning level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDebug":{"name":"SDLLogLevelDebug","abstract":"<p>Error, warning, and debug level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelVerbose":{"name":"SDLLogLevelVerbose","abstract":"<p>All level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagError":{"name":"SDLLogFlagError","abstract":"<p>Error level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagWarning":{"name":"SDLLogFlagWarning","abstract":"<p>Warning level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagDebug":{"name":"SDLLogFlagDebug","abstract":"<p>Debug level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagVerbose":{"name":"SDLLogFlagVerbose","abstract":"<p>Verbose level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionTransmit":{"name":"SDLLogBytesDirectionTransmit","abstract":"<p>Transmit from the app</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionReceive":{"name":"SDLLogBytesDirectionReceive","abstract":"<p>Receive from the module</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeNever":{"name":"SDLLockScreenConfigurationDisplayModeNever","abstract":"<p>The lock screen should never be shown. This should almost always mean that you will build your own lock screen.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeRequiredOnly":{"name":"SDLLockScreenConfigurationDisplayModeRequiredOnly","abstract":"<p>The lock screen should only be shown when it is required by the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeOptionalOrRequired":{"name":"SDLLockScreenConfigurationDisplayModeOptionalOrRequired","abstract":"<p>The lock screen should be shown when required by the head unit or when the head unit says that its optional, but <em>not</em> in other cases, such as before the user has interacted with your app on the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeAlways":{"name":"SDLLockScreenConfigurationDisplayModeAlways","abstract":"<p>The lock screen should always be shown after connection.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsNone":{"name":"SDLSecondaryTransportsNone","abstract":"<p>No secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsTCP":{"name":"SDLSecondaryTransportsTCP","abstract":"<p>TCP as secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNotConnected":{"name":"SDLAudioStreamManagerErrorNotConnected","abstract":"<p>The audio stream is not currently connected</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNoQueuedAudio":{"name":"SDLAudioStreamManagerErrorNoQueuedAudio","abstract":"<p>Attempted to play but there&rsquo;s no audio in the queue</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLCacheFileManagerError.html#/c:@E@SDLCacheFileManagerError@SDLCacheManagerErrorUpdateIconArchiveFileFailure":{"name":"SDLCacheManagerErrorUpdateIconArchiveFileFailure","abstract":"<p>Failed to update archive file</p>","parent_name":"SDLCacheFileManagerError"},"Enums/SDLRPCStoreError.html#/c:@E@SDLRPCStoreError@SDLRPCStoreErrorGetInvalidObject":{"name":"SDLRPCStoreErrorGetInvalidObject","abstract":"<p>In dictionary stored value with unexpected type</p>","parent_name":"SDLRPCStoreError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorUnknown":{"name":"SDLTransportErrorUnknown","abstract":"<p>Connection cannot be established due to a reason not listed here.</p>","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionRefused":{"name":"SDLTransportErrorConnectionRefused","abstract":"<p>TCP connection is refused.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionTimedOut":{"name":"SDLTransportErrorConnectionTimedOut","abstract":"<p>TCP connection cannot be established within given time.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorNetworkDown":{"name":"SDLTransportErrorNetworkDown","abstract":"<p>TCP connection cannot be established since network is down.","parent_name":"SDLTransportError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities":{"name":"SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities","abstract":"<p>The connected head unit does not support any system capabilities</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorHMINone":{"name":"SDLSystemCapabilityManagerErrorHMINone","abstract":"<p>You must be in an HMI Level other than NONE to request or subscribe to capabilites other than DISPLAYS</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays":{"name":"SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays","abstract":"<p>You may not update the system capability type DISPLAYS because it is always subscribed</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorPendingPresentationDeleted":{"name":"SDLChoiceSetManagerErrorPendingPresentationDeleted","abstract":"<p>The choice set has been deleted before it was presented</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorDeletionFailed":{"name":"SDLChoiceSetManagerErrorDeletionFailed","abstract":"<p>The choice set failed to delete</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorUploadFailed":{"name":"SDLChoiceSetManagerErrorUploadFailed","abstract":"<p>The upload failed</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorFailedToCreateMenuItems":{"name":"SDLChoiceSetManagerErrorFailedToCreateMenuItems","abstract":"<p>The menu items failed to be created</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorInvalidState":{"name":"SDLChoiceSetManagerErrorInvalidState","abstract":"<p>Invalid state</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorRPCsFailed":{"name":"SDLMenuManagerErrorRPCsFailed","abstract":"<p>Sending menu-related RPCs returned an error from the remote system</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLSubscribeButtonManagerError.html#/c:@E@SDLSubscribeButtonManagerError@SDLSubscribeButtonManagerErrorNotSubscribed":{"name":"SDLSubscribeButtonManagerErrorNotSubscribed","abstract":"<p>Attempting to unsubscribe to a subscribe button that has not yet been subscribed to yet.</p>","parent_name":"SDLSubscribeButtonManagerError"},"Enums/SDLSoftButtonManagerError.html#/c:@E@SDLSoftButtonManagerError@SDLSoftButtonManagerErrorPendingUpdateSuperseded":{"name":"SDLSoftButtonManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending update was superseded by a newer requested update. The old update will not be sent</p>","parent_name":"SDLSoftButtonManagerError"},"Enums/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorPendingUpdateSuperseded":{"name":"SDLTextAndGraphicManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending update was superseded by a newer requested update. The old update will not be sent</p>","parent_name":"SDLTextAndGraphicManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorCannotOverwrite":{"name":"SDLFileManagerErrorCannotOverwrite","abstract":"<p>A file attempted to send, but a file with that name already exists on the remote head unit, and the file was not configured to overwrite.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorNoKnownFile":{"name":"SDLFileManagerErrorNoKnownFile","abstract":"<p>A file was attempted to be accessed but it does not exist.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToStart":{"name":"SDLFileManagerErrorUnableToStart","abstract":"<p>The file manager attempted to start but encountered an error.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToUpload":{"name":"SDLFileManagerErrorUnableToUpload","abstract":"<p>The file manager was unable to send this file.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDoesNotExist":{"name":"SDLFileManagerErrorFileDoesNotExist","abstract":"<p>The file manager could not find the local file.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerUploadCanceled":{"name":"SDLFileManagerUploadCanceled","abstract":"<p>The file upload was canceled.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileUploadTasksFailed":{"name":"SDLFileManagerMultipleFileUploadTasksFailed","abstract":"<p>One or more of multiple files being uploaded or deleted failed.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileDeleteTasksFailed":{"name":"SDLFileManagerMultipleFileDeleteTasksFailed","abstract":"<p>One or more of multiple files being uploaded or deleted failed.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDataMissing":{"name":"SDLFileManagerErrorFileDataMissing","abstract":"<p>The file data is nil or empty.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorStaticIcon":{"name":"SDLFileManagerErrorStaticIcon","abstract":"<p>The file is a static icon, which cannot be uploaded</p>","parent_name":"SDLFileManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRPCRequestFailed":{"name":"SDLManagerErrorRPCRequestFailed","abstract":"<p>An RPC request failed to send.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotConnected":{"name":"SDLManagerErrorNotConnected","abstract":"<p>Some action was attempted that requires a connection to the remote head unit.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotReady":{"name":"SDLManagerErrorNotReady","abstract":"<p>Some action was attempted before the ready state was reached.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorUnknownRemoteError":{"name":"SDLManagerErrorUnknownRemoteError","abstract":"<p>The remote system encountered an unknown error.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorManagersFailedToStart":{"name":"SDLManagerErrorManagersFailedToStart","abstract":"<p>One or more of the sub-managers failed to start.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationFailed":{"name":"SDLManagerErrorRegistrationFailed","abstract":"<p>Registering with the remote system failed.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationSuccessWithWarning":{"name":"SDLManagerErrorRegistrationSuccessWithWarning","abstract":"<p>Registering with the remote system was successful, but had a warning.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorCancelled":{"name":"SDLManagerErrorCancelled","abstract":"<p>Request operations were cancelled before they could be sent</p>","parent_name":"SDLManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorNotConnected":{"name":"SDLEncryptionLifecycleManagerErrorNotConnected","abstract":"<p>Some action was attempted that requires a connection to the remote head unit.</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorEncryptionOff":{"name":"SDLEncryptionLifecycleManagerErrorEncryptionOff","abstract":"<p>Received ACK with encryption bit set to false from the remote head unit</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorNAK":{"name":"SDLEncryptionLifecycleManagerErrorNAK","abstract":"<p>Received NAK from the remote head unit.</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutList":{"name":"SDLChoiceSetLayoutList","abstract":"<p>Menu items will be displayed in a list</p>","parent_name":"SDLChoiceSetLayout"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutTiles":{"name":"SDLChoiceSetLayoutTiles","abstract":"<p>Menu items will be displayed as a tiled list</p>","parent_name":"SDLChoiceSetLayout"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatPNG":{"name":"SDLArtworkImageFormatPNG","abstract":"<p>Image format: PNG</p>","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatJPG":{"name":"SDLArtworkImageFormatJPG","abstract":"<p>Image format: JPG</p>","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html":{"name":"SDLArtworkImageFormat","abstract":"<p>Image format of an artwork file</p>"},"Enums/SDLChoiceSetLayout.html":{"name":"SDLChoiceSetLayout","abstract":"<p>The layout to use when a choice set is displayed</p>"},"Enums/SDLEncryptionLifecycleManagerError.html":{"name":"SDLEncryptionLifecycleManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLManagerError.html":{"name":"SDLManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLFileManagerError.html":{"name":"SDLFileManagerError","abstract":"<p>Errors associated with the SDLFileManager class.</p>"},"Enums/SDLTextAndGraphicManagerError.html":{"name":"SDLTextAndGraphicManagerError","abstract":"<p>Errors associated with the ScreenManager class</p>"},"Enums/SDLSoftButtonManagerError.html":{"name":"SDLSoftButtonManagerError","abstract":"<p>Errors associated with the Soft Button Manager class</p>"},"Enums/SDLSubscribeButtonManagerError.html":{"name":"SDLSubscribeButtonManagerError","abstract":"<p>Errors associated with the Subscribe Button Manager class</p>"},"Enums/SDLMenuManagerError.html":{"name":"SDLMenuManagerError","abstract":"<p>Errors associated with the ScreenManager class</p>"},"Enums/SDLChoiceSetManagerError.html":{"name":"SDLChoiceSetManagerError","abstract":"<p>Errors associated with Choice Set class</p>"},"Enums/SDLSystemCapabilityManagerError.html":{"name":"SDLSystemCapabilityManagerError","abstract":"<p>Errors associated with the system capability manager</p>"},"Enums/SDLTransportError.html":{"name":"SDLTransportError","abstract":"<p>Errors associated with transport.</p>"},"Enums/SDLRPCStoreError.html":{"name":"SDLRPCStoreError","abstract":"<p>Errors associated with store.</p>"},"Enums/SDLCacheFileManagerError.html":{"name":"SDLCacheFileManagerError","abstract":"<p>Errors related to the cache file manager</p>"},"Enums/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"<p>Errors related to the audio stream manager</p>"},"Enums/SDLSecondaryTransports.html":{"name":"SDLSecondaryTransports","abstract":"<p>List of secondary transports</p>"},"Enums/SDLLockScreenConfigurationDisplayMode.html":{"name":"SDLLockScreenConfigurationDisplayMode","abstract":"<p>Describes when the lock screen should be shown.</p>"},"Enums/SDLLogBytesDirection.html":{"name":"SDLLogBytesDirection","abstract":"<p>An enum describing log bytes direction</p>"},"Enums/SDLLogFlag.html":{"name":"SDLLogFlag","abstract":"<p>Flags used for SDLLogLevel to provide correct enum values. This is purely for internal use.</p>"},"Enums/SDLLogLevel.html":{"name":"SDLLogLevel","abstract":"<p>An enum describing a level of logging.</p>"},"Enums/SDLLogFormatType.html":{"name":"SDLLogFormatType","abstract":"<p>The output format of logs; how they will appear when printed out into a string.</p>"},"Enums/SDLDynamicMenuUpdatesMode.html":{"name":"SDLDynamicMenuUpdatesMode","abstract":"<p>Dynamic Menu Manager Mode</p>"},"Enums/MenuCellState.html":{"name":"MenuCellState","abstract":"<p>Menu cell state</p>"},"Enums/SDLPermissionGroupType.html":{"name":"SDLPermissionGroupType","abstract":"<p>A permission group type which will be used to tell the system what type of changes you want to be notified about for the group.</p>"},"Enums/SDLPermissionGroupStatus.html":{"name":"SDLPermissionGroupStatus","abstract":"<p>The status of the group of RPCs permissions.</p>"},"Enums/SDLPredefinedWindows.html":{"name":"SDLPredefinedWindows","abstract":"<p>Specifies which windows and IDs are predefined and pre-created on behalf of the app. The default window is always available and represents the app window on the main display. It&rsquo;s an equivalent to today&rsquo;s app window. For backward compatibility, this will ensure the app always has at least the default window on the main display. The app can choose to use this predefined enum element to specifically address app&rsquo;s main window or to duplicate window content. It is not possible to duplicate another window to the default window. The primary widget is a special widget, that can be associated with a service type, which is used by the HMI whenever a single widget needs to represent the whole app. The primary widget should be named as the app and can be pre-created by the HMI.</p>"},"Enums/SDLFrameType.html":{"name":"SDLFrameType","abstract":"<p>The data packet&rsquo;s header and payload combination.</p>"},"Enums/SDLServiceType.html":{"name":"SDLServiceType","abstract":"<p>The data packet&rsquo;s format and priority.</p>"},"Enums/SDLFrameInfo.html":{"name":"SDLFrameInfo","abstract":"<p>The data packet&rsquo;s available data.</p>"},"Enums/SDLRPCMessageType.html":{"name":"SDLRPCMessageType","abstract":"<p>The type of RPC message</p>"},"Enums/SDLCarWindowRenderingType.html":{"name":"SDLCarWindowRenderingType","abstract":"<p>The type of rendering that CarWindow will perform. Depending on your app, you may need to try different ones for best performance</p>"},"Enums/SDLStreamingEncryptionFlag.html":{"name":"SDLStreamingEncryptionFlag","abstract":"<p>A flag determining how video and audio streaming should be encrypted</p>"},"Enums/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"<p>Identifies finger touch</p>"},"Constants.html#/c:@SDLAmbientLightStatusNight":{"name":"SDLAmbientLightStatusNight","abstract":"<p>Represents a &ldquo;night&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight1":{"name":"SDLAmbientLightStatusTwilight1","abstract":"<p>Represents a &ldquo;twilight 1&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight2":{"name":"SDLAmbientLightStatusTwilight2","abstract":"<p>Represents a &ldquo;twilight 2&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight3":{"name":"SDLAmbientLightStatusTwilight3","abstract":"<p>Represents a &ldquo;twilight 3&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight4":{"name":"SDLAmbientLightStatusTwilight4","abstract":"<p>Represents a &ldquo;twilight 4&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusDay":{"name":"SDLAmbientLightStatusDay","abstract":"<p>Represents a &ldquo;day&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusUnknown":{"name":"SDLAmbientLightStatusUnknown","abstract":"<p>Represents an &ldquo;unknown&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusInvalid":{"name":"SDLAmbientLightStatusInvalid","abstract":"<p>Represents a &ldquo;invalid&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAppHMITypeDefault":{"name":"SDLAppHMITypeDefault","abstract":"<p>The App will have default rights.</p>"},"Constants.html#/c:@SDLAppHMITypeCommunication":{"name":"SDLAppHMITypeCommunication","abstract":"<p>Communication type of App</p>"},"Constants.html#/c:@SDLAppHMITypeMedia":{"name":"SDLAppHMITypeMedia","abstract":"<p>App dealing with Media</p>"},"Constants.html#/c:@SDLAppHMITypeMessaging":{"name":"SDLAppHMITypeMessaging","abstract":"<p>Messaging App</p>"},"Constants.html#/c:@SDLAppHMITypeNavigation":{"name":"SDLAppHMITypeNavigation","abstract":"<p>Navigation App</p>"},"Constants.html#/c:@SDLAppHMITypeInformation":{"name":"SDLAppHMITypeInformation","abstract":"<p>Information App</p>"},"Constants.html#/c:@SDLAppHMITypeSocial":{"name":"SDLAppHMITypeSocial","abstract":"<p>App dealing with social media</p>"},"Constants.html#/c:@SDLAppHMITypeProjection":{"name":"SDLAppHMITypeProjection","abstract":"<p>App dealing with Mobile Projection applications</p>"},"Constants.html#/c:@SDLAppHMITypeBackgroundProcess":{"name":"SDLAppHMITypeBackgroundProcess","abstract":"<p>App designed for use in the background</p>"},"Constants.html#/c:@SDLAppHMITypeTesting":{"name":"SDLAppHMITypeTesting","abstract":"<p>App only for Testing purposes</p>"},"Constants.html#/c:@SDLAppHMITypeSystem":{"name":"SDLAppHMITypeSystem","abstract":"<p>System App</p>"},"Constants.html#/c:@SDLAppHMITypeRemoteControl":{"name":"SDLAppHMITypeRemoteControl","abstract":"<p>Remote control</p>"},"Constants.html#/c:@SDLAppHMITypeWebView":{"name":"SDLAppHMITypeWebView","abstract":"<p>WebEngine Projection mode</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonIgnitionOff":{"name":"SDLAppInterfaceUnregisteredReasonIgnitionOff","abstract":"<p>Vehicle ignition turned off.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonBluetoothOff":{"name":"SDLAppInterfaceUnregisteredReasonBluetoothOff","abstract":"<p>Bluetooth was turned off, causing termination of a necessary Bluetooth connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUSBDisconnected":{"name":"SDLAppInterfaceUnregisteredReasonUSBDisconnected","abstract":"<p>USB was disconnected, causing termination of a necessary iAP connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel":{"name":"SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel","abstract":"<p>Application attempted SmartDeviceLink RPC request while HMILevel = NONE. App must have HMILevel other than NONE to issue RPC requests or get notifications or RPC responses.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonTooManyRequests":{"name":"SDLAppInterfaceUnregisteredReasonTooManyRequests","abstract":"<p>Either too many &ndash; or too many per unit of time &ndash; requests were made by the application.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonDriverDistractionViolation":{"name":"SDLAppInterfaceUnregisteredReasonDriverDistractionViolation","abstract":"<p>The application has issued requests which cause driver distraction rules to be violated.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonLanguageChange":{"name":"SDLAppInterfaceUnregisteredReasonLanguageChange","abstract":"<p>The user performed a language change on the SDL platform, causing the application to need to be reregistered for the new language.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonMasterReset":{"name":"SDLAppInterfaceUnregisteredReasonMasterReset","abstract":"<p>The user performed a MASTER RESET on the SDL platform, causing removal of a necessary Bluetooth pairing.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonFactoryDefaults":{"name":"SDLAppInterfaceUnregisteredReasonFactoryDefaults","abstract":"<p>The user restored settings to FACTORY DEFAULTS on the SDL platform.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonAppUnauthorized":{"name":"SDLAppInterfaceUnregisteredReasonAppUnauthorized","abstract":"<p>The app is not being authorized to be connected to SDL.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonProtocolViolation":{"name":"SDLAppInterfaceUnregisteredReasonProtocolViolation","abstract":"<p>The app could not register due to a protocol violation</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource":{"name":"SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource","abstract":"<p>The HMI resource is unsupported</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonResourceConstraint":{"name":"SDLAppInterfaceUnregisteredReasonResourceConstraint","abstract":"<p>The application is unregistered due to hardware resource constraints. The system will shortly close the application to free up hardware resources.</p>"},"Constants.html#/c:@SDLAppServiceTypeMedia":{"name":"SDLAppServiceTypeMedia","abstract":"<p>The app will have a service type of media.</p>"},"Constants.html#/c:@SDLAppServiceTypeWeather":{"name":"SDLAppServiceTypeWeather","abstract":"<p>The app will have a service type of weather.</p>"},"Constants.html#/c:@SDLAppServiceTypeNavigation":{"name":"SDLAppServiceTypeNavigation","abstract":"<p>The app will have a service type of navigation.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPlayPause":{"name":"SDLAudioStreamingIndicatorPlayPause","abstract":"<p>Default playback indicator."},"Constants.html#/c:@SDLAudioStreamingIndicatorPlay":{"name":"SDLAudioStreamingIndicatorPlay","abstract":"<p>Indicates that a button press of the Play/Pause button starts the audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPause":{"name":"SDLAudioStreamingIndicatorPause","abstract":"<p>Indicates that a button press of the Play/Pause button pauses the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorStop":{"name":"SDLAudioStreamingIndicatorStop","abstract":"<p>Indicates that a button press of the Play/Pause button stops the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAudible":{"name":"SDLAudioStreamingStateAudible","abstract":"<p>Currently streaming audio, if any, is audible to user.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAttenuated":{"name":"SDLAudioStreamingStateAttenuated","abstract":"<p>Some kind of audio mixing is taking place. Currently streaming audio, if any, is audible to the user at a lowered volume.</p>"},"Constants.html#/c:@SDLAudioStreamingStateNotAudible":{"name":"SDLAudioStreamingStateNotAudible","abstract":"<p>Currently streaming audio, if any, is not audible to user. made via VR session.</p>"},"Constants.html#/c:@SDLAudioTypePCM":{"name":"SDLAudioTypePCM","abstract":"<p>PCM raw audio</p>"},"Constants.html#/c:@SDLBitsPerSample8Bit":{"name":"SDLBitsPerSample8Bit","abstract":"<p>8 bits per sample</p>"},"Constants.html#/c:@SDLBitsPerSample16Bit":{"name":"SDLBitsPerSample16Bit","abstract":"<p>16 bits per sample</p>"},"Constants.html#/c:@SDLButtonEventModeButtonUp":{"name":"SDLButtonEventModeButtonUp","abstract":"<p>The button was released</p>"},"Constants.html#/c:@SDLButtonEventModeButtonDown":{"name":"SDLButtonEventModeButtonDown","abstract":"<p>The button was depressed</p>"},"Constants.html#/c:@SDLButtonNameOk":{"name":"SDLButtonNameOk","abstract":"<p>Represents the button usually labeled &ldquo;OK&rdquo;. A typical use of this button is for the user to press it to make a selection. Prior to SDL Core 5.0 (iOS Proxy v.6.1), Ok was used for both &ldquo;OK&rdquo; buttons <em>AND</em> PlayPause. In 5.0, PlayPause was introduced to reduce confusion, and you should use the one you intend for your use case (usually PlayPause). Until the next proxy breaking change, however, subscribing to this button name will continue to subscribe you to PlayPause so that your code does not break. That means that if you subscribe to both Ok and PlayPause, you will receive duplicate notifications.</p>"},"Constants.html#/c:@SDLButtonNamePlayPause":{"name":"SDLButtonNamePlayPause","abstract":"<p>Represents the play/pause button for media apps. Replaces &ldquo;OK&rdquo; on sub-5.0 head units, compliments it on 5.0 head units and later.</p>"},"Constants.html#/c:@SDLButtonNameSeekLeft":{"name":"SDLButtonNameSeekLeft","abstract":"<p>Represents the seek-left button. A typical use of this button is for the user to scroll to the left through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameSeekRight":{"name":"SDLButtonNameSeekRight","abstract":"<p>Represents the seek-right button. A typical use of this button is for the user to scroll to the right through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameTuneUp":{"name":"SDLButtonNameTuneUp","abstract":"<p>Represents a turn of the tuner knob in the clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNameTuneDown":{"name":"SDLButtonNameTuneDown","abstract":"<p>Represents a turn of the tuner knob in the counter-clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNamePreset0":{"name":"SDLButtonNamePreset0","abstract":"<p>Represents the preset 0 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset1":{"name":"SDLButtonNamePreset1","abstract":"<p>Represents the preset 1 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset2":{"name":"SDLButtonNamePreset2","abstract":"<p>Represents the preset 2 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset3":{"name":"SDLButtonNamePreset3","abstract":"<p>Represents the preset 3 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset4":{"name":"SDLButtonNamePreset4","abstract":"<p>Represents the preset 4 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset5":{"name":"SDLButtonNamePreset5","abstract":"<p>Represents the preset 5 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset6":{"name":"SDLButtonNamePreset6","abstract":"<p>Represents the preset 6 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset7":{"name":"SDLButtonNamePreset7","abstract":"<p>Represents the preset 7 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset8":{"name":"SDLButtonNamePreset8","abstract":"<p>Represents the preset 8 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset9":{"name":"SDLButtonNamePreset9","abstract":"<p>Represents the preset 9 button.</p>"},"Constants.html#/c:@SDLButtonNameCustomButton":{"name":"SDLButtonNameCustomButton","abstract":"<p>Represents the Custom button.</p>"},"Constants.html#/c:@SDLButtonNameSearch":{"name":"SDLButtonNameSearch","abstract":"<p>Represents the SEARCH button.</p>"},"Constants.html#/c:@SDLButtonNameACMax":{"name":"SDLButtonNameACMax","abstract":"<p>Represents AC max button *</p>"},"Constants.html#/c:@SDLButtonNameAC":{"name":"SDLButtonNameAC","abstract":"<p>Represents AC button *</p>"},"Constants.html#/c:@SDLButtonNameRecirculate":{"name":"SDLButtonNameRecirculate","abstract":"<p>Represents a Recirculate button</p>"},"Constants.html#/c:@SDLButtonNameFanUp":{"name":"SDLButtonNameFanUp","abstract":"<p>Represents a Fan up button</p>"},"Constants.html#/c:@SDLButtonNameFanDown":{"name":"SDLButtonNameFanDown","abstract":"<p>Represents a fan down button</p>"},"Constants.html#/c:@SDLButtonNameTempUp":{"name":"SDLButtonNameTempUp","abstract":"<p>Represents a temperature up button</p>"},"Constants.html#/c:@SDLButtonNameTempDown":{"name":"SDLButtonNameTempDown","abstract":"<p>Represents a temperature down button</p>"},"Constants.html#/c:@SDLButtonNameDefrostMax":{"name":"SDLButtonNameDefrostMax","abstract":"<p>Represents a Defrost max button.</p>"},"Constants.html#/c:@SDLButtonNameDefrost":{"name":"SDLButtonNameDefrost","abstract":"<p>Represents a Defrost button.</p>"},"Constants.html#/c:@SDLButtonNameDefrostRear":{"name":"SDLButtonNameDefrostRear","abstract":"<p>Represents a Defrost rear button.</p>"},"Constants.html#/c:@SDLButtonNameUpperVent":{"name":"SDLButtonNameUpperVent","abstract":"<p>Represents a Upper Vent button.</p>"},"Constants.html#/c:@SDLButtonNameLowerVent":{"name":"SDLButtonNameLowerVent","abstract":"<p>Represents a Lower vent button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeUp":{"name":"SDLButtonNameVolumeUp","abstract":"<p>Represents a volume up button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeDown":{"name":"SDLButtonNameVolumeDown","abstract":"<p>Represents a volume down button.</p>"},"Constants.html#/c:@SDLButtonNameEject":{"name":"SDLButtonNameEject","abstract":"<p>Represents a Eject Button.</p>"},"Constants.html#/c:@SDLButtonNameSource":{"name":"SDLButtonNameSource","abstract":"<p>Represents a Source button.</p>"},"Constants.html#/c:@SDLButtonNameShuffle":{"name":"SDLButtonNameShuffle","abstract":"<p>Represents a SHUFFLE button.</p>"},"Constants.html#/c:@SDLButtonNameRepeat":{"name":"SDLButtonNameRepeat","abstract":"<p>Represents a Repeat button.</p>"},"Constants.html#/c:@SDLButtonNameNavCenterLocation":{"name":"SDLButtonNameNavCenterLocation","abstract":"<p>Represents a Navigate to center button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomIn":{"name":"SDLButtonNameNavZoomIn","abstract":"<p>Represents a Zoom in button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomOut":{"name":"SDLButtonNameNavZoomOut","abstract":"<p>Represents a Zoom out button.</p>"},"Constants.html#/c:@SDLButtonNameNavPanUp":{"name":"SDLButtonNameNavPanUp","abstract":"<p>Represents a Pan up button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpRight":{"name":"SDLButtonNameNavPanUpRight","abstract":"<p>Represents a Pan up/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanRight":{"name":"SDLButtonNameNavPanRight","abstract":"<p>Represents a Pan right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownRight":{"name":"SDLButtonNameNavPanDownRight","abstract":"<p>Represents a Pan down/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDown":{"name":"SDLButtonNameNavPanDown","abstract":"<p>Represents a Pan down button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownLeft":{"name":"SDLButtonNameNavPanDownLeft","abstract":"<p>Represents a Pan down left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanLeft":{"name":"SDLButtonNameNavPanLeft","abstract":"<p>Represents a Pan left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpLeft":{"name":"SDLButtonNameNavPanUpLeft","abstract":"<p>Represents a Pan up left button</p>"},"Constants.html#/c:@SDLButtonNameNavTiltToggle":{"name":"SDLButtonNameNavTiltToggle","abstract":"<p>Represents a Tilt button. If supported, this toggles between a top-down view and an angled/3D view. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonNameNavRotateClockwise":{"name":"SDLButtonNameNavRotateClockwise","abstract":"<p>Represents a Rotate clockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavRotateCounterClockwise":{"name":"SDLButtonNameNavRotateCounterClockwise","abstract":"<p>Represents a Rotate counterclockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavHeadingToggle":{"name":"SDLButtonNameNavHeadingToggle","abstract":"<p>Represents a Heading toggle button. If supported, this toggles between locking the orientation to north or to the vehicle&rsquo;s heading. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonPressModeLong":{"name":"SDLButtonPressModeLong","abstract":"<p>A button was released, after it was pressed for a long time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLButtonPressModeShort":{"name":"SDLButtonPressModeShort","abstract":"<p>A button was released, after it was pressed for a short time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLCapacityUnitKilograms":{"name":"SDLCapacityUnitKilograms","abstract":"<p>A capacity in kilogram units</p>"},"Constants.html#/c:@SDLCapacityUnitKilowatthours":{"name":"SDLCapacityUnitKilowatthours","abstract":"<p>A capacity in Kilowatt Hour units</p>"},"Constants.html#/c:@SDLCapacityUnitLiters":{"name":"SDLCapacityUnitLiters","abstract":"<p>A capacity in Liter units</p>"},"Constants.html#/c:@SDLCarModeStatusNormal":{"name":"SDLCarModeStatusNormal","abstract":"<p>Provides carmode NORMAL to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusFactory":{"name":"SDLCarModeStatusFactory","abstract":"<p>Provides carmode FACTORY to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusTransport":{"name":"SDLCarModeStatusTransport","abstract":"<p>Provides carmode TRANSPORT to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusCrash":{"name":"SDLCarModeStatusCrash","abstract":"<p>Provides carmode CRASH to each module.</p>"},"Constants.html#/c:@SDLCharacterSetType2":{"name":"SDLCharacterSetType2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetAscii":{"name":"SDLCharacterSetAscii","abstract":"<p>ASCII as defined in <a href=\"https://en.wikipedia.org/wiki/ASCII\">https://en.wikipedia.org/wiki/ASCII</a> as defined in codes 0-127. Non-printable characters such as tabs and back spaces are ignored.</p>"},"Constants.html#/c:@SDLCharacterSetIso88591":{"name":"SDLCharacterSetIso88591","abstract":"<p>Latin-1, as defined in <a href=\"https://en.wikipedia.org/wiki/ISO/IEC_8859-1\">https://en.wikipedia.org/wiki/ISO/IEC_8859-1</a></p>"},"Constants.html#/c:@SDLCharacterSetUtf8":{"name":"SDLCharacterSetUtf8","abstract":"<p>The UTF-8 character set that uses variable bytes per code point. See <a href=\"https://en.wikipedia.org/wiki/UTF-8\">https://en.wikipedia.org/wiki/UTF-8</a> for more details. This is the preferred character set.</p>"},"Constants.html#/c:@SDLCompassDirectionNorth":{"name":"SDLCompassDirectionNorth","abstract":"<p>Direction North</p>"},"Constants.html#/c:@SDLCompassDirectionNorthwest":{"name":"SDLCompassDirectionNorthwest","abstract":"<p>Direction Northwest</p>"},"Constants.html#/c:@SDLCompassDirectionWest":{"name":"SDLCompassDirectionWest","abstract":"<p>Direction West</p>"},"Constants.html#/c:@SDLCompassDirectionSouthwest":{"name":"SDLCompassDirectionSouthwest","abstract":"<p>Direction Southwest</p>"},"Constants.html#/c:@SDLCompassDirectionSouth":{"name":"SDLCompassDirectionSouth","abstract":"<p>Direction South</p>"},"Constants.html#/c:@SDLCompassDirectionSoutheast":{"name":"SDLCompassDirectionSoutheast","abstract":"<p>Direction Southeast</p>"},"Constants.html#/c:@SDLCompassDirectionEast":{"name":"SDLCompassDirectionEast","abstract":"<p>Direction East</p>"},"Constants.html#/c:@SDLCompassDirectionNortheast":{"name":"SDLCompassDirectionNortheast","abstract":"<p>Direction Northeast</p>"},"Constants.html#/c:@SDLComponentVolumeStatusUnknown":{"name":"SDLComponentVolumeStatusUnknown","abstract":"<p>Unknown SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNormal":{"name":"SDLComponentVolumeStatusNormal","abstract":"<p>Normal SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusLow":{"name":"SDLComponentVolumeStatusLow","abstract":"<p>Low SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusFault":{"name":"SDLComponentVolumeStatusFault","abstract":"<p>Fault SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusAlert":{"name":"SDLComponentVolumeStatusAlert","abstract":"<p>Alert SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNotSupported":{"name":"SDLComponentVolumeStatusNotSupported","abstract":"<p>Not supported SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLDefrostZoneFront":{"name":"SDLDefrostZoneFront","abstract":"<p>A SDLDefrostZone with the value of <em>FRONT</em></p>"},"Constants.html#/c:@SDLDefrostZoneRear":{"name":"SDLDefrostZoneRear","abstract":"<p>A SDLDefrostZone with the value of <em>REAR</em></p>"},"Constants.html#/c:@SDLDefrostZoneAll":{"name":"SDLDefrostZoneAll","abstract":"<p>A SDLDefrostZone with the value of <em>All</em></p>"},"Constants.html#/c:@SDLDefrostZoneNone":{"name":"SDLDefrostZoneNone","abstract":"<p>A SDLDefrostZone with the value of <em>None</em></p>"},"Constants.html#/c:@SDLDeliveryModePrompt":{"name":"SDLDeliveryModePrompt","abstract":"<p>User is prompted on HMI</p>"},"Constants.html#/c:@SDLDeliveryModeDestination":{"name":"SDLDeliveryModeDestination","abstract":"<p>Set the location as destination without prompting the user</p>"},"Constants.html#/c:@SDLDeliveryModeQueue":{"name":"SDLDeliveryModeQueue","abstract":"<p>Adds the current location to navigation queue</p>"},"Constants.html#/c:@SDLDeviceLevelStatusZeroBars":{"name":"SDLDeviceLevelStatusZeroBars","abstract":"<p>Device battery level is zero bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusOneBar":{"name":"SDLDeviceLevelStatusOneBar","abstract":"<p>Device battery level is one bar</p>"},"Constants.html#/c:@SDLDeviceLevelStatusTwoBars":{"name":"SDLDeviceLevelStatusTwoBars","abstract":"<p>Device battery level is two bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusThreeBars":{"name":"SDLDeviceLevelStatusThreeBars","abstract":"<p>Device battery level is three bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusFourBars":{"name":"SDLDeviceLevelStatusFourBars","abstract":"<p>Device battery level is four bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusNotProvided":{"name":"SDLDeviceLevelStatusNotProvided","abstract":"<p>Device battery level is unknown</p>"},"Constants.html#/c:@SDLDimensionNoFix":{"name":"SDLDimensionNoFix","abstract":"<p>No GPS at all</p>"},"Constants.html#/c:@SDLDimension2D":{"name":"SDLDimension2D","abstract":"<p>Longitude and latitude of the GPS</p>"},"Constants.html#/c:@SDLDimension3D":{"name":"SDLDimension3D","abstract":"<p>Longitude and latitude and altitude of the GPS</p>"},"Constants.html#/c:@SDLDirectionLeft":{"name":"SDLDirectionLeft","abstract":"<p>Direction left</p>"},"Constants.html#/c:@SDLDirectionRight":{"name":"SDLDirectionRight","abstract":"<p>Direction right</p>"},"Constants.html#/c:@SDLDisplayModeDay":{"name":"SDLDisplayModeDay","abstract":"<p>@abstract Display Mode : DAY</p>"},"Constants.html#/c:@SDLDisplayModeNight":{"name":"SDLDisplayModeNight","abstract":"<p>@abstract Display Mode : NIGHT.</p>"},"Constants.html#/c:@SDLDisplayModeAuto":{"name":"SDLDisplayModeAuto","abstract":"<p>@abstract Display Mode : AUTO.</p>"},"Constants.html#/c:@SDLDisplayTypeCID":{"name":"SDLDisplayTypeCID","abstract":"<p>This display type provides a 2-line x 20 character &ldquo;dot matrix&rdquo; display.</p>"},"Constants.html#/c:@SDLDisplayTypeType2":{"name":"SDLDisplayTypeType2","abstract":"<p>Display type 2</p>"},"Constants.html#/c:@SDLDisplayTypeType5":{"name":"SDLDisplayTypeType5","abstract":"<p>Display type 5</p>"},"Constants.html#/c:@SDLDisplayTypeNGN":{"name":"SDLDisplayTypeNGN","abstract":"<p>This display type provides an 8 inch touchscreen display.</p>"},"Constants.html#/c:@SDLDisplayTypeGen28DMA":{"name":"SDLDisplayTypeGen28DMA","abstract":"<p>Display type Gen 28 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeGen26DMA":{"name":"SDLDisplayTypeGen26DMA","abstract":"<p>Display type Gen 26 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeMFD3":{"name":"SDLDisplayTypeMFD3","abstract":"<p>Display type MFD3</p>"},"Constants.html#/c:@SDLDisplayTypeMFD4":{"name":"SDLDisplayTypeMFD4","abstract":"<p>Display type MFD4</p>"},"Constants.html#/c:@SDLDisplayTypeMFD5":{"name":"SDLDisplayTypeMFD5","abstract":"<p>Display type MFD5</p>"},"Constants.html#/c:@SDLDisplayTypeGen38Inch":{"name":"SDLDisplayTypeGen38Inch","abstract":"<p>Display type Gen 3 8-inch</p>"},"Constants.html#/c:@SDLDisplayTypeGeneric":{"name":"SDLDisplayTypeGeneric","abstract":"<p>Display type Generic</p>"},"Constants.html#/c:@SDLDistanceUnitMiles":{"name":"SDLDistanceUnitMiles","abstract":"<p>@abstract SDLDistanceUnit: <em>MILES</em></p>"},"Constants.html#/c:@SDLDistanceUnitKilometers":{"name":"SDLDistanceUnitKilometers","abstract":"<p>@abstract SDLDistanceUnit: <em>KILOMETERS</em></p>"},"Constants.html#/c:@SDLDriverDistractionStateOn":{"name":"SDLDriverDistractionStateOn","abstract":"<p>Driver distraction rules are in effect.</p>"},"Constants.html#/c:@SDLDriverDistractionStateOff":{"name":"SDLDriverDistractionStateOff","abstract":"<p>Driver distraction rules are NOT in effect.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusNormal":{"name":"SDLECallConfirmationStatusNormal","abstract":"<p>No E-Call signal triggered.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusInProgress":{"name":"SDLECallConfirmationStatusInProgress","abstract":"<p>An E-Call is being in progress.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCancelled":{"name":"SDLECallConfirmationStatusCancelled","abstract":"<p>An E-Call was cancelled by the user.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCompleted":{"name":"SDLECallConfirmationStatusCompleted","abstract":"<p>The E-Call sequence is completed.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusUnsuccessful":{"name":"SDLECallConfirmationStatusUnsuccessful","abstract":"<p>An E-Call could not be connected.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusConfiguredOff":{"name":"SDLECallConfirmationStatusConfiguredOff","abstract":"<p>E-Call is not configured on this vehicle.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCompleteDTMFTimeout":{"name":"SDLECallConfirmationStatusCompleteDTMFTimeout","abstract":"<p>E-Call is considered to be complete without Emergency Operator contact.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusClosed":{"name":"SDLElectronicParkBrakeStatusClosed","abstract":"<p>Parking brake actuators have been fully applied.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusTransition":{"name":"SDLElectronicParkBrakeStatusTransition","abstract":"<p>Parking brake actuators are transitioning to either Apply/Closed or Release/Open state.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusOpen":{"name":"SDLElectronicParkBrakeStatusOpen","abstract":"<p>Parking brake actuators are released.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusDriveActive":{"name":"SDLElectronicParkBrakeStatusDriveActive","abstract":"<p>When driver pulls the Electronic Parking Brake switch while driving &ldquo;at speed&rdquo;.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusFault":{"name":"SDLElectronicParkBrakeStatusFault","abstract":"<p>When system has a fault or is under maintenance.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeNoEvent":{"name":"SDLEmergencyEventTypeNoEvent","abstract":"<p>No emergency event has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeFrontal":{"name":"SDLEmergencyEventTypeFrontal","abstract":"<p>Frontal collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeSide":{"name":"SDLEmergencyEventTypeSide","abstract":"<p>Side collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeRear":{"name":"SDLEmergencyEventTypeRear","abstract":"<p>Rear collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeRollover":{"name":"SDLEmergencyEventTypeRollover","abstract":"<p>A rollover event has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeNotSupported":{"name":"SDLEmergencyEventTypeNotSupported","abstract":"<p>The signal is not supported</p>"},"Constants.html#/c:@SDLEmergencyEventTypeFault":{"name":"SDLEmergencyEventTypeFault","abstract":"<p>Emergency status cannot be determined</p>"},"Constants.html#/c:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"<p>An error in the SDLAudioStreamManager</p>"},"Constants.html#/c:@SDLErrorDomainCacheFileManager":{"name":"SDLErrorDomainCacheFileManager","abstract":"<p>An error in the SDLCacheFileManager private class</p>"},"Constants.html#/c:@SDLErrorDomainChoiceSetManager":{"name":"SDLErrorDomainChoiceSetManager","abstract":"<p>An error in the SDLChoiceSetManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainEncryptionLifecycleManager":{"name":"SDLErrorDomainEncryptionLifecycleManager","abstract":"<p>An error in the SDLEncryptionLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainFileManager":{"name":"SDLErrorDomainFileManager","abstract":"<p>An error in the SDLFileManager</p>"},"Constants.html#/c:@SDLErrorDomainLifecycleManager":{"name":"SDLErrorDomainLifecycleManager","abstract":"<p>An error in the SDLLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainMenuManager":{"name":"SDLErrorDomainMenuManager","abstract":"<p>An error in the SDLMenuManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainRPCStore":{"name":"SDLErrorDomainRPCStore","abstract":"<p>An error in an SDL RPC class</p>"},"Constants.html#/c:@SDLErrorDomainSoftButtonManager":{"name":"SDLErrorDomainSoftButtonManager","abstract":"<p>An error in the SDLSoftButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSubscribeButtonManager":{"name":"SDLErrorDomainSubscribeButtonManager","abstract":"<p>An error in the SDLSubscribeButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSystemCapabilityManager":{"name":"SDLErrorDomainSystemCapabilityManager","abstract":"<p>An error in the SDLSystemCapabilityManager</p>"},"Constants.html#/c:@SDLErrorDomainTextAndGraphicManager":{"name":"SDLErrorDomainTextAndGraphicManager","abstract":"<p>An error in the SDLTextAndGraphicManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainTransport":{"name":"SDLErrorDomainTransport","abstract":"<p>An error in a SDL transport private class</p>"},"Constants.html#/c:@SDLFileTypeBMP":{"name":"SDLFileTypeBMP","abstract":"<p>file type: Bitmap (BMP)</p>"},"Constants.html#/c:@SDLFileTypeJPEG":{"name":"SDLFileTypeJPEG","abstract":"<p>file type: JPEG</p>"},"Constants.html#/c:@SDLFileTypePNG":{"name":"SDLFileTypePNG","abstract":"<p>file type: PNG</p>"},"Constants.html#/c:@SDLFileTypeWAV":{"name":"SDLFileTypeWAV","abstract":"<p>file type: WAVE (WAV)</p>"},"Constants.html#/c:@SDLFileTypeMP3":{"name":"SDLFileTypeMP3","abstract":"<p>file type: MP3</p>"},"Constants.html#/c:@SDLFileTypeAAC":{"name":"SDLFileTypeAAC","abstract":"<p>file type: AAC</p>"},"Constants.html#/c:@SDLFileTypeBinary":{"name":"SDLFileTypeBinary","abstract":"<p>file type: BINARY</p>"},"Constants.html#/c:@SDLFileTypeJSON":{"name":"SDLFileTypeJSON","abstract":"<p>file type: JSON</p>"},"Constants.html#/c:@SDLFuelCutoffStatusTerminateFuel":{"name":"SDLFuelCutoffStatusTerminateFuel","abstract":"<p>Fuel is cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusNormalOperation":{"name":"SDLFuelCutoffStatusNormalOperation","abstract":"<p>Fuel is not cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusFault":{"name":"SDLFuelCutoffStatusFault","abstract":"<p>Status of the fuel pump cannot be determined</p>"},"Constants.html#/c:@SDLFuelTypeGasoline":{"name":"SDLFuelTypeGasoline","abstract":"<p>Fuel type: Gasoline</p>"},"Constants.html#/c:@SDLFuelTypeDiesel":{"name":"SDLFuelTypeDiesel","abstract":"<p>Fuel type: Diesel</p>"},"Constants.html#/c:@SDLFuelTypeCNG":{"name":"SDLFuelTypeCNG","abstract":"<p>Fuel type: CNG</p>"},"Constants.html#/c:@SDLFuelTypeLPG":{"name":"SDLFuelTypeLPG","abstract":"<p>Fuel type: LPG</p>"},"Constants.html#/c:@SDLFuelTypeHydrogen":{"name":"SDLFuelTypeHydrogen","abstract":"<p>Fuel type: Hydrogen</p>"},"Constants.html#/c:@SDLFuelTypeBattery":{"name":"SDLFuelTypeBattery","abstract":"<p>Fuel type: Battery</p>"},"Constants.html#/c:@SDLGlobalPropertyHelpPrompt":{"name":"SDLGlobalPropertyHelpPrompt","abstract":"<p>The help prompt to be spoken if the user needs assistance during a user-initiated interaction.</p>"},"Constants.html#/c:@SDLGlobalPropertyTimeoutPrompt":{"name":"SDLGlobalPropertyTimeoutPrompt","abstract":"<p>The prompt to be spoken if the user-initiated interaction times out waiting for the user&rsquo;s verbal input.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpTitle":{"name":"SDLGlobalPropertyVoiceRecognitionHelpTitle","abstract":"<p>The title of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpItems":{"name":"SDLGlobalPropertyVoiceRecognitionHelpItems","abstract":"<p>Items of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuName":{"name":"SDLGlobalPropertyMenuName","abstract":"<p>The name of the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuIcon":{"name":"SDLGlobalPropertyMenuIcon","abstract":"<p>An icon on the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyKeyboard":{"name":"SDLGlobalPropertyKeyboard","abstract":"<p>Property related to the keyboard</p>"},"Constants.html#/c:@SDLGlobalPropertyUserLocation":{"name":"SDLGlobalPropertyUserLocation","abstract":"<p>Location of the user&rsquo;s seat of setGlobalProperties</p>"},"Constants.html#/c:@SDLHMILevelFull":{"name":"SDLHMILevelFull","abstract":"<p>The application has full use of the SDL HMI. The app may output via TTS, display, or streaming audio and may gather input via VR, Menu, and button presses</p>"},"Constants.html#/c:@SDLHMILevelLimited":{"name":"SDLHMILevelLimited","abstract":"<p>This HMI Level is only defined for a media application using an HMI with an 8 inch touchscreen (Nav) system. The application&rsquo;s Show text is displayed and it receives button presses from media-oriented buttons (SEEKRIGHT, SEEKLEFT, TUNEUP, TUNEDOWN, PRESET_0-9)</p>"},"Constants.html#/c:@SDLHMILevelBackground":{"name":"SDLHMILevelBackground","abstract":"<p>App cannot interact with user via TTS, VR, Display or Button Presses. App can perform the following operations:</p>"},"Constants.html#/c:@SDLHMILevelNone":{"name":"SDLHMILevelNone","abstract":"<p>Application has been discovered by SDL, but it cannot send any requests or receive any notifications</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesFront":{"name":"SDLHMIZoneCapabilitiesFront","abstract":"<p>Indicates HMI available for front seat passengers.</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesBack":{"name":"SDLHMIZoneCapabilitiesBack","abstract":"<p>Indicates HMI available for rear seat passengers.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceMobile":{"name":"SDLHybridAppPreferenceMobile","abstract":"<p>App preference of mobile.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceCloud":{"name":"SDLHybridAppPreferenceCloud","abstract":"<p>App preference of cloud.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceBoth":{"name":"SDLHybridAppPreferenceBoth","abstract":"<p>App preference of both. Allows both the mobile and the cloud versions of the app to attempt to connect at the same time, however the first app that is registered is the one that is allowed to stay registered.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusNotStable":{"name":"SDLIgnitionStableStatusNotStable","abstract":"<p>The current ignition switch status is considered not to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusStable":{"name":"SDLIgnitionStableStatusStable","abstract":"<p>The current ignition switch status is considered to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusMissingFromTransmitter":{"name":"SDLIgnitionStableStatusMissingFromTransmitter","abstract":"<p>The current ignition switch status is considered to be missing from the transmitter</p>"},"Constants.html#/c:@SDLIgnitionStatusUnknown":{"name":"SDLIgnitionStatusUnknown","abstract":"<p>Ignition status currently unknown</p>"},"Constants.html#/c:@SDLIgnitionStatusOff":{"name":"SDLIgnitionStatusOff","abstract":"<p>Ignition is off</p>"},"Constants.html#/c:@SDLIgnitionStatusAccessory":{"name":"SDLIgnitionStatusAccessory","abstract":"<p>Ignition is in mode accessory</p>"},"Constants.html#/c:@SDLIgnitionStatusRun":{"name":"SDLIgnitionStatusRun","abstract":"<p>Ignition is in mode run</p>"},"Constants.html#/c:@SDLIgnitionStatusStart":{"name":"SDLIgnitionStatusStart","abstract":"<p>Ignition is in mode start</p>"},"Constants.html#/c:@SDLIgnitionStatusInvalid":{"name":"SDLIgnitionStatusInvalid","abstract":"<p>Signal is invalid</p>"},"Constants.html#/c:@SDLImageFieldNameAlertIcon":{"name":"SDLImageFieldNameAlertIcon","abstract":"<p>The image field for Alert</p>"},"Constants.html#/c:@SDLImageFieldNameSoftButtonImage":{"name":"SDLImageFieldNameSoftButtonImage","abstract":"<p>The image field for SoftButton</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceImage":{"name":"SDLImageFieldNameChoiceImage","abstract":"<p>The first image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceSecondaryImage":{"name":"SDLImageFieldNameChoiceSecondaryImage","abstract":"<p>The scondary image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameVoiceRecognitionHelpItem":{"name":"SDLImageFieldNameVoiceRecognitionHelpItem","abstract":"<p>The image field for vrHelpItem.</p>"},"Constants.html#/c:@SDLImageFieldNameTurnIcon":{"name":"SDLImageFieldNameTurnIcon","abstract":"<p>The image field for Turn.</p>"},"Constants.html#/c:@SDLImageFieldNameMenuIcon":{"name":"SDLImageFieldNameMenuIcon","abstract":"<p>The image field for the menu icon in SetGlobalProperties.</p>"},"Constants.html#/c:@SDLImageFieldNameCommandIcon":{"name":"SDLImageFieldNameCommandIcon","abstract":"<p>The image field for AddCommand."},"Constants.html#/c:@SDLImageFieldNameAppIcon":{"name":"SDLImageFieldNameAppIcon","abstract":"<p>The image field for the app icon (set by setAppIcon).</p>"},"Constants.html#/c:@SDLImageFieldNameGraphic":{"name":"SDLImageFieldNameGraphic","abstract":"<p>The primary image field for Show."},"Constants.html#/c:@SDLImageFieldNameSecondaryGraphic":{"name":"SDLImageFieldNameSecondaryGraphic","abstract":"<p>The secondary image field for Show."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTIcon":{"name":"SDLImageFieldNameShowConstantTBTIcon","abstract":"<p>The primary image field for ShowConstant TBT."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTNextTurnIcon":{"name":"SDLImageFieldNameShowConstantTBTNextTurnIcon","abstract":"<p>The secondary image field for ShowConstant TBT.</p>"},"Constants.html#/c:@SDLImageFieldNameLocationImage":{"name":"SDLImageFieldNameLocationImage","abstract":"<p>The optional image of a destination / location</p>"},"Constants.html#/c:@SDLImageFieldNameSubMenuIcon":{"name":"SDLImageFieldNameSubMenuIcon","abstract":"<p>The image field for AddSubMenu.menuIcon</p>"},"Constants.html#/c:@SDLImageFieldNameSubtleAlertIcon":{"name":"SDLImageFieldNameSubtleAlertIcon","abstract":"<p>The image of the subtle alert; applies to <code>SubtleAlert</code> <code>alertImage</code></p>"},"Constants.html#/c:@SDLImageTypeStatic":{"name":"SDLImageTypeStatic","abstract":"<p>Activate an icon that shipped with the IVI system by passing a hex value.</p>"},"Constants.html#/c:@SDLImageTypeDynamic":{"name":"SDLImageTypeDynamic","abstract":"<p>An icon referencing an image uploaded by the app (identifier to be sent by SDLPutFile)</p>"},"Constants.html#/c:@SDLInteractionModeManualOnly":{"name":"SDLInteractionModeManualOnly","abstract":"<p>Interaction Mode : Manual Only</p>"},"Constants.html#/c:@SDLInteractionModeVoiceRecognitionOnly":{"name":"SDLInteractionModeVoiceRecognitionOnly","abstract":"<p>Interaction Mode : VR Only</p>"},"Constants.html#/c:@SDLInteractionModeBoth":{"name":"SDLInteractionModeBoth","abstract":"<p>Interaction Mode : Manual &amp; VR</p>"},"Constants.html#/c:@SDLKeyboardEventKeypress":{"name":"SDLKeyboardEventKeypress","abstract":"<p>The use has pressed the keyboard key (applies to both SINGLE_KEYPRESS and RESEND_CURRENT_ENTRY modes).</p>"},"Constants.html#/c:@SDLKeyboardEventSubmitted":{"name":"SDLKeyboardEventSubmitted","abstract":"<p>The User has finished entering text from the keyboard and submitted the entry.</p>"},"Constants.html#/c:@SDLKeyboardEventCancelled":{"name":"SDLKeyboardEventCancelled","abstract":"<p>The User has pressed the HMI-defined &ldquo;Cancel&rdquo; button.</p>"},"Constants.html#/c:@SDLKeyboardEventAborted":{"name":"SDLKeyboardEventAborted","abstract":"<p>The User has not finished entering text and the keyboard is aborted with the event of higher priority.</p>"},"Constants.html#/c:@SDLKeyboardEventVoice":{"name":"SDLKeyboardEventVoice","abstract":"<p>The user used voice as input for the keyboard</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTY":{"name":"SDLKeyboardLayoutQWERTY","abstract":"<p>QWERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTZ":{"name":"SDLKeyboardLayoutQWERTZ","abstract":"<p>QWERTZ layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutAZERTY":{"name":"SDLKeyboardLayoutAZERTY","abstract":"<p>AZERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeypressModeSingleKeypress":{"name":"SDLKeypressModeSingleKeypress","abstract":"<p>SINGLE_KEYPRESS:<br>Each and every User`s keypress must be reported (new notification for every newly entered single symbol).</p>"},"Constants.html#/c:@SDLKeypressModeQueueKeypresses":{"name":"SDLKeypressModeQueueKeypresses","abstract":"<p>QUEUE_KEYPRESSES:<br>The whole entry is reported only after the User submits it (by ‘Search’ button click displayed on touchscreen keyboard)</p>"},"Constants.html#/c:@SDLKeypressModeResendCurrentEntry":{"name":"SDLKeypressModeResendCurrentEntry","abstract":"<p>RESEND_CURRENT_ENTRY:<br>The whole entry must be reported each and every time the User makes a new keypress<br> (new notification with all previously entered symbols and a newly entered one appended).</p>"},"Constants.html#/c:@SDLLanguageEnSa":{"name":"SDLLanguageEnSa","abstract":"<p>English_SA</p>"},"Constants.html#/c:@SDLLanguageHeIl":{"name":"SDLLanguageHeIl","abstract":"<p>Hebrew_IL</p>"},"Constants.html#/c:@SDLLanguageRoRo":{"name":"SDLLanguageRoRo","abstract":"<p>Romainian_RO</p>"},"Constants.html#/c:@SDLLanguageUkUa":{"name":"SDLLanguageUkUa","abstract":"<p>Ukrainian_UA</p>"},"Constants.html#/c:@SDLLanguageIdId":{"name":"SDLLanguageIdId","abstract":"<p>Indonesian_ID</p>"},"Constants.html#/c:@SDLLanguageViVn":{"name":"SDLLanguageViVn","abstract":"<p>Vietnamese_VN</p>"},"Constants.html#/c:@SDLLanguageMsMy":{"name":"SDLLanguageMsMy","abstract":"<p>Malay_MY</p>"},"Constants.html#/c:@SDLLanguageHiIn":{"name":"SDLLanguageHiIn","abstract":"<p>Hindi_IN</p>"},"Constants.html#/c:@SDLLanguageNlBe":{"name":"SDLLanguageNlBe","abstract":"<p>Dutch(Flemish)_BE</p>"},"Constants.html#/c:@SDLLanguageElGr":{"name":"SDLLanguageElGr","abstract":"<p>Greek_GR</p>"},"Constants.html#/c:@SDLLanguageHuHu":{"name":"SDLLanguageHuHu","abstract":"<p>Hungarian_HU</p>"},"Constants.html#/c:@SDLLanguageFiFi":{"name":"SDLLanguageFiFi","abstract":"<p>Finnish_FI</p>"},"Constants.html#/c:@SDLLanguageSkSk":{"name":"SDLLanguageSkSk","abstract":"<p>Slovak_SK</p>"},"Constants.html#/c:@SDLLanguageEnUs":{"name":"SDLLanguageEnUs","abstract":"<p>English_US</p>"},"Constants.html#/c:@SDLLanguageEnIn":{"name":"SDLLanguageEnIn","abstract":"<p>English - India</p>"},"Constants.html#/c:@SDLLanguageThTh":{"name":"SDLLanguageThTh","abstract":"<p>Thai - Thailand</p>"},"Constants.html#/c:@SDLLanguageEsMx":{"name":"SDLLanguageEsMx","abstract":"<p>Spanish - Mexico</p>"},"Constants.html#/c:@SDLLanguageFrCa":{"name":"SDLLanguageFrCa","abstract":"<p>French - Canada</p>"},"Constants.html#/c:@SDLLanguageDeDe":{"name":"SDLLanguageDeDe","abstract":"<p>German - Germany</p>"},"Constants.html#/c:@SDLLanguageEsEs":{"name":"SDLLanguageEsEs","abstract":"<p>Spanish - Spain</p>"},"Constants.html#/c:@SDLLanguageEnGb":{"name":"SDLLanguageEnGb","abstract":"<p>English - Great Britain</p>"},"Constants.html#/c:@SDLLanguageRuRu":{"name":"SDLLanguageRuRu","abstract":"<p>Russian - Russia</p>"},"Constants.html#/c:@SDLLanguageTrTr":{"name":"SDLLanguageTrTr","abstract":"<p>Turkish - Turkey</p>"},"Constants.html#/c:@SDLLanguagePlPl":{"name":"SDLLanguagePlPl","abstract":"<p>Polish - Poland</p>"},"Constants.html#/c:@SDLLanguageFrFr":{"name":"SDLLanguageFrFr","abstract":"<p>French - France</p>"},"Constants.html#/c:@SDLLanguageItIt":{"name":"SDLLanguageItIt","abstract":"<p>Italian - Italy</p>"},"Constants.html#/c:@SDLLanguageSvSe":{"name":"SDLLanguageSvSe","abstract":"<p>Swedish - Sweden</p>"},"Constants.html#/c:@SDLLanguagePtPt":{"name":"SDLLanguagePtPt","abstract":"<p>Portuguese - Portugal</p>"},"Constants.html#/c:@SDLLanguageNlNl":{"name":"SDLLanguageNlNl","abstract":"<p>Dutch (Standard) - Netherlands</p>"},"Constants.html#/c:@SDLLanguageEnAu":{"name":"SDLLanguageEnAu","abstract":"<p>English - Australia</p>"},"Constants.html#/c:@SDLLanguageZhCn":{"name":"SDLLanguageZhCn","abstract":"<p>Mandarin - China</p>"},"Constants.html#/c:@SDLLanguageZhTw":{"name":"SDLLanguageZhTw","abstract":"<p>Mandarin - Taiwan</p>"},"Constants.html#/c:@SDLLanguageJaJp":{"name":"SDLLanguageJaJp","abstract":"<p>Japanese - Japan</p>"},"Constants.html#/c:@SDLLanguageArSa":{"name":"SDLLanguageArSa","abstract":"<p>Arabic - Saudi Arabia</p>"},"Constants.html#/c:@SDLLanguageKoKr":{"name":"SDLLanguageKoKr","abstract":"<p>Korean - South Korea</p>"},"Constants.html#/c:@SDLLanguagePtBr":{"name":"SDLLanguagePtBr","abstract":"<p>Portuguese - Brazil</p>"},"Constants.html#/c:@SDLLanguageCsCz":{"name":"SDLLanguageCsCz","abstract":"<p>Czech - Czech Republic</p>"},"Constants.html#/c:@SDLLanguageDaDk":{"name":"SDLLanguageDaDk","abstract":"<p>Danish - Denmark</p>"},"Constants.html#/c:@SDLLanguageNoNo":{"name":"SDLLanguageNoNo","abstract":"<p>Norwegian - Norway</p>"},"Constants.html#/c:@SDLLayoutModeIconOnly":{"name":"SDLLayoutModeIconOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons.</p>"},"Constants.html#/c:@SDLLayoutModeIconWithSearch":{"name":"SDLLayoutModeIconWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeListOnly":{"name":"SDLLayoutModeListOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list.</p>"},"Constants.html#/c:@SDLLayoutModeListWithSearch":{"name":"SDLLayoutModeListWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeKeyboard":{"name":"SDLLayoutModeKeyboard","abstract":"<p>This mode causes the interaction to immediately display a keyboard entry through the HMI.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftHighBeam":{"name":"SDLLightNameFrontLeftHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightHighBeam":{"name":"SDLLightNameFrontRightHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftLowBeam":{"name":"SDLLightNameFrontLeftLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightLowBeam":{"name":"SDLLightNameFrontRightLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftParkingLight":{"name":"SDLLightNameFrontLeftParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightParkingLight":{"name":"SDLLightNameFrontRightParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftFogLight":{"name":"SDLLightNameFrontLeftFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightFogLight":{"name":"SDLLightNameFrontRightFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftDaytimeRunningLight":{"name":"SDLLightNameFrontLeftDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightDaytimeRunningLight":{"name":"SDLLightNameFrontRightDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftTurnLight":{"name":"SDLLightNameFrontLeftTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightTurnLight":{"name":"SDLLightNameFrontRightTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_Right_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftFogLight":{"name":"SDLLightNameRearLeftFogLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_FOG_LIGHT.</p>"},"Constants.html#/c:@SDLLightNameRearRightFogLight":{"name":"SDLLightNameRearRightFogLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTailLight":{"name":"SDLLightNameRearLeftTailLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTailLight":{"name":"SDLLightNameRearRightTailLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftBrakeLight":{"name":"SDLLightNameRearLeftBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightBrakeLight":{"name":"SDLLightNameRearRightBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTurnLight":{"name":"SDLLightNameRearLeftTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTurnLight":{"name":"SDLLightNameRearRightTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRegistrationPlateLight":{"name":"SDLLightNameRearRegistrationPlateLight","abstract":"<p>@abstract Represents the Light with name REAR_REGISTRATION_PLATE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameHighBeams":{"name":"SDLLightNameHighBeams","abstract":"<p>@abstract Include all high beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameLowBeams":{"name":"SDLLightNameLowBeams","abstract":"<p>@abstract Include all low beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameFogLights":{"name":"SDLLightNameFogLights","abstract":"<p>@abstract Include all fog lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRunningLights":{"name":"SDLLightNameRunningLights","abstract":"<p>@abstract Include all daytime running lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameParkingLights":{"name":"SDLLightNameParkingLights","abstract":"<p>@abstract Include all parking lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameBrakeLights":{"name":"SDLLightNameBrakeLights","abstract":"<p>@abstract Include all brake lights: rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRearReversingLights":{"name":"SDLLightNameRearReversingLights","abstract":"<p>@abstract Represents the Light with name REAR_REVERSING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameSideMarkerLights":{"name":"SDLLightNameSideMarkerLights","abstract":"<p>@abstract Represents the Light with name SIDE_MARKER_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameLeftTurnLights":{"name":"SDLLightNameLeftTurnLights","abstract":"<p>@abstract Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameRightTurnLights":{"name":"SDLLightNameRightTurnLights","abstract":"<p>@abstract Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameHazardLights":{"name":"SDLLightNameHazardLights","abstract":"<p>@abstract Include all hazard lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameAmbientLights":{"name":"SDLLightNameAmbientLights","abstract":"<p>@abstract Represents the Light with name AMBIENT_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameOverHeadLights":{"name":"SDLLightNameOverHeadLights","abstract":"<p>@abstract Represents the Light with name OVERHEAD_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameReadingLights":{"name":"SDLLightNameReadingLights","abstract":"<p>@abstract Represents the Light with name READING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameTrunkLights":{"name":"SDLLightNameTrunkLights","abstract":"<p>@abstract Represents the Light with name TRUNK_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameExteriorFrontLights":{"name":"SDLLightNameExteriorFrontLights","abstract":"<p>@abstract Include exterior lights located in front of the vehicle. For example, fog lights and low beams.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearLights":{"name":"SDLLightNameExteriorRearLights","abstract":"<p>@abstract Include exterior lights located at the back of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorLeftLights":{"name":"SDLLightNameExteriorLeftLights","abstract":"<p>@abstract Include exterior lights located at the left side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRightLights":{"name":"SDLLightNameExteriorRightLights","abstract":"<p>@abstract Include exterior lights located at the right side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRearCargoLights":{"name":"SDLLightNameExteriorRearCargoLights","abstract":"<p>@abstract Cargo lamps illuminate the cargo area.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTruckBedLights":{"name":"SDLLightNameExteriorRearTruckBedLights","abstract":"<p>@abstract Truck bed lamps light up the bed of the truck.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTrailerLights":{"name":"SDLLightNameExteriorRearTrailerLights","abstract":"<p>@abstract Trailer lights are lamps mounted on a trailer hitch.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftSpotLights":{"name":"SDLLightNameExteriorLeftSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the left side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightSpotLights":{"name":"SDLLightNameExteriorRightSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the right side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftPuddleLights":{"name":"SDLLightNameExteriorLeftPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightPuddleLights":{"name":"SDLLightNameExteriorRightPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorAllLights":{"name":"SDLLightNameExteriorAllLights","abstract":"<p>@abstract Include all exterior lights around the vehicle.</p>"},"Constants.html#/c:@SDLLightStatusOn":{"name":"SDLLightStatusOn","abstract":"<p>@abstract Light status currently on.</p>"},"Constants.html#/c:@SDLLightStatusOFF":{"name":"SDLLightStatusOFF","abstract":"<p>@abstract Light status currently Off.</p>"},"Constants.html#/c:@SDLLightStatusRampUp":{"name":"SDLLightStatusRampUp","abstract":"<p>@abstract Light status currently RAMP_UP.</p>"},"Constants.html#/c:@SDLLightStatusRampDown":{"name":"SDLLightStatusRampDown","abstract":"<p>@abstract Light status currently RAMP_DOWN.</p>"},"Constants.html#/c:@SDLLightStatusUnknown":{"name":"SDLLightStatusUnknown","abstract":"<p>@abstract Light status currently UNKNOWN.</p>"},"Constants.html#/c:@SDLLightStatusInvalid":{"name":"SDLLightStatusInvalid","abstract":"<p>@abstract Light status currently INVALID.</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNormal":{"name":"SDLMaintenanceModeStatusNormal","abstract":"<p>Maintenance Mode Status : Normal</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNear":{"name":"SDLMaintenanceModeStatusNear","abstract":"<p>Maintenance Mode Status : Near</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusActive":{"name":"SDLMaintenanceModeStatusActive","abstract":"<p>Maintenance Mode Status : Active</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusFeatureNotPresent":{"name":"SDLMaintenanceModeStatusFeatureNotPresent","abstract":"<p>Maintenance Mode Status : Feature not present</p>"},"Constants.html#/c:@SDLMassageCushionTopLumbar":{"name":"SDLMassageCushionTopLumbar","abstract":"<p>@abstract TOP LUMBAR cushions of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionMiddleLumbar":{"name":"SDLMassageCushionMiddleLumbar","abstract":"<p>@abstract MIDDLE LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBottomLumbar":{"name":"SDLMassageCushionBottomLumbar","abstract":"<p>@abstract BOTTOM LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBackBolsters":{"name":"SDLMassageCushionBackBolsters","abstract":"<p>@abstract BACK BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionSeatBolsters":{"name":"SDLMassageCushionSeatBolsters","abstract":"<p>@abstract SEAT BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageModeOff":{"name":"SDLMassageModeOff","abstract":"<p>@abstract Massage Mode Status : OFF</p>"},"Constants.html#/c:@SDLMassageModeLow":{"name":"SDLMassageModeLow","abstract":"<p>@abstract Massage Mode Status : LOW</p>"},"Constants.html#/c:@SDLMassageModeHigh":{"name":"SDLMassageModeHigh","abstract":"<p>@abstract Massage Mode Status : HIGH</p>"},"Constants.html#/c:@SDLMassageZoneLumbar":{"name":"SDLMassageZoneLumbar","abstract":"<p>@abstract The back of a multi-contour massage seat. or SEAT_BACK</p>"},"Constants.html#/c:@SDLMassageZoneSeatCushion":{"name":"SDLMassageZoneSeatCushion","abstract":"<p>@abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM</p>"},"Constants.html#/c:@SDLMediaClockFormatClock1":{"name":"SDLMediaClockFormatClock1","abstract":"<p>Media clock format: Clock1</p>"},"Constants.html#/c:@SDLMediaClockFormatClock2":{"name":"SDLMediaClockFormatClock2","abstract":"<p>Media clock format: Clock2</p>"},"Constants.html#/c:@SDLMediaClockFormatClock3":{"name":"SDLMediaClockFormatClock3","abstract":"<p>Media clock format: Clock3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText1":{"name":"SDLMediaClockFormatClockText1","abstract":"<p>Media clock format: ClockText1</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText2":{"name":"SDLMediaClockFormatClockText2","abstract":"<p>Media clock format: ClockText2</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText3":{"name":"SDLMediaClockFormatClockText3","abstract":"<p>Media clock format: ClockText3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText4":{"name":"SDLMediaClockFormatClockText4","abstract":"<p>Media clock format: ClockText4</p>"},"Constants.html#/c:@SDLMediaTypeMusic":{"name":"SDLMediaTypeMusic","abstract":"<p>The app will have a media type of music.</p>"},"Constants.html#/c:@SDLMediaTypePodcast":{"name":"SDLMediaTypePodcast","abstract":"<p>The app will have a media type of podcast.</p>"},"Constants.html#/c:@SDLMediaTypeAudiobook":{"name":"SDLMediaTypeAudiobook","abstract":"<p>The app will have a media type of audiobook.</p>"},"Constants.html#/c:@SDLMediaTypeOther":{"name":"SDLMediaTypeOther","abstract":"<p>The app will have a media type of other.</p>"},"Constants.html#/c:@SDLMenuLayoutList":{"name":"SDLMenuLayoutList","abstract":"<p>The menu should be laid out in a scrollable list format with one menu cell below the previous, each is stretched across the view</p>"},"Constants.html#/c:@SDLMenuLayoutTiles":{"name":"SDLMenuLayoutTiles","abstract":"<p>The menu should be laid out in a scrollable tiles format with each menu cell laid out in a square-ish format next to each other horizontally</p>"},"Constants.html#/c:@SDLMetadataTypeMediaTitle":{"name":"SDLMetadataTypeMediaTitle","abstract":"<p>The song / media title name</p>"},"Constants.html#/c:@SDLMetadataTypeMediaArtist":{"name":"SDLMetadataTypeMediaArtist","abstract":"<p>The &ldquo;artist&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaAlbum":{"name":"SDLMetadataTypeMediaAlbum","abstract":"<p>The &ldquo;album&rdquo; of the media&quot;</p>"},"Constants.html#/c:@SDLMetadataTypeMediaYear":{"name":"SDLMetadataTypeMediaYear","abstract":"<p>The &ldquo;year&rdquo; that the media was created</p>"},"Constants.html#/c:@SDLMetadataTypeMediaGenre":{"name":"SDLMetadataTypeMediaGenre","abstract":"<p>The &ldquo;genre&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaStation":{"name":"SDLMetadataTypeMediaStation","abstract":"<p>The &ldquo;station&rdquo; that the media is playing on</p>"},"Constants.html#/c:@SDLMetadataTypeRating":{"name":"SDLMetadataTypeRating","abstract":"<p>The &ldquo;rating&rdquo; given to the media</p>"},"Constants.html#/c:@SDLMetadataTypeCurrentTemperature":{"name":"SDLMetadataTypeCurrentTemperature","abstract":"<p>The current temperature of the weather information</p>"},"Constants.html#/c:@SDLMetadataTypeMaximumTemperature":{"name":"SDLMetadataTypeMaximumTemperature","abstract":"<p>The high / maximum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeMinimumTemperature":{"name":"SDLMetadataTypeMinimumTemperature","abstract":"<p>The low / minimum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeWeatherTerm":{"name":"SDLMetadataTypeWeatherTerm","abstract":"<p>A description of the weather for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeHumidity":{"name":"SDLMetadataTypeHumidity","abstract":"<p>The humidity of the weather information for the current period</p>"},"Constants.html#/c:@SDLModuleTypeClimate":{"name":"SDLModuleTypeClimate","abstract":"<p>A SDLModuleType with the value of <em>CLIMATE</em></p>"},"Constants.html#/c:@SDLModuleTypeRadio":{"name":"SDLModuleTypeRadio","abstract":"<p>A SDLModuleType with the value of <em>RADIO</em></p>"},"Constants.html#/c:@SDLModuleTypeSeat":{"name":"SDLModuleTypeSeat","abstract":"<p>A SDLModuleType with the value of <em>SEAT</em></p>"},"Constants.html#/c:@SDLModuleTypeAudio":{"name":"SDLModuleTypeAudio","abstract":"<p>A SDLModuleType with the value of <em>AUDIO</em></p>"},"Constants.html#/c:@SDLModuleTypeLight":{"name":"SDLModuleTypeLight","abstract":"<p>A SDLModuleType with the value of <em>LIGHT</em></p>"},"Constants.html#/c:@SDLModuleTypeHMISettings":{"name":"SDLModuleTypeHMISettings","abstract":"<p>A SDLModuleType with the value of <em>HMI_SETTINGS</em></p>"},"Constants.html#/c:@SDLNavigationActionTurn":{"name":"SDLNavigationActionTurn","abstract":"<p>Using this action plus a supplied direction can give the type of turn.</p>"},"Constants.html#/c:@SDLNavigationActionExit":{"name":"SDLNavigationActionExit","abstract":"<p>A navigation action of exit.</p>"},"Constants.html#/c:@SDLNavigationActionStay":{"name":"SDLNavigationActionStay","abstract":"<p>A navigation action of stay.</p>"},"Constants.html#/c:@SDLNavigationActionMerge":{"name":"SDLNavigationActionMerge","abstract":"<p>A navigation action of merge.</p>"},"Constants.html#/c:@SDLNavigationActionFerry":{"name":"SDLNavigationActionFerry","abstract":"<p>A navigation action of ferry.</p>"},"Constants.html#/c:@SDLNavigationActionCarShuttleTrain":{"name":"SDLNavigationActionCarShuttleTrain","abstract":"<p>A navigation action of car shuttle train.</p>"},"Constants.html#/c:@SDLNavigationActionWaypoint":{"name":"SDLNavigationActionWaypoint","abstract":"<p>A navigation action of waypoint.</p>"},"Constants.html#/c:@SDLNavigationJunctionRegular":{"name":"SDLNavigationJunctionRegular","abstract":"<p>A junction that represents a standard intersection with a single road crossing another.</p>"},"Constants.html#/c:@SDLNavigationJunctionBifurcation":{"name":"SDLNavigationJunctionBifurcation","abstract":"<p>A junction where the road splits off into two paths; a fork in the road.</p>"},"Constants.html#/c:@SDLNavigationJunctionMultiCarriageway":{"name":"SDLNavigationJunctionMultiCarriageway","abstract":"<p>A junction that has multiple intersections and paths.</p>"},"Constants.html#/c:@SDLNavigationJunctionRoundabout":{"name":"SDLNavigationJunctionRoundabout","abstract":"<p>A junction where traffic moves in a single direction around a central, non-traversable point to reach one of the connecting roads.</p>"},"Constants.html#/c:@SDLNavigationJunctionTraversableRoundabout":{"name":"SDLNavigationJunctionTraversableRoundabout","abstract":"<p>Similar to a roundabout, however the center of the roundabout is fully traversable. Also known as a mini-roundabout.</p>"},"Constants.html#/c:@SDLNavigationJunctionJughandle":{"name":"SDLNavigationJunctionJughandle","abstract":"<p>A junction where lefts diverge to the right, then curve to the left, converting a left turn to a crossing maneuver.</p>"},"Constants.html#/c:@SDLNavigationJunctionAllWayYield":{"name":"SDLNavigationJunctionAllWayYield","abstract":"<p>Multiple way intersection that allows traffic to flow based on priority; most commonly right of way and first in, first out.</p>"},"Constants.html#/c:@SDLNavigationJunctionTurnAround":{"name":"SDLNavigationJunctionTurnAround","abstract":"<p>A junction designated for traffic turn arounds.</p>"},"Constants.html#/c:@SDLNotificationUserInfoObject":{"name":"SDLNotificationUserInfoObject","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userinfo dictionary.</p>"},"Constants.html#/c:@SDLTransportDidDisconnect":{"name":"SDLTransportDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLTransportDidConnect":{"name":"SDLTransportDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLTransportConnectError":{"name":"SDLTransportConnectError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidDisconnect":{"name":"SDLRPCServiceDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidConnect":{"name":"SDLRPCServiceDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLRPCServiceConnectionDidError":{"name":"SDLRPCServiceConnectionDidError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLDidReceiveError":{"name":"SDLDidReceiveError","abstract":"<p>Name for a general error notification</p>"},"Constants.html#/c:@SDLDidReceiveLockScreenIcon":{"name":"SDLDidReceiveLockScreenIcon","abstract":"<p>Name for an incoming lock screen icon notification</p>"},"Constants.html#/c:@SDLDidBecomeReady":{"name":"SDLDidBecomeReady","abstract":"<p>Name for an SDL became ready notification</p>"},"Constants.html#/c:@SDLDidUpdateProjectionView":{"name":"SDLDidUpdateProjectionView","abstract":"<p>Name for a notification sent by the user when their CarWindow view has been updated</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandResponse":{"name":"SDLDidReceiveAddCommandResponse","abstract":"<p>Name for an AddCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuResponse":{"name":"SDLDidReceiveAddSubMenuResponse","abstract":"<p>Name for an AddSubMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertResponse":{"name":"SDLDidReceiveAlertResponse","abstract":"<p>Name for an Alert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverResponse":{"name":"SDLDidReceiveAlertManeuverResponse","abstract":"<p>Name for an AlertManeuver response RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressResponse":{"name":"SDLDidReceiveButtonPressResponse","abstract":"<p>Name for an ButtonPress response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionResponse":{"name":"SDLDidReceiveCancelInteractionResponse","abstract":"<p>Name for aa CancelInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse":{"name":"SDLDidReceiveChangeRegistrationResponse","abstract":"<p>Name for a ChangeRegistration response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationResponse":{"name":"SDLDidReceiveCloseApplicationResponse","abstract":"<p>Name for a CloseApplication response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse":{"name":"SDLDidReceiveCreateInteractionChoiceSetResponse","abstract":"<p>Name for a CreateInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowResponse":{"name":"SDLDidReceiveCreateWindowResponse","abstract":"<p>Name for a CreateWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandResponse":{"name":"SDLDidReceiveDeleteCommandResponse","abstract":"<p>Name for a DeleteCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileResponse":{"name":"SDLDidReceiveDeleteFileResponse","abstract":"<p>Name for a DeleteFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse":{"name":"SDLDidReceiveDeleteInteractionChoiceSetResponse","abstract":"<p>Name for a DeleteInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse":{"name":"SDLDidReceiveDeleteSubmenuResponse","abstract":"<p>Name for a DeleteSubmenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowResponse":{"name":"SDLDidReceiveDeleteWindowResponse","abstract":"<p>Name for a DeleteWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse":{"name":"SDLDidReceiveDiagnosticMessageResponse","abstract":"<p>Name for a DiagnosticMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberResponse":{"name":"SDLDidReceiveDialNumberResponse","abstract":"<p>Name for a DialNumber response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse":{"name":"SDLDidReceiveEncodedSyncPDataResponse","abstract":"<p>Name for an EncodedSyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse":{"name":"SDLDidReceiveEndAudioPassThruResponse","abstract":"<p>Name for an EndAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGenericResponse":{"name":"SDLDidReceiveGenericResponse","abstract":"<p>Name for a Generic response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesResponse":{"name":"SDLDidReceiveGetCloudAppPropertiesResponse","abstract":"<p>Name for a GetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataResponse":{"name":"SDLDidReceiveGetAppServiceDataResponse","abstract":"<p>Name for a GetAppServiceData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsResponse":{"name":"SDLDidReceiveGetDTCsResponse","abstract":"<p>Name for a GetDTCs response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileResponse":{"name":"SDLDidReceiveGetFileResponse","abstract":"<p>Name for a GetFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataResponse","abstract":"<p>Name for a GetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentResponse","abstract":"<p>Name for a GetInteriorVehicleDataConsent response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilitiesResponse":{"name":"SDLDidReceiveGetSystemCapabilitiesResponse","abstract":"<p>Name for a GetSystemCapabilities response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse":{"name":"SDLDidReceiveGetVehicleDataResponse","abstract":"<p>Name for a GetVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWaypointsResponse":{"name":"SDLDidReceiveGetWaypointsResponse","abstract":"<p>Name for a GetWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesResponse":{"name":"SDLDidReceiveListFilesResponse","abstract":"<p>Name for a ListFiles response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionResponse":{"name":"SDLDidReceivePerformAppServiceInteractionResponse","abstract":"<p>Name for a PerformAppServiceInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse":{"name":"SDLDidReceivePerformAudioPassThruResponse","abstract":"<p>Name for a PerformAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionResponse":{"name":"SDLDidReceivePerformInteractionResponse","abstract":"<p>Name for a PerformInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceResponse":{"name":"SDLDidReceivePublishAppServiceResponse","abstract":"<p>Name for a PublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileResponse":{"name":"SDLDidReceivePutFileResponse","abstract":"<p>Name for a ReceivePutFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDResponse":{"name":"SDLDidReceiveReadDIDResponse","abstract":"<p>Name for a ReceiveReadDID response RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse":{"name":"SDLDidReceiveRegisterAppInterfaceResponse","abstract":"<p>Name for a RegisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleResponse":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Name for a ReleaseInteriorVehicleDataModule response RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse":{"name":"SDLDidReceiveResetGlobalPropertiesResponse","abstract":"<p>Name for a ResetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageResponse":{"name":"SDLDidReceiveScrollableMessageResponse","abstract":"<p>Name for a ScrollableMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataResponse":{"name":"SDLDidReceiveSendHapticDataResponse","abstract":"<p>Name for a SendHapticData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationResponse":{"name":"SDLDidReceiveSendLocationResponse","abstract":"<p>Name for a SendLocation response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconResponse":{"name":"SDLDidReceiveSetAppIconResponse","abstract":"<p>Name for a SetAppIcon response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesResponse":{"name":"SDLDidReceiveSetCloudAppPropertiesResponse","abstract":"<p>Name for a SetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse":{"name":"SDLDidReceiveSetDisplayLayoutResponse","abstract":"<p>Name for a SetDisplayLayout response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse":{"name":"SDLDidReceiveSetGlobalPropertiesResponse","abstract":"<p>Name for a SetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataResponse":{"name":"SDLDidReceiveSetInteriorVehicleDataResponse","abstract":"<p>Name for a SetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse":{"name":"SDLDidReceiveSetMediaClockTimerResponse","abstract":"<p>Name for a SetMediaClockTimer response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse":{"name":"SDLDidReceiveShowConstantTBTResponse","abstract":"<p>Name for a ShowConstantTBT response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowResponse":{"name":"SDLDidReceiveShowResponse","abstract":"<p>Name for a Show response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuResponse":{"name":"SDLDidReceiveShowAppMenuResponse","abstract":"<p>Name for a ShowAppMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderResponse":{"name":"SDLDidReceiveSliderResponse","abstract":"<p>Name for a Slider response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakResponse":{"name":"SDLDidReceiveSpeakResponse","abstract":"<p>Name for a Speak response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse":{"name":"SDLDidReceiveSubscribeButtonResponse","abstract":"<p>Name for a SubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse":{"name":"SDLDidReceiveSubscribeVehicleDataResponse","abstract":"<p>Name for a SubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWaypointsResponse":{"name":"SDLDidReceiveSubscribeWaypointsResponse","abstract":"<p>Name for a SubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertResponse":{"name":"SDLDidReceiveSubtleAlertResponse","abstract":"<p>Name for a SubtleAlert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"<p>Name for a SyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestResponse":{"name":"SDLDidReceiveSystemRequestResponse","abstract":"<p>Name for a SystemRequest response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse":{"name":"SDLDidReceiveUpdateTurnListResponse","abstract":"<p>Name for an UpdateTurnList response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceResponse":{"name":"SDLDidReceiveUnpublishAppServiceResponse","abstract":"<p>Name for an UnpublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse":{"name":"SDLDidReceiveUnregisterAppInterfaceResponse","abstract":"<p>Name for an UnregisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse":{"name":"SDLDidReceiveUnsubscribeButtonResponse","abstract":"<p>Name for an UnsubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse":{"name":"SDLDidReceiveUnsubscribeVehicleDataResponse","abstract":"<p>Name for an UnsubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWaypointsResponse":{"name":"SDLDidReceiveUnsubscribeWaypointsResponse","abstract":"<p>Name for an UnsubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandRequest":{"name":"SDLDidReceiveAddCommandRequest","abstract":"<p>Name for an AddCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuRequest":{"name":"SDLDidReceiveAddSubMenuRequest","abstract":"<p>Name for an AddSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertRequest":{"name":"SDLDidReceiveAlertRequest","abstract":"<p>Name for an Alert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverRequest":{"name":"SDLDidReceiveAlertManeuverRequest","abstract":"<p>Name for an AlertManeuver request RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressRequest":{"name":"SDLDidReceiveButtonPressRequest","abstract":"<p>Name for a ButtonPress request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionRequest":{"name":"SDLDidReceiveCancelInteractionRequest","abstract":"<p>Name for a CancelInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationRequest":{"name":"SDLDidReceiveChangeRegistrationRequest","abstract":"<p>Name for a ChangeRegistration request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationRequest":{"name":"SDLDidReceiveCloseApplicationRequest","abstract":"<p>Name for a CloseApplication request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetRequest":{"name":"SDLDidReceiveCreateInteractionChoiceSetRequest","abstract":"<p>Name for a CreateInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowRequest":{"name":"SDLDidReceiveCreateWindowRequest","abstract":"<p>Name for a CreateWindow request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandRequest":{"name":"SDLDidReceiveDeleteCommandRequest","abstract":"<p>Name for a DeleteCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileRequest":{"name":"SDLDidReceiveDeleteFileRequest","abstract":"<p>Name for a DeleteFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetRequest":{"name":"SDLDidReceiveDeleteInteractionChoiceSetRequest","abstract":"<p>Name for a DeleteInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubMenuRequest":{"name":"SDLDidReceiveDeleteSubMenuRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowRequest":{"name":"SDLDidReceiveDeleteWindowRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageRequest":{"name":"SDLDidReceiveDiagnosticMessageRequest","abstract":"<p>Name for a DiagnosticMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberRequest":{"name":"SDLDidReceiveDialNumberRequest","abstract":"<p>Name for a DialNumberR request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataRequest":{"name":"SDLDidReceiveEncodedSyncPDataRequest","abstract":"<p>Name for an EncodedSyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruRequest":{"name":"SDLDidReceiveEndAudioPassThruRequest","abstract":"<p>Name for a EndAudioPass request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataRequest":{"name":"SDLDidReceiveGetAppServiceDataRequest","abstract":"<p>Name for a GetAppServiceData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesRequest":{"name":"SDLDidReceiveGetCloudAppPropertiesRequest","abstract":"<p>Name for a GetCloudAppProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsRequest":{"name":"SDLDidReceiveGetDTCsRequest","abstract":"<p>Name for a ReceiveGetDTCs request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileRequest":{"name":"SDLDidReceiveGetFileRequest","abstract":"<p>Name for a GetFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataRequest","abstract":"<p>Name for a GetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentRequest","abstract":"<p>Name for a GetInteriorVehicleDataConsent request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilityRequest":{"name":"SDLDidReceiveGetSystemCapabilityRequest","abstract":"<p>Name for a GetSystemCapability request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataRequest":{"name":"SDLDidReceiveGetVehicleDataRequest","abstract":"<p>Name for a GetVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWayPointsRequest":{"name":"SDLDidReceiveGetWayPointsRequest","abstract":"<p>Name for a GetWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesRequest":{"name":"SDLDidReceiveListFilesRequest","abstract":"<p>Name for a ListFiles request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionRequest":{"name":"SDLDidReceivePerformAppServiceInteractionRequest","abstract":"<p>Name for a PerformAppServiceInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruRequest":{"name":"SDLDidReceivePerformAudioPassThruRequest","abstract":"<p>Name for a PerformAudioPassThru request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionRequest":{"name":"SDLDidReceivePerformInteractionRequest","abstract":"<p>Name for a PerformInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceRequest":{"name":"SDLDidReceivePublishAppServiceRequest","abstract":"<p>Name for a PublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileRequest":{"name":"SDLDidReceivePutFileRequest","abstract":"<p>Name for a PutFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDRequest":{"name":"SDLDidReceiveReadDIDRequest","abstract":"<p>Name for a ReadDID request RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceRequest":{"name":"SDLDidReceiveRegisterAppInterfaceRequest","abstract":"<p>Name for a RegisterAppInterfacr request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleRequest":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleRequest","abstract":"<p>Name for a ReleaseInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesRequest":{"name":"SDLDidReceiveResetGlobalPropertiesRequest","abstract":"<p>Name for a ResetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageRequest":{"name":"SDLDidReceiveScrollableMessageRequest","abstract":"<p>Name for a ScrollableMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataRequest":{"name":"SDLDidReceiveSendHapticDataRequest","abstract":"<p>Name for a SendHapticData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationRequest":{"name":"SDLDidReceiveSendLocationRequest","abstract":"<p>Name for a SendLocation request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconRequest":{"name":"SDLDidReceiveSetAppIconRequest","abstract":"<p>Name for a SetAppIcon request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesRequest":{"name":"SDLDidReceiveSetCloudAppPropertiesRequest","abstract":"<p>Name for a SetCloudProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutRequest":{"name":"SDLDidReceiveSetDisplayLayoutRequest","abstract":"<p>Name for a SetDisplayLayout request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesRequest":{"name":"SDLDidReceiveSetGlobalPropertiesRequest","abstract":"<p>Name for a SetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataRequest":{"name":"SDLDidReceiveSetInteriorVehicleDataRequest","abstract":"<p>Name for a SetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerRequest":{"name":"SDLDidReceiveSetMediaClockTimerRequest","abstract":"<p>Name for a SetMediaClockTimer request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowRequest":{"name":"SDLDidReceiveShowRequest","abstract":"<p>Name for a Show request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuRequest":{"name":"SDLDidReceiveShowAppMenuRequest","abstract":"<p>Name for a ShowAppMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTRequest":{"name":"SDLDidReceiveShowConstantTBTRequest","abstract":"<p>Name for a ShowConstantTBT request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderRequest":{"name":"SDLDidReceiveSliderRequest","abstract":"<p>Name for a Slider request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakRequest":{"name":"SDLDidReceiveSpeakRequest","abstract":"<p>Name for a Speak request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonRequest":{"name":"SDLDidReceiveSubscribeButtonRequest","abstract":"<p>Name for a SubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataRequest":{"name":"SDLDidReceiveSubscribeVehicleDataRequest","abstract":"<p>Name for a SubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWayPointsRequest":{"name":"SDLDidReceiveSubscribeWayPointsRequest","abstract":"<p>Name for a SubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertRequest":{"name":"SDLDidReceiveSubtleAlertRequest","abstract":"<p>Name for a SubtleAlert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataRequest":{"name":"SDLDidReceiveSyncPDataRequest","abstract":"<p>Name for a SyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestRequest":{"name":"SDLDidReceiveSystemRequestRequest","abstract":"<p>Name for a SystemRequest request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceRequest":{"name":"SDLDidReceiveUnpublishAppServiceRequest","abstract":"<p>Name for an UnpublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceRequest":{"name":"SDLDidReceiveUnregisterAppInterfaceRequest","abstract":"<p>Name for an UnregisterAppInterface request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonRequest":{"name":"SDLDidReceiveUnsubscribeButtonRequest","abstract":"<p>Name for an UnsubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataRequest":{"name":"SDLDidReceiveUnsubscribeVehicleDataRequest","abstract":"<p>Name for an UnsubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWayPointsRequest":{"name":"SDLDidReceiveUnsubscribeWayPointsRequest","abstract":"<p>Name for an UnsubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListRequest":{"name":"SDLDidReceiveUpdateTurnListRequest","abstract":"<p>Name for an UpdateTurnList request RPC</p>"},"Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification":{"name":"SDLDidChangeDriverDistractionStateNotification","abstract":"<p>Name for a DriverDistractionState notification RPC</p>"},"Constants.html#/c:@SDLDidChangeHMIStatusNotification":{"name":"SDLDidChangeHMIStatusNotification","abstract":"<p>Name for a HMIStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppServiceDataNotification":{"name":"SDLDidReceiveAppServiceDataNotification","abstract":"<p>Name for an AppServiceData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification":{"name":"SDLDidReceiveAppUnregisteredNotification","abstract":"<p>Name for an AppUnregistered notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAudioPassThruNotification":{"name":"SDLDidReceiveAudioPassThruNotification","abstract":"<p>Name for an AudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonEventNotification":{"name":"SDLDidReceiveButtonEventNotification","abstract":"<p>Name for a ButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressNotification":{"name":"SDLDidReceiveButtonPressNotification","abstract":"<p>Name for a ButtonPress notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveCommandNotification":{"name":"SDLDidReceiveCommandNotification","abstract":"<p>Name for a Command notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedDataNotification":{"name":"SDLDidReceiveEncodedDataNotification","abstract":"<p>Name for a EncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveInteriorVehicleDataNotification":{"name":"SDLDidReceiveInteriorVehicleDataNotification","abstract":"<p>Name for a InteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveKeyboardInputNotification":{"name":"SDLDidReceiveKeyboardInputNotification","abstract":"<p>Name for a KeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLDidChangeLanguageNotification":{"name":"SDLDidChangeLanguageNotification","abstract":"<p>Name for a Language notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveNewHashNotification":{"name":"SDLDidReceiveNewHashNotification","abstract":"<p>Name for a NewHash notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleIconNotification":{"name":"SDLDidReceiveVehicleIconNotification","abstract":"<p>Name for a VehicleIcon notification RPC</p>"},"Constants.html#/c:@SDLDidChangePermissionsNotification":{"name":"SDLDidChangePermissionsNotification","abstract":"<p>Name for a ChangePermissions notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertPressedNotification":{"name":"SDLDidReceiveSubtleAlertPressedNotification","abstract":"<p>Name for a SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveRemoteControlStatusNotification":{"name":"SDLDidReceiveRemoteControlStatusNotification","abstract":"<p>Name for a RemoteControlStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataNotification":{"name":"SDLDidReceiveSyncPDataNotification","abstract":"<p>Name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemCapabilityUpdatedNotification":{"name":"SDLDidReceiveSystemCapabilityUpdatedNotification","abstract":"<p>Name for a SystemCapability notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestNotification":{"name":"SDLDidReceiveSystemRequestNotification","abstract":"<p>Name for a SystemRequest notification RPC</p>"},"Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification":{"name":"SDLDidChangeTurnByTurnStateNotification","abstract":"<p>Name for a TurnByTurnStat notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveTouchEventNotification":{"name":"SDLDidReceiveTouchEventNotification","abstract":"<p>Name for a TouchEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateFileNotification":{"name":"SDLDidReceiveUpdateFileNotification","abstract":"<p>Name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateSubMenuNotification":{"name":"SDLDidReceiveUpdateSubMenuNotification","abstract":"<p>Name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleDataNotification":{"name":"SDLDidReceiveVehicleDataNotification","abstract":"<p>Name for a VehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveWaypointNotification":{"name":"SDLDidReceiveWaypointNotification","abstract":"<p>Name for a Waypoint notification RPC</p>"},"Constants.html#/c:@SDLPRNDLPark":{"name":"SDLPRNDLPark","abstract":"<p>Park</p>"},"Constants.html#/c:@SDLPRNDLReverse":{"name":"SDLPRNDLReverse","abstract":"<p>Reverse gear</p>"},"Constants.html#/c:@SDLPRNDLNeutral":{"name":"SDLPRNDLNeutral","abstract":"<p>No gear</p>"},"Constants.html#/c:@SDLPRNDLDrive":{"name":"SDLPRNDLDrive","abstract":"<p>@abstract: Drive gear</p>"},"Constants.html#/c:@SDLPRNDLSport":{"name":"SDLPRNDLSport","abstract":"<p>Drive Sport mode</p>"},"Constants.html#/c:@SDLPRNDLLowGear":{"name":"SDLPRNDLLowGear","abstract":"<p>1st gear hold</p>"},"Constants.html#/c:@SDLPRNDLFirst":{"name":"SDLPRNDLFirst","abstract":"<p>First gear</p>"},"Constants.html#/c:@SDLPRNDLNinth":{"name":"SDLPRNDLNinth","abstract":"<p>Ninth gear"},"Constants.html#/c:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"<p>Second gear</p>"},"Constants.html#/c:@SDLPRNDLTenth":{"name":"SDLPRNDLTenth","abstract":"<p>Tenth gear"},"Constants.html#/c:@SDLPRNDLThird":{"name":"SDLPRNDLThird","abstract":"<p>Third gear</p>"},"Constants.html#/c:@SDLPRNDLFourth":{"name":"SDLPRNDLFourth","abstract":"<p>Fourth gear</p>"},"Constants.html#/c:@SDLPRNDLFifth":{"name":"SDLPRNDLFifth","abstract":"<p>Fifth gear</p>"},"Constants.html#/c:@SDLPRNDLSixth":{"name":"SDLPRNDLSixth","abstract":"<p>Sixth gear</p>"},"Constants.html#/c:@SDLPRNDLSeventh":{"name":"SDLPRNDLSeventh","abstract":"<p>Seventh gear</p>"},"Constants.html#/c:@SDLPRNDLEighth":{"name":"SDLPRNDLEighth","abstract":"<p>Eighth gear</p>"},"Constants.html#/c:@SDLPRNDLUnknown":{"name":"SDLPRNDLUnknown","abstract":"<p>Unknown</p>"},"Constants.html#/c:@SDLPRNDLFault":{"name":"SDLPRNDLFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLPermissionStatusAllowed":{"name":"SDLPermissionStatusAllowed","abstract":"<p>permission: allowed</p>"},"Constants.html#/c:@SDLPermissionStatusDisallowed":{"name":"SDLPermissionStatusDisallowed","abstract":"<p>permission: disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserDisallowed":{"name":"SDLPermissionStatusUserDisallowed","abstract":"<p>permission: user disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserConsentPending":{"name":"SDLPermissionStatusUserConsentPending","abstract":"<p>permission: user consent pending</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusUndefined":{"name":"SDLPowerModeQualificationStatusUndefined","abstract":"<p>An undefined status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusEvaluationInProgress":{"name":"SDLPowerModeQualificationStatusEvaluationInProgress","abstract":"<p>An &ldquo;evaluation in progress&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusNotDefined":{"name":"SDLPowerModeQualificationStatusNotDefined","abstract":"<p>A &ldquo;not defined&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusOk":{"name":"SDLPowerModeQualificationStatusOk","abstract":"<p>An &ldquo;ok&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyOut":{"name":"SDLPowerModeStatusKeyOut","abstract":"<p>The key is not in the ignition, and the power is off</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyRecentlyOut":{"name":"SDLPowerModeStatusKeyRecentlyOut","abstract":"<p>The key is not in the ignition and it was just recently removed</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyApproved":{"name":"SDLPowerModeStatusKeyApproved","abstract":"<p>The key is not in the ignition, but an approved key is available</p>"},"Constants.html#/c:@SDLPowerModeStatusPostAccessory":{"name":"SDLPowerModeStatusPostAccessory","abstract":"<p>We are in a post-accessory power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusAccessory":{"name":"SDLPowerModeStatusAccessory","abstract":"<p>The car is in accessory power mode</p>"},"Constants.html#/c:@SDLPowerModeStatusPostIgnition":{"name":"SDLPowerModeStatusPostIgnition","abstract":"<p>We are in a post-ignition power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusIgnitionOn":{"name":"SDLPowerModeStatusIgnitionOn","abstract":"<p>The ignition is on but the car is not yet running</p>"},"Constants.html#/c:@SDLPowerModeStatusRunning":{"name":"SDLPowerModeStatusRunning","abstract":"<p>The ignition is on and the car is running</p>"},"Constants.html#/c:@SDLPowerModeStatusCrank":{"name":"SDLPowerModeStatusCrank","abstract":"<p>We are in a crank power situation</p>"},"Constants.html#/c:@SDLPredefinedLayoutDefault":{"name":"SDLPredefinedLayoutDefault","abstract":"<p>A default layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutMedia":{"name":"SDLPredefinedLayoutMedia","abstract":"<p>The default media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutNonMedia":{"name":"SDLPredefinedLayoutNonMedia","abstract":"<p>The default non-media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutOnscreenPresets":{"name":"SDLPredefinedLayoutOnscreenPresets","abstract":"<p>A media layout containing preset buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationFullscreenMap":{"name":"SDLPredefinedLayoutNavigationFullscreenMap","abstract":"<p>The default navigation layout with a fullscreen map</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationList":{"name":"SDLPredefinedLayoutNavigationList","abstract":"<p>A list layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationKeyboard":{"name":"SDLPredefinedLayoutNavigationKeyboard","abstract":"<p>A keyboard layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithText":{"name":"SDLPredefinedLayoutGraphicWithText","abstract":"<p>A layout with a single graphic on the left and text on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextWithGraphic":{"name":"SDLPredefinedLayoutTextWithGraphic","abstract":"<p>A layout with text on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesOnly":{"name":"SDLPredefinedLayoutTilesOnly","abstract":"<p>A layout with only softbuttons placed in a tile layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsOnly":{"name":"SDLPredefinedLayoutTextButtonsOnly","abstract":"<p>A layout with only soft buttons that only accept text</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTiles":{"name":"SDLPredefinedLayoutGraphicWithTiles","abstract":"<p>A layout with a single graphic on the left and soft buttons in a tile layout on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesWithGraphic":{"name":"SDLPredefinedLayoutTilesWithGraphic","abstract":"<p>A layout with soft buttons in a tile layout on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextAndSoftButtons":{"name":"SDLPredefinedLayoutGraphicWithTextAndSoftButtons","abstract":"<p>A layout with a single graphic on the left and both text and soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextAndSoftButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextAndSoftButtonsWithGraphic","abstract":"<p>A layout with both text and soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextButtons":{"name":"SDLPredefinedLayoutGraphicWithTextButtons","abstract":"<p>A layout with a single graphic on the left and text-only soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextButtonsWithGraphic","abstract":"<p>A layout with text-only soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutLargeGraphicWithSoftButtons","abstract":"<p>A layout with a single large graphic and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutDoubleGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutDoubleGraphicWithSoftButtons","abstract":"<p>A layout with two graphics and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicOnly":{"name":"SDLPredefinedLayoutLargeGraphicOnly","abstract":"<p>A layout with only a single large graphic</p>"},"Constants.html#/c:@SDLPredefinedLayoutWebView":{"name":"SDLPredefinedLayoutWebView","abstract":"<p>Custom root template allowing in-vehicle WebEngine applications with"},"Constants.html#/c:@SDLPrerecordedSpeechHelp":{"name":"SDLPrerecordedSpeechHelp","abstract":"<p>A prerecorded help prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechInitial":{"name":"SDLPrerecordedSpeechInitial","abstract":"<p>A prerecorded initial prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechListen":{"name":"SDLPrerecordedSpeechListen","abstract":"<p>A prerecorded listen prompt is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechPositive":{"name":"SDLPrerecordedSpeechPositive","abstract":"<p>A prerecorded positive indicator noise is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechNegative":{"name":"SDLPrerecordedSpeechNegative","abstract":"<p>A prerecorded negative indicator noise is available</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceNoSourceSelected":{"name":"SDLPrimaryAudioSourceNoSourceSelected","abstract":"<p>Currently no source selected</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB":{"name":"SDLPrimaryAudioSourceUSB","abstract":"<p>USB is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB2":{"name":"SDLPrimaryAudioSourceUSB2","abstract":"<p>USB2 is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceBluetoothStereo":{"name":"SDLPrimaryAudioSourceBluetoothStereo","abstract":"<p>Bluetooth Stereo is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceLineIn":{"name":"SDLPrimaryAudioSourceLineIn","abstract":"<p>Line in is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceIpod":{"name":"SDLPrimaryAudioSourceIpod","abstract":"<p>iPod is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceMobileApp":{"name":"SDLPrimaryAudioSourceMobileApp","abstract":"<p>Mobile app is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceCD":{"name":"SDLPrimaryAudioSourceCD","abstract":"<p>@abstract CD is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceAM":{"name":"SDLPrimaryAudioSourceAM","abstract":"<p>@abstract Radio frequency AM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceFM":{"name":"SDLPrimaryAudioSourceFM","abstract":"<p>@abstract Radio frequency FM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceXM":{"name":"SDLPrimaryAudioSourceXM","abstract":"<p>@abstract Radio frequency XM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceDAB":{"name":"SDLPrimaryAudioSourceDAB","abstract":"<p>@abstract Radio frequency DAB is current source</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddCommand":{"name":"SDLRPCFunctionNameAddCommand","abstract":"<p>Function name for an AddCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddSubMenu":{"name":"SDLRPCFunctionNameAddSubMenu","abstract":"<p>Function name for an AddSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlert":{"name":"SDLRPCFunctionNameAlert","abstract":"<p>Function name for an Alert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlertManeuver":{"name":"SDLRPCFunctionNameAlertManeuver","abstract":"<p>Function name for an AlertManeuver RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameButtonPress":{"name":"SDLRPCFunctionNameButtonPress","abstract":"<p>Function name for a ButtonPress RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCancelInteraction":{"name":"SDLRPCFunctionNameCancelInteraction","abstract":"<p>Function name for a CancelInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameChangeRegistration":{"name":"SDLRPCFunctionNameChangeRegistration","abstract":"<p>Function name for a ChangeRegistration RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCloseApplication":{"name":"SDLRPCFunctionNameCloseApplication","abstract":"<p>Function name for a CloseApplication RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateInteractionChoiceSet":{"name":"SDLRPCFunctionNameCreateInteractionChoiceSet","abstract":"<p>Function name for a CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteCommand":{"name":"SDLRPCFunctionNameDeleteCommand","abstract":"<p>Function name for a DeleteCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteFile":{"name":"SDLRPCFunctionNameDeleteFile","abstract":"<p>Function name for a DeleteFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteInteractionChoiceSet":{"name":"SDLRPCFunctionNameDeleteInteractionChoiceSet","abstract":"<p>Function name for a DeleteInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteSubMenu":{"name":"SDLRPCFunctionNameDeleteSubMenu","abstract":"<p>Function name for a DeleteSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDiagnosticMessage":{"name":"SDLRPCFunctionNameDiagnosticMessage","abstract":"<p>Function name for a DiagnosticMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDialNumber":{"name":"SDLRPCFunctionNameDialNumber","abstract":"<p>Function name for a DialNumber RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEncodedSyncPData":{"name":"SDLRPCFunctionNameEncodedSyncPData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEndAudioPassThru":{"name":"SDLRPCFunctionNameEndAudioPassThru","abstract":"<p>Function name for an EndAudioPassThru RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGenericResponse":{"name":"SDLRPCFunctionNameGenericResponse","abstract":"<p>Function name for an GenricResponse Response RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetAppServiceData":{"name":"SDLRPCFunctionNameGetAppServiceData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetDTCs":{"name":"SDLRPCFunctionNameGetDTCs","abstract":"<p>Function name for a GetDTCs RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetFile":{"name":"SDLRPCFunctionNameGetFile","abstract":"<p>Function name for a GetFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetCloudAppProperties":{"name":"SDLRPCFunctionNameGetCloudAppProperties","abstract":"<p>Function name for a GetCloudAppProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleData":{"name":"SDLRPCFunctionNameGetInteriorVehicleData","abstract":"<p>Function name for a GetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleDataConsent":{"name":"SDLRPCFunctionNameGetInteriorVehicleDataConsent","abstract":"<p>Function name for a GetInteriorVehicleDataConsent RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetSystemCapability":{"name":"SDLRPCFunctionNameGetSystemCapability","abstract":"<p>Function name for a GetSystemCapability RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetVehicleData":{"name":"SDLRPCFunctionNameGetVehicleData","abstract":"<p>Function name for a GetVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetWayPoints":{"name":"SDLRPCFunctionNameGetWayPoints","abstract":"<p>Function name for a GetWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameListFiles":{"name":"SDLRPCFunctionNameListFiles","abstract":"<p>Function name for a ListFiles RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered":{"name":"SDLRPCFunctionNameOnAppInterfaceUnregistered","abstract":"<p>Function name for an OnAppInterfaceUnregistered notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppServiceData":{"name":"SDLRPCFunctionNameOnAppServiceData","abstract":"<p>Function name for an OnAppServiceData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAudioPassThru":{"name":"SDLRPCFunctionNameOnAudioPassThru","abstract":"<p>Function name for an OnAudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonEvent":{"name":"SDLRPCFunctionNameOnButtonEvent","abstract":"<p>Function name for an OnButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonPress":{"name":"SDLRPCFunctionNameOnButtonPress","abstract":"<p>Function name for an OnButtonPress notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnCommand":{"name":"SDLRPCFunctionNameOnCommand","abstract":"<p>Function name for an OnCommand notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnDriverDistraction":{"name":"SDLRPCFunctionNameOnDriverDistraction","abstract":"<p>Function name for an OnDriverDistraction notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnEncodedSyncPData":{"name":"SDLRPCFunctionNameOnEncodedSyncPData","abstract":"<p>Function name for an OnEncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHashChange":{"name":"SDLRPCFunctionNameOnHashChange","abstract":"<p>Function name for an OnHashChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHMIStatus":{"name":"SDLRPCFunctionNameOnHMIStatus","abstract":"<p>Function name for an OnHMIStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnInteriorVehicleData":{"name":"SDLRPCFunctionNameOnInteriorVehicleData","abstract":"<p>Function name for an OnInteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnKeyboardInput":{"name":"SDLRPCFunctionNameOnKeyboardInput","abstract":"<p>Function name for an OnKeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLanguageChange":{"name":"SDLRPCFunctionNameOnLanguageChange","abstract":"<p>Function name for an OnLanguageChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLockScreenStatus":{"name":"SDLRPCFunctionNameOnLockScreenStatus","abstract":"<p>Function name for an OnLockScreenStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnPermissionsChange":{"name":"SDLRPCFunctionNameOnPermissionsChange","abstract":"<p>Function name for an OnPermissionsChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnRCStatus":{"name":"SDLRPCFunctionNameOnRCStatus","abstract":"<p>Function name for an OnRCStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSubtleAlertPressed":{"name":"SDLRPCFunctionNameOnSubtleAlertPressed","abstract":"<p>Function name for an SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSyncPData":{"name":"SDLRPCFunctionNameOnSyncPData","abstract":"<p>Function name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemCapabilityUpdated":{"name":"SDLRPCFunctionNameOnSystemCapabilityUpdated","abstract":"<p>Function name for an OnSystemCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemRequest":{"name":"SDLRPCFunctionNameOnSystemRequest","abstract":"<p>Function name for an OnSystemRequest notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTBTClientState":{"name":"SDLRPCFunctionNameOnTBTClientState","abstract":"<p>Function name for an OnTBTClientState notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTouchEvent":{"name":"SDLRPCFunctionNameOnTouchEvent","abstract":"<p>Function name for an OnTouchEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateFile":{"name":"SDLRPCFunctionNameOnUpdateFile","abstract":"<p>Function name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateSubMenu":{"name":"SDLRPCFunctionNameOnUpdateSubMenu","abstract":"<p>Function name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnVehicleData":{"name":"SDLRPCFunctionNameOnVehicleData","abstract":"<p>Function name for an OnVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnWayPointChange":{"name":"SDLRPCFunctionNameOnWayPointChange","abstract":"<p>Function name for an OnWayPointChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAppServiceInteraction":{"name":"SDLRPCFunctionNamePerformAppServiceInteraction","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAudioPassThru":{"name":"SDLRPCFunctionNamePerformAudioPassThru","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformInteraction":{"name":"SDLRPCFunctionNamePerformInteraction","abstract":"<p>Function name for a PerformInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePublishAppService":{"name":"SDLRPCFunctionNamePublishAppService","abstract":"<p>Function name for a PublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePutFile":{"name":"SDLRPCFunctionNamePutFile","abstract":"<p>Function name for a PutFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReadDID":{"name":"SDLRPCFunctionNameReadDID","abstract":"<p>Function name for a ReadDID RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReleaseInteriorVehicleDataModule":{"name":"SDLRPCFunctionNameReleaseInteriorVehicleDataModule","abstract":"<p>Function name for a ReleaseInteriorVehicleDataModule RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameRegisterAppInterface":{"name":"SDLRPCFunctionNameRegisterAppInterface","abstract":"<p>Function name for a RegisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReserved":{"name":"SDLRPCFunctionNameReserved","abstract":"<p>Function name for a Reserved RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameResetGlobalProperties":{"name":"SDLRPCFunctionNameResetGlobalProperties","abstract":"<p>Function name for a ResetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameScrollableMessage":{"name":"SDLRPCFunctionNameScrollableMessage","abstract":"<p>Function name for a ScrollableMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendHapticData":{"name":"SDLRPCFunctionNameSendHapticData","abstract":"<p>Function name for a SendHapticData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendLocation":{"name":"SDLRPCFunctionNameSendLocation","abstract":"<p>Function name for a SendLocation RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetAppIcon":{"name":"SDLRPCFunctionNameSetAppIcon","abstract":"<p>Function name for a SetAppIcon RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetCloudAppProperties":{"name":"SDLRPCFunctionNameSetCloudAppProperties","abstract":"<p>Function name for a SetCloudProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetDisplayLayout":{"name":"SDLRPCFunctionNameSetDisplayLayout","abstract":"<p>Function name for a SetDisplayLayout RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetGlobalProperties":{"name":"SDLRPCFunctionNameSetGlobalProperties","abstract":"<p>Function name for a SetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetInteriorVehicleData":{"name":"SDLRPCFunctionNameSetInteriorVehicleData","abstract":"<p>Function name for a SetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetMediaClockTimer":{"name":"SDLRPCFunctionNameSetMediaClockTimer","abstract":"<p>Function name for a SetMediaClockTimer RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShow":{"name":"SDLRPCFunctionNameShow","abstract":"<p>Function name for a Show RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowAppMenu":{"name":"SDLRPCFunctionNameShowAppMenu","abstract":"<p>Function name for a ShowAppMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowConstantTBT":{"name":"SDLRPCFunctionNameShowConstantTBT","abstract":"<p>Function name for a ShowConstantTBT RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSlider":{"name":"SDLRPCFunctionNameSlider","abstract":"<p>Function name for a Slider RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSpeak":{"name":"SDLRPCFunctionNameSpeak","abstract":"<p>Function name for a Speak RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeButton":{"name":"SDLRPCFunctionNameSubscribeButton","abstract":"<p>Function name for a SubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeVehicleData":{"name":"SDLRPCFunctionNameSubscribeVehicleData","abstract":"<p>Function name for a SubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeWayPoints":{"name":"SDLRPCFunctionNameSubscribeWayPoints","abstract":"<p>Function name for a SubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubtleAlert":{"name":"SDLRPCFunctionNameSubtleAlert","abstract":"<p>Function name for a SubtleAlert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSyncPData":{"name":"SDLRPCFunctionNameSyncPData","abstract":"<p>Function name for a SyncPData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSystemRequest":{"name":"SDLRPCFunctionNameSystemRequest","abstract":"<p>Function name for a SystemRequest RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnpublishAppService":{"name":"SDLRPCFunctionNameUnpublishAppService","abstract":"<p>Function name for an UnpublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnregisterAppInterface":{"name":"SDLRPCFunctionNameUnregisterAppInterface","abstract":"<p>Function name for an UnregisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeButton":{"name":"SDLRPCFunctionNameUnsubscribeButton","abstract":"<p>Function name for an UnsubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeVehicleData":{"name":"SDLRPCFunctionNameUnsubscribeVehicleData","abstract":"<p>Function name for an UnsubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints":{"name":"SDLRPCFunctionNameUnsubscribeWayPoints","abstract":"<p>Function name for an UnsubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList":{"name":"SDLRPCFunctionNameUpdateTurnList","abstract":"<p>Function name for an UpdateTurnList RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateWindow":{"name":"SDLRPCFunctionNameCreateWindow","abstract":"<p>Function name for a CreateWindow RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteWindow":{"name":"SDLRPCFunctionNameDeleteWindow","abstract":"<p>Function name for a DeleteWindow RPC</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameRequest":{"name":"SDLRPCMessageTypeNameRequest","abstract":"<p>A request that will require a response</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameResponse":{"name":"SDLRPCMessageTypeNameResponse","abstract":"<p>A response to a request</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameNotification":{"name":"SDLRPCMessageTypeNameNotification","abstract":"<p>A message that does not have a response</p>"},"Constants.html#/c:@SDLRadioBandAM":{"name":"SDLRadioBandAM","abstract":"<p>Represents AM radio band</p>"},"Constants.html#/c:@SDLRadioBandFM":{"name":"SDLRadioBandFM","abstract":"<p>Represents FM radio band</p>"},"Constants.html#/c:@SDLRadioBandXM":{"name":"SDLRadioBandXM","abstract":"<p>Represents XM radio band</p>"},"Constants.html#/c:@SDLRadioStateAcquiring":{"name":"SDLRadioStateAcquiring","abstract":"<p>Represents Radio state as ACQUIRING</p>"},"Constants.html#/c:@SDLRadioStateAcquired":{"name":"SDLRadioStateAcquired","abstract":"<p>Represents Radio state as ACQUIRED</p>"},"Constants.html#/c:@SDLRadioStateMulticast":{"name":"SDLRadioStateMulticast","abstract":"<p>Represents Radio state as MULTICAST</p>"},"Constants.html#/c:@SDLRadioStateNotFound":{"name":"SDLRadioStateNotFound","abstract":"<p>Represents Radio state as NOT_FOUND</p>"},"Constants.html#/c:@SDLRequestTypeHTTP":{"name":"SDLRequestTypeHTTP","abstract":"<p>An HTTP request</p>"},"Constants.html#/c:@SDLRequestTypeFileResume":{"name":"SDLRequestTypeFileResume","abstract":"<p>A file resumption request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationRequest":{"name":"SDLRequestTypeAuthenticationRequest","abstract":"<p>An authentication request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationChallenge":{"name":"SDLRequestTypeAuthenticationChallenge","abstract":"<p>An authentication challenge</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationAck":{"name":"SDLRequestTypeAuthenticationAck","abstract":"<p>An authentication acknowledgment</p>"},"Constants.html#/c:@SDLRequestTypeProprietary":{"name":"SDLRequestTypeProprietary","abstract":"<p>An proprietary formatted request</p>"},"Constants.html#/c:@SDLRequestTypeQueryApps":{"name":"SDLRequestTypeQueryApps","abstract":"<p>An Query Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLaunchApp":{"name":"SDLRequestTypeLaunchApp","abstract":"<p>A Launch Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLockScreenIconURL":{"name":"SDLRequestTypeLockScreenIconURL","abstract":"<p>The URL for a lock screen icon</p>"},"Constants.html#/c:@SDLRequestTypeTrafficMessageChannel":{"name":"SDLRequestTypeTrafficMessageChannel","abstract":"<p>A traffic message channel request</p>"},"Constants.html#/c:@SDLRequestTypeDriverProfile":{"name":"SDLRequestTypeDriverProfile","abstract":"<p>A driver profile request</p>"},"Constants.html#/c:@SDLRequestTypeVoiceSearch":{"name":"SDLRequestTypeVoiceSearch","abstract":"<p>A voice search request</p>"},"Constants.html#/c:@SDLRequestTypeNavigation":{"name":"SDLRequestTypeNavigation","abstract":"<p>A navigation request</p>"},"Constants.html#/c:@SDLRequestTypePhone":{"name":"SDLRequestTypePhone","abstract":"<p>A phone request</p>"},"Constants.html#/c:@SDLRequestTypeClimate":{"name":"SDLRequestTypeClimate","abstract":"<p>A climate request</p>"},"Constants.html#/c:@SDLRequestTypeSettings":{"name":"SDLRequestTypeSettings","abstract":"<p>A settings request</p>"},"Constants.html#/c:@SDLRequestTypeVehicleDiagnostics":{"name":"SDLRequestTypeVehicleDiagnostics","abstract":"<p>A vehicle diagnostics request</p>"},"Constants.html#/c:@SDLRequestTypeEmergency":{"name":"SDLRequestTypeEmergency","abstract":"<p>An emergency request</p>"},"Constants.html#/c:@SDLRequestTypeMedia":{"name":"SDLRequestTypeMedia","abstract":"<p>A media request</p>"},"Constants.html#/c:@SDLRequestTypeFOTA":{"name":"SDLRequestTypeFOTA","abstract":"<p>A firmware over-the-air request</p>"},"Constants.html#/c:@SDLRequestTypeOEMSpecific":{"name":"SDLRequestTypeOEMSpecific","abstract":"<p>A request that is OEM specific using the <code>RequestSubType</code> in SystemRequest</p>"},"Constants.html#/c:@SDLRequestTypeIconURL":{"name":"SDLRequestTypeIconURL","abstract":"<p>A request for an icon url</p>"},"Constants.html#/c:@SDLResultSuccess":{"name":"SDLResultSuccess","abstract":"<p>The request succeeded</p>"},"Constants.html#/c:@SDLResultInvalidData":{"name":"SDLResultInvalidData","abstract":"<p>The request contained invalid data</p>"},"Constants.html#/c:@SDLResultCharacterLimitExceeded":{"name":"SDLResultCharacterLimitExceeded","abstract":"<p>The request had a string containing too many characters</p>"},"Constants.html#/c:@SDLResultUnsupportedRequest":{"name":"SDLResultUnsupportedRequest","abstract":"<p>The request is not supported by the IVI unit implementing SDL</p>"},"Constants.html#/c:@SDLResultOutOfMemory":{"name":"SDLResultOutOfMemory","abstract":"<p>The system could not process the request because the necessary memory couldn&rsquo;t be allocated</p>"},"Constants.html#/c:@SDLResultTooManyPendingRequests":{"name":"SDLResultTooManyPendingRequests","abstract":"<p>There are too many requests pending (means that the response has not been delivered yet).</p>"},"Constants.html#/c:@SDLResultInvalidId":{"name":"SDLResultInvalidId","abstract":"<p>One of the provided IDs is not valid.</p>"},"Constants.html#/c:@SDLResultDuplicateName":{"name":"SDLResultDuplicateName","abstract":"<p>The provided name or synonym is a duplicate of some already-defined name or synonym.</p>"},"Constants.html#/c:@SDLResultTooManyApplications":{"name":"SDLResultTooManyApplications","abstract":"<p>There are already too many registered applications.</p>"},"Constants.html#/c:@SDLResultApplicationRegisteredAlready":{"name":"SDLResultApplicationRegisteredAlready","abstract":"<p>RegisterAppInterface has been called, but this app is already registered</p>"},"Constants.html#/c:@SDLResultUnsupportedVersion":{"name":"SDLResultUnsupportedVersion","abstract":"<p>The Head Unit doesn&rsquo;t support the SDL version that is requested by the mobile application.</p>"},"Constants.html#/c:@SDLResultWrongLanguage":{"name":"SDLResultWrongLanguage","abstract":"<p>The requested language is currently not supported. This might be because of a mismatch of the currently active language on the head unit and the requested language.</p>"},"Constants.html#/c:@SDLResultApplicationNotRegistered":{"name":"SDLResultApplicationNotRegistered","abstract":"<p>A command can not be executed because no application has been registered with RegisterApplication.</p>"},"Constants.html#/c:@SDLResultInUse":{"name":"SDLResultInUse","abstract":"<p>The data may not be changed, because it is currently in use. For example when trying to delete a choice set that is currently involved in an interaction.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAllowed":{"name":"SDLResultVehicleDataNotAllowed","abstract":"<p>The user has turned off access to vehicle data, and it is globally unavailable to mobile applications.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAvailable":{"name":"SDLResultVehicleDataNotAvailable","abstract":"<p>The requested vehicle data is not available on this vehicle or is not published.</p>"},"Constants.html#/c:@SDLResultRejected":{"name":"SDLResultRejected","abstract":"<p>The requested command was rejected, e.g. because the mobile app is in background and cannot perform any HMI commands, or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is playing.</p>"},"Constants.html#/c:@SDLResultAborted":{"name":"SDLResultAborted","abstract":"<p>A command was aborted, e.g. due to user interaction (user pressed button), or an HMI command (e.g. Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested.</p>"},"Constants.html#/c:@SDLResultIgnored":{"name":"SDLResultIgnored","abstract":"<p>A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was used to pause the media clock although the clock is paused already.</p>"},"Constants.html#/c:@SDLResultUnsupportedResource":{"name":"SDLResultUnsupportedResource","abstract":"<p>A button that was requested for subscription is not supported under the current system.</p>"},"Constants.html#/c:@SDLResultFileNotFound":{"name":"SDLResultFileNotFound","abstract":"<p>A specified file could not be found on the head unit.</p>"},"Constants.html#/c:@SDLResultGenericError":{"name":"SDLResultGenericError","abstract":"<p>Provided data is valid but something went wrong in the lower layers.</p>"},"Constants.html#/c:@SDLResultDisallowed":{"name":"SDLResultDisallowed","abstract":"<p>RPC is not authorized in local policy table.</p>"},"Constants.html#/c:@SDLResultUserDisallowed":{"name":"SDLResultUserDisallowed","abstract":"<p>RPC is included in a functional group explicitly blocked by the user.</p>"},"Constants.html#/c:@SDLResultTimedOut":{"name":"SDLResultTimedOut","abstract":"<p>Overlay reached the maximum timeout and closed.</p>"},"Constants.html#/c:@SDLResultCancelRoute":{"name":"SDLResultCancelRoute","abstract":"<p>User selected to Cancel Route.</p>"},"Constants.html#/c:@SDLResultCorruptedData":{"name":"SDLResultCorruptedData","abstract":"<p>The data sent failed to pass CRC check in receiver end.</p>"},"Constants.html#/c:@SDLResultTruncatedData":{"name":"SDLResultTruncatedData","abstract":"<p>The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, only part of the data is available.</p>"},"Constants.html#/c:@SDLResultRetry":{"name":"SDLResultRetry","abstract":"<p>The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue the new RPC.</p>"},"Constants.html#/c:@SDLResultWarnings":{"name":"SDLResultWarnings","abstract":"<p>The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure.</p>"},"Constants.html#/c:@SDLResultSaved":{"name":"SDLResultSaved","abstract":"<p>The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value.</p>"},"Constants.html#/c:@SDLResultInvalidCertificate":{"name":"SDLResultInvalidCertificate","abstract":"<p>The certificate provided during authentication is invalid.</p>"},"Constants.html#/c:@SDLResultExpiredCertificate":{"name":"SDLResultExpiredCertificate","abstract":"<p>The certificate provided during authentication is expired.</p>"},"Constants.html#/c:@SDLResultResumeFailed":{"name":"SDLResultResumeFailed","abstract":"<p>The provided hash ID does not match the hash of the current set of registered data or the core could not resume the previous data.</p>"},"Constants.html#/c:@SDLResultDataNotAvailable":{"name":"SDLResultDataNotAvailable","abstract":"<p>The requested data is not available on this vehicle or is not published for the connected app.</p>"},"Constants.html#/c:@SDLResultReadOnly":{"name":"SDLResultReadOnly","abstract":"<p>The requested data is read only thus cannot be change via remote control .</p>"},"Constants.html#/c:@SDLResultEncryptionNeeded":{"name":"SDLResultEncryptionNeeded","abstract":"<p>The RPC request needs to be encrypted.</p>"},"Constants.html#/c:@SDLSamplingRate8KHZ":{"name":"SDLSamplingRate8KHZ","abstract":"<p>Sampling rate of 8 kHz</p>"},"Constants.html#/c:@SDLSamplingRate16KHZ":{"name":"SDLSamplingRate16KHZ","abstract":"<p>Sampling rate of 16 kHz</p>"},"Constants.html#/c:@SDLSamplingRate22KHZ":{"name":"SDLSamplingRate22KHZ","abstract":"<p>Sampling rate of 22 kHz</p>"},"Constants.html#/c:@SDLSamplingRate44KHZ":{"name":"SDLSamplingRate44KHZ","abstract":"<p>Sampling rate of 44 kHz</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeSave":{"name":"SDLSeatMemoryActionTypeSave","abstract":"<p>@abstract Save current seat postions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeRestore":{"name":"SDLSeatMemoryActionTypeRestore","abstract":"<p>@abstract Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeNone":{"name":"SDLSeatMemoryActionTypeNone","abstract":"<p>@abstract No action to be performed.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonPublished":{"name":"SDLServiceUpdateReasonPublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdatePublished":{"name":"SDLServiceUpdatePublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonRemoved":{"name":"SDLServiceUpdateReasonRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonActivated":{"name":"SDLServiceUpdateReasonActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateActivated":{"name":"SDLServiceUpdateActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonDeactivated":{"name":"SDLServiceUpdateReasonDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonManifestUpdate":{"name":"SDLServiceUpdateReasonManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLServiceUpdateManifestUpdate":{"name":"SDLServiceUpdateManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLSoftButtonTypeText":{"name":"SDLSoftButtonTypeText","abstract":"<p>Text kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeImage":{"name":"SDLSoftButtonTypeImage","abstract":"<p>Image kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeBoth":{"name":"SDLSoftButtonTypeBoth","abstract":"<p>Both (Text &amp; Image) kind Softbutton</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesText":{"name":"SDLSpeechCapabilitiesText","abstract":"<p>The SDL platform can speak text phrases.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSAPIPhonemes":{"name":"SDLSpeechCapabilitiesSAPIPhonemes","abstract":"<p>The SDL platform can speak SAPI Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesLHPlusPhonemes":{"name":"SDLSpeechCapabilitiesLHPlusPhonemes","abstract":"<p>The SDL platform can speak LHPlus Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesPrerecorded":{"name":"SDLSpeechCapabilitiesPrerecorded","abstract":"<p>The SDL platform can speak Prerecorded indicators and prompts.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSilence":{"name":"SDLSpeechCapabilitiesSilence","abstract":"<p>The SDL platform can speak Silence.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesFile":{"name":"SDLSpeechCapabilitiesFile","abstract":"<p>The SDL platform can play a file</p>"},"Constants.html#/c:@SDLStaticIconNameAcceptCall":{"name":"SDLStaticIconNameAcceptCall","abstract":"<p>Static icon accept call / active phone call in progress / initiate a phone call</p>"},"Constants.html#/c:@SDLStaticIconNameAddWaypoint":{"name":"SDLStaticIconNameAddWaypoint","abstract":"<p>Static icon add waypoint</p>"},"Constants.html#/c:@SDLStaticIconNameAlbum":{"name":"SDLStaticIconNameAlbum","abstract":"<p>Static icon album</p>"},"Constants.html#/c:@SDLStaticIconNameAmbientLighting":{"name":"SDLStaticIconNameAmbientLighting","abstract":"<p>Static icon ambient lighting</p>"},"Constants.html#/c:@SDLStaticIconNameArrowNorth":{"name":"SDLStaticIconNameArrowNorth","abstract":"<p>Static icon arrow - north</p>"},"Constants.html#/c:@SDLStaticIconNameAudioMute":{"name":"SDLStaticIconNameAudioMute","abstract":"<p>Static icon audio mute</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookEpisode":{"name":"SDLStaticIconNameAudiobookEpisode","abstract":"<p>Static icon audiobook episode</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookNarrator":{"name":"SDLStaticIconNameAudiobookNarrator","abstract":"<p>Static icon audiobook narrator</p>"},"Constants.html#/c:@SDLStaticIconNameAuxillaryAudio":{"name":"SDLStaticIconNameAuxillaryAudio","abstract":"<p>Static icon auxillary audio</p>"},"Constants.html#/c:@SDLStaticIconNameBack":{"name":"SDLStaticIconNameBack","abstract":"<p>Static icon back / return</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity0Of5":{"name":"SDLStaticIconNameBatteryCapacity0Of5","abstract":"<p>Static icon battery capacity 0 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity1Of5":{"name":"SDLStaticIconNameBatteryCapacity1Of5","abstract":"<p>Static icon battery capacity 1 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity2Of5":{"name":"SDLStaticIconNameBatteryCapacity2Of5","abstract":"<p>Static icon battery capacity 2 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity3Of5":{"name":"SDLStaticIconNameBatteryCapacity3Of5","abstract":"<p>Static icon battery capacity 3 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity4Of5":{"name":"SDLStaticIconNameBatteryCapacity4Of5","abstract":"<p>Static icon battery capacity 4 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity5Of5":{"name":"SDLStaticIconNameBatteryCapacity5Of5","abstract":"<p>Static icon battery capacity 5 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBluetoothAudioSource":{"name":"SDLStaticIconNameBluetoothAudioSource","abstract":"<p>Static icon bluetooth audio source</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth1":{"name":"SDLStaticIconNameBluetooth1","abstract":"<p>Static icon bluetooth1</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth2":{"name":"SDLStaticIconNameBluetooth2","abstract":"<p>Static icon bluetooth2</p>"},"Constants.html#/c:@SDLStaticIconNameBrowse":{"name":"SDLStaticIconNameBrowse","abstract":"<p>Static icon browse</p>"},"Constants.html#/c:@SDLStaticIconNameCellPhoneInRoamingMode":{"name":"SDLStaticIconNameCellPhoneInRoamingMode","abstract":"<p>Static icon cell phone in roaming mode</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength0Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength0Of5Bars","abstract":"<p>Static icon cell service signal strength 0 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength1Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength1Of5Bars","abstract":"<p>Static icon cell service signal strength 1 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength2Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength2Of5Bars","abstract":"<p>Static icon cell service signal strength 2 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength3Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength3Of5Bars","abstract":"<p>Static icon cell service signal strength 3 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength4Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength4Of5Bars","abstract":"<p>Static icon cell service signal strength 4 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength5Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength5Of5Bars","abstract":"<p>Static icon cell service signal strength 5 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneLeft":{"name":"SDLStaticIconNameChangeLaneLeft","abstract":"<p>Static icon change lane left</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneRight":{"name":"SDLStaticIconNameChangeLaneRight","abstract":"<p>Static icon change lane right</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxChecked":{"name":"SDLStaticIconNameCheckBoxChecked","abstract":"<p>Static icon check box checked</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxUnchecked":{"name":"SDLStaticIconNameCheckBoxUnchecked","abstract":"<p>Static icon check box unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameClimate":{"name":"SDLStaticIconNameClimate","abstract":"<p>Static icon climate</p>"},"Constants.html#/c:@SDLStaticIconNameClock":{"name":"SDLStaticIconNameClock","abstract":"<p>Static icon clock</p>"},"Constants.html#/c:@SDLStaticIconNameCompose":{"name":"SDLStaticIconNameCompose","abstract":"<p>Static icon compose (e.g. message)</p>"},"Constants.html#/c:@SDLStaticIconNameContact":{"name":"SDLStaticIconNameContact","abstract":"<p>Static icon contact / person</p>"},"Constants.html#/c:@SDLStaticIconNameContinue":{"name":"SDLStaticIconNameContinue","abstract":"<p>Static icon continue</p>"},"Constants.html#/c:@SDLStaticIconNameDash":{"name":"SDLStaticIconNameDash","abstract":"<p>Static icon dash / bullet point</p>"},"Constants.html#/c:@SDLStaticIconNameDate":{"name":"SDLStaticIconNameDate","abstract":"<p>Static icon date / calendar</p>"},"Constants.html#/c:@SDLStaticIconNameDelete":{"name":"SDLStaticIconNameDelete","abstract":"<p>Static icon delete/remove - trash</p>"},"Constants.html#/c:@SDLStaticIconNameDestination":{"name":"SDLStaticIconNameDestination","abstract":"<p>Static icon destination</p>"},"Constants.html#/c:@SDLStaticIconNameDestinationFerryAhead":{"name":"SDLStaticIconNameDestinationFerryAhead","abstract":"<p>Static icon destination ferry ahead</p>"},"Constants.html#/c:@SDLStaticIconNameEbookmark":{"name":"SDLStaticIconNameEbookmark","abstract":"<p>Static icon ebookmark (e.g. message, feed)</p>"},"Constants.html#/c:@SDLStaticIconNameEmpty":{"name":"SDLStaticIconNameEmpty","abstract":"<p>Static icon empty (i.e. no image)</p>"},"Constants.html#/c:@SDLStaticIconNameEndCall":{"name":"SDLStaticIconNameEndCall","abstract":"<p>Static icon end call / reject call</p>"},"Constants.html#/c:@SDLStaticIconNameFail":{"name":"SDLStaticIconNameFail","abstract":"<p>Static icon fail / X</p>"},"Constants.html#/c:@SDLStaticIconNameFastForward30Secs":{"name":"SDLStaticIconNameFastForward30Secs","abstract":"<p>Static icon fast forward 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteHeart":{"name":"SDLStaticIconNameFavoriteHeart","abstract":"<p>Static icon favorite / heart</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteStar":{"name":"SDLStaticIconNameFavoriteStar","abstract":"<p>Static icon favorite / star</p>"},"Constants.html#/c:@SDLStaticIconNameFaxNumber":{"name":"SDLStaticIconNameFaxNumber","abstract":"<p>Static icon fax number</p>"},"Constants.html#/c:@SDLStaticIconNameFilename":{"name":"SDLStaticIconNameFilename","abstract":"<p>Static icon filename</p>"},"Constants.html#/c:@SDLStaticIconNameFilter":{"name":"SDLStaticIconNameFilter","abstract":"<p>Static icon filter / search</p>"},"Constants.html#/c:@SDLStaticIconNameFolder":{"name":"SDLStaticIconNameFolder","abstract":"<p>Static icon folder</p>"},"Constants.html#/c:@SDLStaticIconNameFuelPrices":{"name":"SDLStaticIconNameFuelPrices","abstract":"<p>Static icon fuel prices</p>"},"Constants.html#/c:@SDLStaticIconNameFullMap":{"name":"SDLStaticIconNameFullMap","abstract":"<p>Static icon full map</p>"},"Constants.html#/c:@SDLStaticIconNameGenericPhoneNumber":{"name":"SDLStaticIconNameGenericPhoneNumber","abstract":"<p>Static icon generic phone number</p>"},"Constants.html#/c:@SDLStaticIconNameGenre":{"name":"SDLStaticIconNameGenre","abstract":"<p>Static icon genre</p>"},"Constants.html#/c:@SDLStaticIconNameGlobalKeyboard":{"name":"SDLStaticIconNameGlobalKeyboard","abstract":"<p>Static icon global keyboard</p>"},"Constants.html#/c:@SDLStaticIconNameHighwayExitInformation":{"name":"SDLStaticIconNameHighwayExitInformation","abstract":"<p>Static icon highway exit information</p>"},"Constants.html#/c:@SDLStaticIconNameHomePhoneNumber":{"name":"SDLStaticIconNameHomePhoneNumber","abstract":"<p>Static icon home phone number</p>"},"Constants.html#/c:@SDLStaticIconNameHyperlink":{"name":"SDLStaticIconNameHyperlink","abstract":"<p>Static icon hyperlink</p>"},"Constants.html#/c:@SDLStaticIconNameID3TagUnknown":{"name":"SDLStaticIconNameID3TagUnknown","abstract":"<p>Static icon ID3 tag unknown</p>"},"Constants.html#/c:@SDLStaticIconNameIncomingCalls":{"name":"SDLStaticIconNameIncomingCalls","abstract":"<p>Static icon incoming calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameInformation":{"name":"SDLStaticIconNameInformation","abstract":"<p>Static icon information</p>"},"Constants.html#/c:@SDLStaticIconNameIPodMediaSource":{"name":"SDLStaticIconNameIPodMediaSource","abstract":"<p>Static icon IPOD media source</p>"},"Constants.html#/c:@SDLStaticIconNameJoinCalls":{"name":"SDLStaticIconNameJoinCalls","abstract":"<p>Static icon join calls</p>"},"Constants.html#/c:@SDLStaticIconNameKeepLeft":{"name":"SDLStaticIconNameKeepLeft","abstract":"<p>Static icon keep left</p>"},"Constants.html#/c:@SDLStaticIconNameKeepRight":{"name":"SDLStaticIconNameKeepRight","abstract":"<p>Static icon keep right</p>"},"Constants.html#/c:@SDLStaticIconNameKey":{"name":"SDLStaticIconNameKey","abstract":"<p>Static icon key / keycode</p>"},"Constants.html#/c:@SDLStaticIconNameLeft":{"name":"SDLStaticIconNameLeft","abstract":"<p>Static icon left</p>"},"Constants.html#/c:@SDLStaticIconNameLeftArrow":{"name":"SDLStaticIconNameLeftArrow","abstract":"<p>Static icon left arrow / back</p>"},"Constants.html#/c:@SDLStaticIconNameLeftExit":{"name":"SDLStaticIconNameLeftExit","abstract":"<p>Static icon left exit</p>"},"Constants.html#/c:@SDLStaticIconNameLineInAudioSource":{"name":"SDLStaticIconNameLineInAudioSource","abstract":"<p>Static icon LINE IN audio source</p>"},"Constants.html#/c:@SDLStaticIconNameLocked":{"name":"SDLStaticIconNameLocked","abstract":"<p>Static icon locked</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlLeftArrow":{"name":"SDLStaticIconNameMediaControlLeftArrow","abstract":"<p>Static icon media control - left arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRecording":{"name":"SDLStaticIconNameMediaControlRecording","abstract":"<p>Static icon media control - recording</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRightArrow":{"name":"SDLStaticIconNameMediaControlRightArrow","abstract":"<p>Static icon media control - right arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlStop":{"name":"SDLStaticIconNameMediaControlStop","abstract":"<p>Static icon media control - stop (e.g. streaming)</p>"},"Constants.html#/c:@SDLStaticIconNameMicrophone":{"name":"SDLStaticIconNameMicrophone","abstract":"<p>Static icon microphone</p>"},"Constants.html#/c:@SDLStaticIconNameMissedCalls":{"name":"SDLStaticIconNameMissedCalls","abstract":"<p>Static icon missed calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameMobilePhoneNumber":{"name":"SDLStaticIconNameMobilePhoneNumber","abstract":"<p>Static icon mobile phone number</p>"},"Constants.html#/c:@SDLStaticIconNameMoveDown":{"name":"SDLStaticIconNameMoveDown","abstract":"<p>Static icon move down / download</p>"},"Constants.html#/c:@SDLStaticIconNameMoveUp":{"name":"SDLStaticIconNameMoveUp","abstract":"<p>Static icon move up</p>"},"Constants.html#/c:@SDLStaticIconNameMP3TagArtist":{"name":"SDLStaticIconNameMP3TagArtist","abstract":"<p>Static icon MP3 tag artist</p>"},"Constants.html#/c:@SDLStaticIconNameNavigation":{"name":"SDLStaticIconNameNavigation","abstract":"<p>Static icon navigation / navigation settings</p>"},"Constants.html#/c:@SDLStaticIconNameNavigationCurrentDirection":{"name":"SDLStaticIconNameNavigationCurrentDirection","abstract":"<p>Static icon navigation current direction</p>"},"Constants.html#/c:@SDLStaticIconNameNegativeRatingThumbsDown":{"name":"SDLStaticIconNameNegativeRatingThumbsDown","abstract":"<p>Static icon negative rating - thumbs down</p>"},"Constants.html#/c:@SDLStaticIconNameNew":{"name":"SDLStaticIconNameNew","abstract":"<p>Static icon new/unread text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOfficePhoneNumber":{"name":"SDLStaticIconNameOfficePhoneNumber","abstract":"<p>Static icon office phone number / work phone number</p>"},"Constants.html#/c:@SDLStaticIconNameOpened":{"name":"SDLStaticIconNameOpened","abstract":"<p>Static icon opened/read text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOrigin":{"name":"SDLStaticIconNameOrigin","abstract":"<p>Static icon origin / nearby locale / current position</p>"},"Constants.html#/c:@SDLStaticIconNameOutgoingCalls":{"name":"SDLStaticIconNameOutgoingCalls","abstract":"<p>Static icon outgoing calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNamePause":{"name":"SDLStaticIconNamePause","abstract":"<p>Static icon play / pause - pause active</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall1":{"name":"SDLStaticIconNamePhoneCall1","abstract":"<p>Static icon phone call 1</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall2":{"name":"SDLStaticIconNamePhoneCall2","abstract":"<p>Static icon phone call 2</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneDevice":{"name":"SDLStaticIconNamePhoneDevice","abstract":"<p>Static icon phone device</p>"},"Constants.html#/c:@SDLStaticIconNamePhonebook":{"name":"SDLStaticIconNamePhonebook","abstract":"<p>Static icon phonebook</p>"},"Constants.html#/c:@SDLStaticIconNamePhoto":{"name":"SDLStaticIconNamePhoto","abstract":"<p>Static icon photo / picture</p>"},"Constants.html#/c:@SDLStaticIconNamePlay":{"name":"SDLStaticIconNamePlay","abstract":"<p>Static icon play / pause - play active</p>"},"Constants.html#/c:@SDLStaticIconNamePlaylist":{"name":"SDLStaticIconNamePlaylist","abstract":"<p>Static icon playlist</p>"},"Constants.html#/c:@SDLStaticIconNamePopUp":{"name":"SDLStaticIconNamePopUp","abstract":"<p>Static icon pop-up</p>"},"Constants.html#/c:@SDLStaticIconNamePositiveRatingThumbsUp":{"name":"SDLStaticIconNamePositiveRatingThumbsUp","abstract":"<p>Static icon positive rating - thumbs up</p>"},"Constants.html#/c:@SDLStaticIconNamePower":{"name":"SDLStaticIconNamePower","abstract":"<p>Static icon power</p>"},"Constants.html#/c:@SDLStaticIconNamePrimaryPhone":{"name":"SDLStaticIconNamePrimaryPhone","abstract":"<p>Static icon primary phone (favorite)</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonChecked":{"name":"SDLStaticIconNameRadioButtonChecked","abstract":"<p>Static icon radio button checked</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonUnchecked":{"name":"SDLStaticIconNameRadioButtonUnchecked","abstract":"<p>Static icon radio button unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameRecentCalls":{"name":"SDLStaticIconNameRecentCalls","abstract":"<p>Static icon recent calls / history</p>"},"Constants.html#/c:@SDLStaticIconNameRecentDestinations":{"name":"SDLStaticIconNameRecentDestinations","abstract":"<p>Static icon recent destinations</p>"},"Constants.html#/c:@SDLStaticIconNameRedo":{"name":"SDLStaticIconNameRedo","abstract":"<p>Static icon redo</p>"},"Constants.html#/c:@SDLStaticIconNameRefresh":{"name":"SDLStaticIconNameRefresh","abstract":"<p>Static icon refresh</p>"},"Constants.html#/c:@SDLStaticIconNameRemoteDiagnosticsCheckEngine":{"name":"SDLStaticIconNameRemoteDiagnosticsCheckEngine","abstract":"<p>Static icon remote diagnostics - check engine</p>"},"Constants.html#/c:@SDLStaticIconNameRendered911Assist":{"name":"SDLStaticIconNameRendered911Assist","abstract":"<p>Static icon rendered 911 assist / emergency assistance</p>"},"Constants.html#/c:@SDLStaticIconNameRepeat":{"name":"SDLStaticIconNameRepeat","abstract":"<p>Static icon repeat</p>"},"Constants.html#/c:@SDLStaticIconNameRepeatPlay":{"name":"SDLStaticIconNameRepeatPlay","abstract":"<p>Static icon repeat play</p>"},"Constants.html#/c:@SDLStaticIconNameReply":{"name":"SDLStaticIconNameReply","abstract":"<p>Static icon reply</p>"},"Constants.html#/c:@SDLStaticIconNameRewind30Secs":{"name":"SDLStaticIconNameRewind30Secs","abstract":"<p>Static icon rewind 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameRight":{"name":"SDLStaticIconNameRight","abstract":"<p>Static icon right</p>"},"Constants.html#/c:@SDLStaticIconNameRightExit":{"name":"SDLStaticIconNameRightExit","abstract":"<p>Static icon right exit</p>"},"Constants.html#/c:@SDLStaticIconNameRingtones":{"name":"SDLStaticIconNameRingtones","abstract":"<p>Static icon ringtones</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand1":{"name":"SDLStaticIconNameRoundaboutLeftHand1","abstract":"<p>Static icon roundabout left hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand2":{"name":"SDLStaticIconNameRoundaboutLeftHand2","abstract":"<p>Static icon roundabout left hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand3":{"name":"SDLStaticIconNameRoundaboutLeftHand3","abstract":"<p>Static icon roundabout left hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand4":{"name":"SDLStaticIconNameRoundaboutLeftHand4","abstract":"<p>Static icon roundabout left hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand5":{"name":"SDLStaticIconNameRoundaboutLeftHand5","abstract":"<p>Static icon roundabout left hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand6":{"name":"SDLStaticIconNameRoundaboutLeftHand6","abstract":"<p>Static icon roundabout left hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand7":{"name":"SDLStaticIconNameRoundaboutLeftHand7","abstract":"<p>Static icon roundabout left hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand1":{"name":"SDLStaticIconNameRoundaboutRightHand1","abstract":"<p>Static icon roundabout right hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand2":{"name":"SDLStaticIconNameRoundaboutRightHand2","abstract":"<p>Static icon roundabout right hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand3":{"name":"SDLStaticIconNameRoundaboutRightHand3","abstract":"<p>Static icon roundabout right hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand4":{"name":"SDLStaticIconNameRoundaboutRightHand4","abstract":"<p>Static icon roundabout right hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand5":{"name":"SDLStaticIconNameRoundaboutRightHand5","abstract":"<p>Static icon roundabout right hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand6":{"name":"SDLStaticIconNameRoundaboutRightHand6","abstract":"<p>Static icon roundabout right hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand7":{"name":"SDLStaticIconNameRoundaboutRightHand7","abstract":"<p>Static icon roundabout right hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRSS":{"name":"SDLStaticIconNameRSS","abstract":"<p>Static icon RSS</p>"},"Constants.html#/c:@SDLStaticIconNameSettings":{"name":"SDLStaticIconNameSettings","abstract":"<p>Static icon settings / menu</p>"},"Constants.html#/c:@SDLStaticIconNameSharpLeft":{"name":"SDLStaticIconNameSharpLeft","abstract":"<p>Static icon sharp left</p>"},"Constants.html#/c:@SDLStaticIconNameSharpRight":{"name":"SDLStaticIconNameSharpRight","abstract":"<p>Static icon sharp right</p>"},"Constants.html#/c:@SDLStaticIconNameShow":{"name":"SDLStaticIconNameShow","abstract":"<p>Static icon show</p>"},"Constants.html#/c:@SDLStaticIconNameShufflePlay":{"name":"SDLStaticIconNameShufflePlay","abstract":"<p>Static icon shuffle play</p>"},"Constants.html#/c:@SDLStaticIconNameSkiPlaces":{"name":"SDLStaticIconNameSkiPlaces","abstract":"<p>Static icon ski places / elevation / altitude</p>"},"Constants.html#/c:@SDLStaticIconNameSlightLeft":{"name":"SDLStaticIconNameSlightLeft","abstract":"<p>Static icon slight left</p>"},"Constants.html#/c:@SDLStaticIconNameSlightRight":{"name":"SDLStaticIconNameSlightRight","abstract":"<p>Static icon slight right</p>"},"Constants.html#/c:@SDLStaticIconNameSmartphone":{"name":"SDLStaticIconNameSmartphone","abstract":"<p>Static icon smartphone</p>"},"Constants.html#/c:@SDLStaticIconNameSortList":{"name":"SDLStaticIconNameSortList","abstract":"<p>Static icon sort list</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber0":{"name":"SDLStaticIconNameSpeedDialNumbersNumber0","abstract":"<p>Static icon speed dial numbers - number 0</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber1":{"name":"SDLStaticIconNameSpeedDialNumbersNumber1","abstract":"<p>Static icon speed dial numbers - number 1</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber2":{"name":"SDLStaticIconNameSpeedDialNumbersNumber2","abstract":"<p>Static icon speed dial numbers - number 2</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber3":{"name":"SDLStaticIconNameSpeedDialNumbersNumber3","abstract":"<p>Static icon speed dial numbers - number 3</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber4":{"name":"SDLStaticIconNameSpeedDialNumbersNumber4","abstract":"<p>Static icon speed dial numbers - number 4</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber5":{"name":"SDLStaticIconNameSpeedDialNumbersNumber5","abstract":"<p>Static icon speed dial numbers - number 5</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber6":{"name":"SDLStaticIconNameSpeedDialNumbersNumber6","abstract":"<p>Static icon speed dial numbers - number 6</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber7":{"name":"SDLStaticIconNameSpeedDialNumbersNumber7","abstract":"<p>Static icon speed dial numbers - number 7</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber8":{"name":"SDLStaticIconNameSpeedDialNumbersNumber8","abstract":"<p>Static icon speed dial numbers - number 8</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber9":{"name":"SDLStaticIconNameSpeedDialNumbersNumber9","abstract":"<p>Static icon speed dial numbers - number 9</p>"},"Constants.html#/c:@SDLStaticIconNameSuccess":{"name":"SDLStaticIconNameSuccess","abstract":"<p>Static icon success / check</p>"},"Constants.html#/c:@SDLStaticIconNameTrackTitle":{"name":"SDLStaticIconNameTrackTitle","abstract":"<p>Static icon track title / song title</p>"},"Constants.html#/c:@SDLStaticIconNameTrafficReport":{"name":"SDLStaticIconNameTrafficReport","abstract":"<p>Static icon traffic report</p>"},"Constants.html#/c:@SDLStaticIconNameTurnList":{"name":"SDLStaticIconNameTurnList","abstract":"<p>Static icon turn list</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnLeftTraffic":{"name":"SDLStaticIconNameUTurnLeftTraffic","abstract":"<p>Static icon u-turn left traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnRightTraffic":{"name":"SDLStaticIconNameUTurnRightTraffic","abstract":"<p>Static icon u-turn right traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUndo":{"name":"SDLStaticIconNameUndo","abstract":"<p>Static icon undo</p>"},"Constants.html#/c:@SDLStaticIconNameUnlocked":{"name":"SDLStaticIconNameUnlocked","abstract":"<p>Static icon unlocked</p>"},"Constants.html#/c:@SDLStaticIconNameUSBMediaAudioSource":{"name":"SDLStaticIconNameUSBMediaAudioSource","abstract":"<p>Static icon USB media audio source</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo1":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo1","abstract":"<p>Static icon voice control scrollbar - list item no. 1</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo2":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo2","abstract":"<p>Static icon voice control scrollbar - list item no. 2</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo3":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo3","abstract":"<p>Static icon voice control scrollbar - list item no. 3</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo4":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo4","abstract":"<p>Static icon voice control scrollbar - list item no. 4</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionFailed":{"name":"SDLStaticIconNameVoiceRecognitionFailed","abstract":"<p>Static icon voice recognition - failed</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionPause":{"name":"SDLStaticIconNameVoiceRecognitionPause","abstract":"<p>Static icon voice recognition - pause</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSuccessful":{"name":"SDLStaticIconNameVoiceRecognitionSuccessful","abstract":"<p>Static icon voice recognition - successful</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemActive":{"name":"SDLStaticIconNameVoiceRecognitionSystemActive","abstract":"<p>Static icon voice recognition - system active</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemListening":{"name":"SDLStaticIconNameVoiceRecognitionSystemListening","abstract":"<p>Static icon voice recognition - system listening</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionTryAgain":{"name":"SDLStaticIconNameVoiceRecognitionTryAgain","abstract":"<p>Static icon voice recognition - try again</p>"},"Constants.html#/c:@SDLStaticIconNameWarning":{"name":"SDLStaticIconNameWarning","abstract":"<p>Static icon warning / safety alert</p>"},"Constants.html#/c:@SDLStaticIconNameWeather":{"name":"SDLStaticIconNameWeather","abstract":"<p>Static icon weather</p>"},"Constants.html#/c:@SDLStaticIconNameWifiFull":{"name":"SDLStaticIconNameWifiFull","abstract":"<p>Static icon wifi full</p>"},"Constants.html#/c:@SDLStaticIconNameZoomIn":{"name":"SDLStaticIconNameZoomIn","abstract":"<p>Static icon zoom in</p>"},"Constants.html#/c:@SDLStaticIconNameZoomOut":{"name":"SDLStaticIconNameZoomOut","abstract":"<p>Static icon zoom out</p>"},"Constants.html#/c:@SDLVideoStreamDidStartNotification":{"name":"SDLVideoStreamDidStartNotification","abstract":"<p>Name of video stream start notification</p>"},"Constants.html#/c:@SDLVideoStreamDidStopNotification":{"name":"SDLVideoStreamDidStopNotification","abstract":"<p>Name of video stream stop notification</p>"},"Constants.html#/c:@SDLVideoStreamSuspendedNotification":{"name":"SDLVideoStreamSuspendedNotification","abstract":"<p>Name of video stream suspended notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStartNotification":{"name":"SDLAudioStreamDidStartNotification","abstract":"<p>Name of audio stream start notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStopNotification":{"name":"SDLAudioStreamDidStopNotification","abstract":"<p>Name of audio stream stop notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillPresentLockScreenViewController":{"name":"SDLLockScreenManagerWillPresentLockScreenViewController","abstract":"<p>Lockscreen will present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidPresentLockScreenViewController":{"name":"SDLLockScreenManagerDidPresentLockScreenViewController","abstract":"<p>Lockscreen did present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillDismissLockScreenViewController":{"name":"SDLLockScreenManagerWillDismissLockScreenViewController","abstract":"<p>Lockscreen will dismiss notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidDismissLockScreenViewController":{"name":"SDLLockScreenManagerDidDismissLockScreenViewController","abstract":"<p>Lockscreen did dismiss notification</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStopped":{"name":"SDLVideoStreamManagerStateStopped","abstract":"<p>Streaming state stopped</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStarting":{"name":"SDLVideoStreamManagerStateStarting","abstract":"<p>Streaming state starting</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateReady":{"name":"SDLVideoStreamManagerStateReady","abstract":"<p>Streaming state ready</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateSuspended":{"name":"SDLVideoStreamManagerStateSuspended","abstract":"<p>Streaming state suspended</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateShuttingDown":{"name":"SDLVideoStreamManagerStateShuttingDown","abstract":"<p>Streaming state shutting down</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStopped":{"name":"SDLAudioStreamManagerStateStopped","abstract":"<p>Audio state stopped</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStarting":{"name":"SDLAudioStreamManagerStateStarting","abstract":"<p>Audio state starting</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateReady":{"name":"SDLAudioStreamManagerStateReady","abstract":"<p>Audio state ready</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateShuttingDown":{"name":"SDLAudioStreamManagerStateShuttingDown","abstract":"<p>Audio state shutting down</p>"},"Constants.html#/c:@SDLAppStateInactive":{"name":"SDLAppStateInactive","abstract":"<p>App state inactive</p>"},"Constants.html#/c:@SDLAppStateActive":{"name":"SDLAppStateActive","abstract":"<p>App state active</p>"},"Constants.html#/c:@SDLSupportedSeatDriver":{"name":"SDLSupportedSeatDriver","abstract":"<p>Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSupportedSeatFrontPassenger":{"name":"SDLSupportedSeatFrontPassenger","abstract":"<p>Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSystemActionDefaultAction":{"name":"SDLSystemActionDefaultAction","abstract":"<p>A default soft button action</p>"},"Constants.html#/c:@SDLSystemActionStealFocus":{"name":"SDLSystemActionStealFocus","abstract":"<p>An action causing your app to steal HMI focus</p>"},"Constants.html#/c:@SDLSystemActionKeepContext":{"name":"SDLSystemActionKeepContext","abstract":"<p>An action causing you to keep context</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeAppServices":{"name":"SDLSystemCapabilityTypeAppServices","abstract":"<p>The app services capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeNavigation":{"name":"SDLSystemCapabilityTypeNavigation","abstract":"<p>The navigation capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypePhoneCall":{"name":"SDLSystemCapabilityTypePhoneCall","abstract":"<p>The phone call capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeVideoStreaming":{"name":"SDLSystemCapabilityTypeVideoStreaming","abstract":"<p>The video streaming capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeRemoteControl":{"name":"SDLSystemCapabilityTypeRemoteControl","abstract":"<p>The remote control capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeSeatLocation":{"name":"SDLSystemCapabilityTypeSeatLocation","abstract":"<p>Contains information about the locations of each seat</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDisplays":{"name":"SDLSystemCapabilityTypeDisplays","abstract":"<p>The Display type capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDriverDistraction":{"name":"SDLSystemCapabilityTypeDriverDistraction","abstract":"<p>@since SDL 7.0.0</p>"},"Constants.html#/c:@SDLSystemContextMain":{"name":"SDLSystemContextMain","abstract":"<p>No user interaction (user-initiated or app-initiated) is in progress.</p>"},"Constants.html#/c:@SDLSystemContextVoiceRecognitionSession":{"name":"SDLSystemContextVoiceRecognitionSession","abstract":"<p>VR-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextMenu":{"name":"SDLSystemContextMenu","abstract":"<p>Menu-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextHMIObscured":{"name":"SDLSystemContextHMIObscured","abstract":"<p>The app&rsquo;s display HMI is currently being obscured by either a system or other app&rsquo;s overlay.</p>"},"Constants.html#/c:@SDLSystemContextAlert":{"name":"SDLSystemContextAlert","abstract":"<p>Broadcast only to whichever app has an alert currently being displayed.</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequest":{"name":"SDLTBTStateRouteUpdateRequest","abstract":"<p>The route should be updated</p>"},"Constants.html#/c:@SDLTBTStateRouteAccepted":{"name":"SDLTBTStateRouteAccepted","abstract":"<p>The route is accepted</p>"},"Constants.html#/c:@SDLTBTStateRouteRefused":{"name":"SDLTBTStateRouteRefused","abstract":"<p>The route is refused</p>"},"Constants.html#/c:@SDLTBTStateRouteCancelled":{"name":"SDLTBTStateRouteCancelled","abstract":"<p>The route is cancelled</p>"},"Constants.html#/c:@SDLTBTStateETARequest":{"name":"SDLTBTStateETARequest","abstract":"<p>The route should update its Estimated Time of Arrival</p>"},"Constants.html#/c:@SDLTBTStateNextTurnRequest":{"name":"SDLTBTStateNextTurnRequest","abstract":"<p>The route should update its next turn</p>"},"Constants.html#/c:@SDLTBTStateRouteStatusRequest":{"name":"SDLTBTStateRouteStatusRequest","abstract":"<p>The route should update its status</p>"},"Constants.html#/c:@SDLTBTStateRouteSummaryRequest":{"name":"SDLTBTStateRouteSummaryRequest","abstract":"<p>The route update its summary</p>"},"Constants.html#/c:@SDLTBTStateTripStatusRequest":{"name":"SDLTBTStateTripStatusRequest","abstract":"<p>The route should update the trip&rsquo;s status</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequestTimeout":{"name":"SDLTBTStateRouteUpdateRequestTimeout","abstract":"<p>The route update timed out</p>"},"Constants.html#/c:@SDLTPMSUnknown":{"name":"SDLTPMSUnknown","abstract":"<p>If set the status of the tire is not known.</p>"},"Constants.html#/c:@SDLTPMSSystemFault":{"name":"SDLTPMSSystemFault","abstract":"<p>TPMS does not function.</p>"},"Constants.html#/c:@SDLTPMSSensorFault":{"name":"SDLTPMSSensorFault","abstract":"<p>The sensor of the tire does not function.</p>"},"Constants.html#/c:@SDLTPMSLow":{"name":"SDLTPMSLow","abstract":"<p>TPMS is reporting a low tire pressure for the tire.</p>"},"Constants.html#/c:@SDLTPMSSystemActive":{"name":"SDLTPMSSystemActive","abstract":"<p>TPMS is active and the tire pressure is monitored.</p>"},"Constants.html#/c:@SDLTPMSTrain":{"name":"SDLTPMSTrain","abstract":"<p>TPMS is reporting that the tire must be trained.</p>"},"Constants.html#/c:@SDLTPMSTrainingComplete":{"name":"SDLTPMSTrainingComplete","abstract":"<p>TPMS reports the training for the tire is completed.</p>"},"Constants.html#/c:@SDLTPMSNotTrained":{"name":"SDLTPMSNotTrained","abstract":"<p>TPMS reports the tire is not trained.</p>"},"Constants.html#/c:@SDLTemperatureUnitCelsius":{"name":"SDLTemperatureUnitCelsius","abstract":"<p>Reflects the current HMI setting for temperature unit in Celsius</p>"},"Constants.html#/c:@SDLTemperatureUnitFahrenheit":{"name":"SDLTemperatureUnitFahrenheit","abstract":"<p>Reflects the current HMI setting for temperature unit in Fahrenheit</p>"},"Constants.html#/c:@SDLTextAlignmentLeft":{"name":"SDLTextAlignmentLeft","abstract":"<p>Text aligned left.</p>"},"Constants.html#/c:@SDLTextAlignmentRight":{"name":"SDLTextAlignmentRight","abstract":"<p>Text aligned right.</p>"},"Constants.html#/c:@SDLTextAlignmentCenter":{"name":"SDLTextAlignmentCenter","abstract":"<p>Text aligned centered.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField1":{"name":"SDLTextFieldNameMainField1","abstract":"<p>The first line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField2":{"name":"SDLTextFieldNameMainField2","abstract":"<p>The second line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField3":{"name":"SDLTextFieldNameMainField3","abstract":"<p>The first line of the second set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField4":{"name":"SDLTextFieldNameMainField4"},"Constants.html#/c:@SDLTextFieldNameTemplateTitle":{"name":"SDLTextFieldNameTemplateTitle","abstract":"<p>The title line of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameStatusBar":{"name":"SDLTextFieldNameStatusBar","abstract":"<p>The status bar on the NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaClock":{"name":"SDLTextFieldNameMediaClock","abstract":"<p>Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaTrack":{"name":"SDLTextFieldNameMediaTrack","abstract":"<p>The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText1":{"name":"SDLTextFieldNameAlertText1","abstract":"<p>The first line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText2":{"name":"SDLTextFieldNameAlertText2","abstract":"<p>The second line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText3":{"name":"SDLTextFieldNameAlertText3","abstract":"<p>The third line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameScrollableMessageBody":{"name":"SDLTextFieldNameScrollableMessageBody","abstract":"<p>Long form body of text that can include newlines and tabs. Applies to SDLScrollableMessage.</p>"},"Constants.html#/c:@SDLTextFieldNameInitialInteractionText":{"name":"SDLTextFieldNameInitialInteractionText","abstract":"<p>First line suggestion for a user response (in the case of VR enabled interaction).</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText1":{"name":"SDLTextFieldNameNavigationText1","abstract":"<p>First line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText2":{"name":"SDLTextFieldNameNavigationText2","abstract":"<p>Second line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameETA":{"name":"SDLTextFieldNameETA","abstract":"<p>Estimated Time of Arrival time for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameTotalDistance":{"name":"SDLTextFieldNameTotalDistance","abstract":"<p>Total distance to destination for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText1":{"name":"SDLTextFieldNameAudioPassThruDisplayText1","abstract":"<p>First line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText2":{"name":"SDLTextFieldNameAudioPassThruDisplayText2","abstract":"<p>Second line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderHeader":{"name":"SDLTextFieldNameSliderHeader","abstract":"<p>Header text for slider.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderFooter":{"name":"SDLTextFieldNameSliderFooter","abstract":"<p>Footer text for slider</p>"},"Constants.html#/c:@SDLTextFieldNameMenuName":{"name":"SDLTextFieldNameMenuName","abstract":"<p>Primary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameSecondaryText":{"name":"SDLTextFieldNameSecondaryText","abstract":"<p>Secondary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameTertiaryText":{"name":"SDLTextFieldNameTertiaryText","abstract":"<p>Tertiary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameMenuTitle":{"name":"SDLTextFieldNameMenuTitle","abstract":"<p>Optional text to label an app menu button (for certain touchscreen platforms)</p>"},"Constants.html#/c:@SDLTextFieldNameLocationName":{"name":"SDLTextFieldNameLocationName","abstract":"<p>Optional name / title of intended location for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameLocationDescription":{"name":"SDLTextFieldNameLocationDescription","abstract":"<p>Optional description of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameAddressLines":{"name":"SDLTextFieldNameAddressLines","abstract":"<p>Optional location address (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNamePhoneNumber":{"name":"SDLTextFieldNamePhoneNumber","abstract":"<p>Optional hone number of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText1":{"name":"SDLTextFieldNameSubtleAlertText1","abstract":"<p>The first line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText1</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText2":{"name":"SDLTextFieldNameSubtleAlertText2","abstract":"<p>The second line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText2</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertSoftButtonText":{"name":"SDLTextFieldNameSubtleAlertSoftButtonText","abstract":"<p>A text field in the soft button of a subtle alert; applies to <code>SubtleAlert</code> <code>softButtons</code></p>"},"Constants.html#/c:@SDLTimerModeUp":{"name":"SDLTimerModeUp","abstract":"<p>The timer should count up.</p>"},"Constants.html#/c:@SDLTimerModeDown":{"name":"SDLTimerModeDown","abstract":"<p>The timer should count down.</p>"},"Constants.html#/c:@SDLTimerModeNone":{"name":"SDLTimerModeNone","abstract":"<p>The timer should not count.</p>"},"Constants.html#/c:@SDLTouchTypeBegin":{"name":"SDLTouchTypeBegin","abstract":"<p>The touch is the beginning of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeMove":{"name":"SDLTouchTypeMove","abstract":"<p>The touch is the movement of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeEnd":{"name":"SDLTouchTypeEnd","abstract":"<p>The touch is the ending of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeCancel":{"name":"SDLTouchTypeCancel","abstract":"<p>The touch is the cancellation of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTransmissionTypeAutomatic":{"name":"SDLTransmissionTypeAutomatic","abstract":"<p>Automatic transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeContinuouslyVariable":{"name":"SDLTransmissionTypeContinuouslyVariable","abstract":"<p>Continuously variable transmission(CVT).</p>"},"Constants.html#/c:@SDLTransmissionTypeDirectDrive":{"name":"SDLTransmissionTypeDirectDrive","abstract":"<p>Direct drive between engine and wheels.</p>"},"Constants.html#/c:@SDLTransmissionTypeDualClutch":{"name":"SDLTransmissionTypeDualClutch","abstract":"<p>Dual clutch transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeElectricVariable":{"name":"SDLTransmissionTypeElectricVariable","abstract":"<p>Electric variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeInfinitelyVariable":{"name":"SDLTransmissionTypeInfinitelyVariable","abstract":"<p>Infinitely variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeManual":{"name":"SDLTransmissionTypeManual","abstract":"<p>Manual transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeSemiAutomatic":{"name":"SDLTransmissionTypeSemiAutomatic","abstract":"<p>Semi automatic transmission.</p>"},"Constants.html#/c:@SDLTriggerSourceMenu":{"name":"SDLTriggerSourceMenu","abstract":"<p>Selection made via menu</p>"},"Constants.html#/c:@SDLTriggerSourceVoiceRecognition":{"name":"SDLTriggerSourceVoiceRecognition","abstract":"<p>Selection made via Voice session</p>"},"Constants.html#/c:@SDLTriggerSourceKeyboard":{"name":"SDLTriggerSourceKeyboard","abstract":"<p>Selection made via Keyboard</p>"},"Constants.html#/c:@SDLTurnSignalOff":{"name":"SDLTurnSignalOff","abstract":"<p>Turn signal is OFF</p>"},"Constants.html#/c:@SDLTurnSignalLeft":{"name":"SDLTurnSignalLeft","abstract":"<p>Left turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalRight":{"name":"SDLTurnSignalRight","abstract":"<p>Right turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalBoth":{"name":"SDLTurnSignalBoth","abstract":"<p>Both signals (left and right) are on</p>"},"Constants.html#/c:@SDLUpdateModeCountUp":{"name":"SDLUpdateModeCountUp","abstract":"<p>Starts the media clock timer counting upward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModeCountDown":{"name":"SDLUpdateModeCountDown","abstract":"<p>Starts the media clock timer counting downward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModePause":{"name":"SDLUpdateModePause","abstract":"<p>Pauses the media clock timer.</p>"},"Constants.html#/c:@SDLUpdateModeResume":{"name":"SDLUpdateModeResume","abstract":"<p>Resumes the media clock timer. The timer resumes counting in whatever mode was in effect before pausing (i.e. COUNTUP or COUNTDOWN).</p>"},"Constants.html#/c:@SDLUpdateModeClear":{"name":"SDLUpdateModeClear","abstract":"<p>Clear the media clock timer.</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveNotConfirmed","abstract":"<p>Inactive not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveConfirmed","abstract":"<p>Inactive confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusActiveNotConfirmed","abstract":"<p>Active not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveConfirmed":{"name":"SDLVehicleDataActiveStatusActiveConfirmed","abstract":"<p>Active confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusFault":{"name":"SDLVehicleDataActiveStatusFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNoEvent":{"name":"SDLVehicleDataEventStatusNoEvent","abstract":"<p>No event</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNo":{"name":"SDLVehicleDataEventStatusNo","abstract":"<p>The event is a No status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusYes":{"name":"SDLVehicleDataEventStatusYes","abstract":"<p>The event is a Yes status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNotSupported":{"name":"SDLVehicleDataEventStatusNotSupported","abstract":"<p>Vehicle data event is not supported</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusFault":{"name":"SDLVehicleDataEventStatusFault","abstract":"<p>The event is a Fault status</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotSupported":{"name":"SDLVehicleDataNotificationStatusNotSupported","abstract":"<p>The vehicle data notification status is not supported</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNormal":{"name":"SDLVehicleDataNotificationStatusNormal","abstract":"<p>The vehicle data notification status is normal</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusActive":{"name":"SDLVehicleDataNotificationStatusActive","abstract":"<p>The vehicle data notification status is active</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotUsed":{"name":"SDLVehicleDataNotificationStatusNotUsed","abstract":"<p>The vehicle data notification status is not used</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeSuccess":{"name":"SDLVehicleDataResultCodeSuccess","abstract":"<p>Individual vehicle data item / DTC / DID request or subscription successful</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeTruncatedData":{"name":"SDLVehicleDataResultCodeTruncatedData","abstract":"<p>DTC / DID request successful, however, not all active DTCs or full contents of DID location available</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDisallowed":{"name":"SDLVehicleDataResultCodeDisallowed","abstract":"<p>This vehicle data item is not allowed for this app by SDL</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeUserDisallowed":{"name":"SDLVehicleDataResultCodeUserDisallowed","abstract":"<p>The user has not granted access to this type of vehicle data item at this time</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeInvalidId":{"name":"SDLVehicleDataResultCodeInvalidId","abstract":"<p>The ECU ID referenced is not a valid ID on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeVehicleDataNotAvailable":{"name":"SDLVehicleDataResultCodeVehicleDataNotAvailable","abstract":"<p>The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataAlreadySubscribed":{"name":"SDLVehicleDataResultCodeDataAlreadySubscribed","abstract":"<p>The vehicle data item is already subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataNotSubscribed":{"name":"SDLVehicleDataResultCodeDataNotSubscribed","abstract":"<p>The vehicle data item cannot be unsubscribed because it is not currently subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeIgnored":{"name":"SDLVehicleDataResultCodeIgnored","abstract":"<p>The request for this item is ignored because it is already in progress</p>"},"Constants.html#/c:@SDLVehicleDataStatusNoDataExists":{"name":"SDLVehicleDataStatusNoDataExists","abstract":"<p>No data avaliable</p>"},"Constants.html#/c:@SDLVehicleDataStatusOff":{"name":"SDLVehicleDataStatusOff","abstract":"<p>The status is Off</p>"},"Constants.html#/c:@SDLVehicleDataStatusOn":{"name":"SDLVehicleDataStatusOn","abstract":"<p>The status is On</p>"},"Constants.html#/c:@SDLVehicleDataTypeGearStatus":{"name":"SDLVehicleDataTypeGearStatus","abstract":"<p>Vehicle Gear Status data"},"Constants.html#/c:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"<p>GPS vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"<p>Vehicle speed data</p>"},"Constants.html#/c:@SDLVehicleDataTypeStabilityControlsStatus":{"name":"SDLVehicleDataTypeStabilityControlsStatus","abstract":"<p>vehicle data StabilityControlsStatus to know if stability controls like ESC, Traction Control etc. are active.</p>"},"Constants.html#/c:@SDLVehicleDataTypeRPM":{"name":"SDLVehicleDataTypeRPM","abstract":"<p>Vehicle RPM data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevel":{"name":"SDLVehicleDataTypeFuelLevel","abstract":"<p>Vehicle fuel level data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevelState":{"name":"SDLVehicleDataTypeFuelLevelState","abstract":"<p>Vehicle fuel level state data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelConsumption":{"name":"SDLVehicleDataTypeFuelConsumption","abstract":"<p>Vehicle fuel consumption data</p>"},"Constants.html#/c:@SDLVehicleDataTypeExternalTemperature":{"name":"SDLVehicleDataTypeExternalTemperature","abstract":"<p>Vehicle external temperature data</p>"},"Constants.html#/c:@SDLVehicleDataTypeVIN":{"name":"SDLVehicleDataTypeVIN","abstract":"<p>Vehicle VIN data</p>"},"Constants.html#/c:@SDLVehicleDataTypePRNDL":{"name":"SDLVehicleDataTypePRNDL","abstract":"<p>Vehicle PRNDL data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTirePressure":{"name":"SDLVehicleDataTypeTirePressure","abstract":"<p>Vehicle tire pressure data</p>"},"Constants.html#/c:@SDLVehicleDataTypeOdometer":{"name":"SDLVehicleDataTypeOdometer","abstract":"<p>Vehicle odometer data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBeltStatus":{"name":"SDLVehicleDataTypeBeltStatus","abstract":"<p>Vehicle belt status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBodyInfo":{"name":"SDLVehicleDataTypeBodyInfo","abstract":"<p>Vehicle body info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeDeviceStatus":{"name":"SDLVehicleDataTypeDeviceStatus","abstract":"<p>Vehicle device status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeECallInfo":{"name":"SDLVehicleDataTypeECallInfo","abstract":"<p>Vehicle emergency call info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelRange":{"name":"SDLVehicleDataTypeFuelRange","abstract":"<p>Vehicle fuel range data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAirbagStatus":{"name":"SDLVehicleDataTypeAirbagStatus","abstract":"<p>Vehicle airbag status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEmergencyEvent":{"name":"SDLVehicleDataTypeEmergencyEvent","abstract":"<p>Vehicle emergency event info</p>"},"Constants.html#/c:@SDLVehicleDataTypeClusterModeStatus":{"name":"SDLVehicleDataTypeClusterModeStatus","abstract":"<p>Vehicle cluster mode status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeMyKey":{"name":"SDLVehicleDataTypeMyKey","abstract":"<p>Vehicle MyKey data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBraking":{"name":"SDLVehicleDataTypeBraking","abstract":"<p>Vehicle braking data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWiperStatus":{"name":"SDLVehicleDataTypeWiperStatus","abstract":"<p>Vehicle wiper status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeHandsOffSteering":{"name":"SDLVehicleDataTypeHandsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel"},"Constants.html#/c:@SDLVehicleDataTypeHeadlampStatus":{"name":"SDLVehicleDataTypeHeadlampStatus","abstract":"<p>Vehicle headlamp status</p>"},"Constants.html#/c:@SDLVehicleDataTypeBatteryVoltage":{"name":"SDLVehicleDataTypeBatteryVoltage","abstract":"<p>Vehicle battery voltage data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineOilLife":{"name":"SDLVehicleDataTypeEngineOilLife","abstract":"<p>Vehicle engine oil life data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineTorque":{"name":"SDLVehicleDataTypeEngineTorque","abstract":"<p>Vehicle engine torque data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAccelerationPedal":{"name":"SDLVehicleDataTypeAccelerationPedal","abstract":"<p>Vehicle accleration pedal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSteeringWheel":{"name":"SDLVehicleDataTypeSteeringWheel","abstract":"<p>Vehicle steering wheel data</p>"},"Constants.html#/c:@SDLVehicleDataTypeElectronicParkBrakeStatus":{"name":"SDLVehicleDataTypeElectronicParkBrakeStatus","abstract":"<p>Vehicle electronic parking brake status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTurnSignal":{"name":"SDLVehicleDataTypeTurnSignal","abstract":"<p>Vehicle turn signal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeCloudAppVehicleID":{"name":"SDLVehicleDataTypeCloudAppVehicleID","abstract":"<p>The cloud application vehicle id. Used by cloud apps to identify a head unit</p>"},"Constants.html#/c:@SDLVehicleDataTypeOEMVehicleDataType":{"name":"SDLVehicleDataTypeOEMVehicleDataType","abstract":"<p>Custom OEM Vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWindowStatus":{"name":"SDLVehicleDataTypeWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Constants.html#/c:@SDLVentilationModeUpper":{"name":"SDLVentilationModeUpper","abstract":"<p>The upper ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeLower":{"name":"SDLVentilationModeLower","abstract":"<p>The lower ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeBoth":{"name":"SDLVentilationModeBoth","abstract":"<p>The both ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeNone":{"name":"SDLVentilationModeNone","abstract":"<p>No ventilation mode</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH264":{"name":"SDLVideoStreamingCodecH264","abstract":"<p>H264</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH265":{"name":"SDLVideoStreamingCodecH265","abstract":"<p>H265</p>"},"Constants.html#/c:@SDLVideoStreamingCodecTheora":{"name":"SDLVideoStreamingCodecTheora","abstract":"<p>Theora</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP8":{"name":"SDLVideoStreamingCodecVP8","abstract":"<p>VP8</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP9":{"name":"SDLVideoStreamingCodecVP9","abstract":"<p>VP9</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRAW":{"name":"SDLVideoStreamingProtocolRAW","abstract":"<p>RAW</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTP":{"name":"SDLVideoStreamingProtocolRTP","abstract":"<p>RTP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTSP":{"name":"SDLVideoStreamingProtocolRTSP","abstract":"<p>RTSP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTMP":{"name":"SDLVideoStreamingProtocolRTMP","abstract":"<p>RTMP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolWebM":{"name":"SDLVideoStreamingProtocolWebM","abstract":"<p>WebM</p>"},"Constants.html#/c:@SDLVideoStreamingStateStreamable":{"name":"SDLVideoStreamingStateStreamable","abstract":"<p>STREAMABLE, the current app is allowed to stream video</p>"},"Constants.html#/c:@SDLVideoStreamingStateNotStreamable":{"name":"SDLVideoStreamingStateNotStreamable","abstract":"<p>NOT_STREAMABLE, the current app is not allowed to stream video</p>"},"Constants.html#/c:@SDLVRCapabilitiesText":{"name":"SDLVRCapabilitiesText","abstract":"<p>The SDL platform is capable of recognizing spoken text in the current language.</p>"},"Constants.html#/c:@SDLWarningLightStatusOff":{"name":"SDLWarningLightStatusOff","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusOn":{"name":"SDLWarningLightStatusOn","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusFlash":{"name":"SDLWarningLightStatusFlash","abstract":"<p>The warning light is flashing</p>"},"Constants.html#/c:@SDLWarningLightStatusNotUsed":{"name":"SDLWarningLightStatusNotUsed","abstract":"<p>The warning light is unused</p>"},"Constants.html#/c:@SDLWayPointTypeAll":{"name":"SDLWayPointTypeAll","abstract":"<p>All other waypoint types</p>"},"Constants.html#/c:@SDLWayPointTypeDestination":{"name":"SDLWayPointTypeDestination","abstract":"<p>The destination waypoint</p>"},"Constants.html#/c:@SDLWindowTypeMain":{"name":"SDLWindowTypeMain","abstract":"<p>This window type describes the main window on a display.</p>"},"Constants.html#/c:@SDLWindowTypeWidget":{"name":"SDLWindowTypeWidget","abstract":"<p>A widget is a small window that the app can create to provide information and soft buttons for quick app control.</p>"},"Constants.html#/c:@SDLWiperStatusOff":{"name":"SDLWiperStatusOff","abstract":"<p>Wiper is off</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticOff":{"name":"SDLWiperStatusAutomaticOff","abstract":"<p>Wiper is off automatically</p>"},"Constants.html#/c:@SDLWiperStatusOffMoving":{"name":"SDLWiperStatusOffMoving","abstract":"<p>Wiper is moving but off</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOff":{"name":"SDLWiperStatusManualIntervalOff","abstract":"<p>Wiper is off due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOn":{"name":"SDLWiperStatusManualIntervalOn","abstract":"<p>Wiper is on due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualLow":{"name":"SDLWiperStatusManualLow","abstract":"<p>Wiper is on low manually</p>"},"Constants.html#/c:@SDLWiperStatusManualHigh":{"name":"SDLWiperStatusManualHigh","abstract":"<p>Wiper is on high manually</p>"},"Constants.html#/c:@SDLWiperStatusManualFlick":{"name":"SDLWiperStatusManualFlick","abstract":"<p>Wiper is on for a single wipe manually</p>"},"Constants.html#/c:@SDLWiperStatusWash":{"name":"SDLWiperStatusWash","abstract":"<p>Wiper is in wash mode</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticLow":{"name":"SDLWiperStatusAutomaticLow","abstract":"<p>Wiper is on low automatically</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticHigh":{"name":"SDLWiperStatusAutomaticHigh","abstract":"<p>Wiper is on high automatically</p>"},"Constants.html#/c:@SDLWiperStatusCourtesyWipe":{"name":"SDLWiperStatusCourtesyWipe","abstract":"<p>Wiper is performing a courtesy wipe</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticAdjust":{"name":"SDLWiperStatusAutomaticAdjust","abstract":"<p>Wiper is on automatic adjust</p>"},"Constants.html#/c:@SDLWiperStatusStalled":{"name":"SDLWiperStatusStalled","abstract":"<p>Wiper is stalled</p>"},"Constants.html#/c:@SDLWiperStatusNoDataExists":{"name":"SDLWiperStatusNoDataExists","abstract":"<p>Wiper data is not available</p>"},"Constants.html#/c:@SmartDeviceLinkVersionNumber":{"name":"SmartDeviceLinkVersionNumber","abstract":"<p>Project version number for SmartDeviceLink.</p>"},"Constants.html#/c:@SmartDeviceLinkVersionString":{"name":"SmartDeviceLinkVersionString","abstract":"<p>Project version string for SmartDeviceLink.</p>"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(im)initWithType:maximumNumberOfWindows:":{"name":"-initWithType:maximumNumberOfWindows:","abstract":"<p>Init with required parameters</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)type":{"name":"type","abstract":"<p>Type of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)maximumNumberOfWindows":{"name":"maximumNumberOfWindows","abstract":"<p>Number of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(im)initWithLocation:state:":{"name":"-initWithLocation:state:","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)location":{"name":"location","abstract":"<p>location</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)state":{"name":"state","abstract":"<p>state</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(im)initWithApproximatePosition:deviation:":{"name":"-initWithApproximatePosition:deviation:","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)approximatePosition":{"name":"approximatePosition","abstract":"<p>The approximate percentage that the window is open - 0 being fully closed, 100 being fully open</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)deviation":{"name":"deviation","abstract":"<p>The percentage deviation of the approximatePosition. e.g. If the approximatePosition is 50 and the deviation is 10, then the window&rsquo;s location is somewhere between 40 and 60.</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)windowID":{"name":"windowID","abstract":"<p>The specified ID of the window. Can be set to a predefined window, or omitted for the main window on the main display.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)textFields":{"name":"textFields","abstract":"<p>A set of all fields that support text data. - see: TextField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageFields":{"name":"imageFields","abstract":"<p>A set of all fields that support images. - see: ImageField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>Provides information about image types supported by the system.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>A set of all window templates available on the head unit.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-window custom presets available (if any); otherwise omitted.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The number of buttons and the capabilities of each on-window button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The number of soft buttons available on-window and the capabilities for each button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)menuLayoutsAvailable":{"name":"menuLayoutsAvailable","abstract":"<p>An array of available menu layouts. If this parameter is not provided, only the <code>LIST</code> layout is assumed to be available.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)dynamicUpdateCapabilities":{"name":"dynamicUpdateCapabilities","abstract":"<p>Contains the head unit&rsquo;s capabilities for dynamic updating features declaring if the module will send dynamic update RPCs.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(im)initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:":{"name":"-initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)currentForecastSupported":{"name":"currentForecastSupported","abstract":"<p>Whether or not the current forcast is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMultidayForecastAmount":{"name":"maxMultidayForecastAmount","abstract":"<p>The maximum number of day-by-day forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxHourlyForecastAmount":{"name":"maxHourlyForecastAmount","abstract":"<p>The maximum number of hour-by-hour forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMinutelyForecastAmount":{"name":"maxMinutelyForecastAmount","abstract":"<p>The maximum number of minute-by-minute forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)weatherForLocationSupported":{"name":"weatherForLocationSupported","abstract":"<p>Whether or not the weather for location is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:":{"name":"-initWithLocation:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:":{"name":"-initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)location":{"name":"location","abstract":"<p>The location.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)currentForecast":{"name":"currentForecast","abstract":"<p>The current forecast.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)minuteForecast":{"name":"minuteForecast","abstract":"<p>A minute-by-minute array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)hourlyForecast":{"name":"hourlyForecast","abstract":"<p>An hour-by-hour array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)multidayForecast":{"name":"multidayForecast","abstract":"<p>A day-by-day array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)alerts":{"name":"alerts","abstract":"<p>An array of weather alerts. This array should be ordered with the first object being the current day.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(im)initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:":{"name":"-initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The current temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureHigh":{"name":"temperatureHigh","abstract":"<p>The predicted high temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureLow":{"name":"temperatureLow","abstract":"<p>The predicted low temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperature":{"name":"apparentTemperature","abstract":"<p>The apparent temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureHigh":{"name":"apparentTemperatureHigh","abstract":"<p>The predicted high apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureLow":{"name":"apparentTemperatureLow","abstract":"<p>The predicted low apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherSummary":{"name":"weatherSummary","abstract":"<p>A summary of the weather.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)time":{"name":"time","abstract":"<p>The time this data refers to.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)humidity":{"name":"humidity","abstract":"<p>From 0 to 1, percentage humidity.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)cloudCover":{"name":"cloudCover","abstract":"<p>From 0 to 1, percentage cloud cover.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)moonPhase":{"name":"moonPhase","abstract":"<p>From 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windBearing":{"name":"windBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windGust":{"name":"windGust","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windSpeed":{"name":"windSpeed","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormBearing":{"name":"nearestStormBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormDistance":{"name":"nearestStormDistance","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipAccumulation":{"name":"precipAccumulation","abstract":"<p>In cm</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipIntensity":{"name":"precipIntensity","abstract":"<p>In cm of water per hour.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipProbability":{"name":"precipProbability","abstract":"<p>From 0 to 1, percentage chance.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipType":{"name":"precipType","abstract":"<p>A description of the precipitation type (e.g. &ldquo;rain&rdquo;, &ldquo;snow&rdquo;, &ldquo;sleet&rdquo;, &ldquo;hail&rdquo;)</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)visibility":{"name":"visibility","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherIcon":{"name":"weatherIcon","abstract":"<p>The weather icon image.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(im)initWithTitle:summary:expires:regions:severity:timeIssued:":{"name":"-initWithTitle:summary:expires:regions:severity:timeIssued:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)title":{"name":"title","abstract":"<p>The title of the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)summary":{"name":"summary","abstract":"<p>A summary for the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)expires":{"name":"expires","abstract":"<p>The date the alert expires.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)regions":{"name":"regions","abstract":"<p>Regions affected.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)severity":{"name":"severity","abstract":"<p>Severity of the weather alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)timeIssued":{"name":"timeIssued","abstract":"<p>The date the alert was issued.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:":{"name":"-initWithText:image:","abstract":"<p>Convenience init to create a VR help item with the following parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:position:":{"name":"-initWithText:image:position:","abstract":"<p>Convenience init to create a VR help item with all parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)text":{"name":"text","abstract":"<p>Text to display for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)image":{"name":"image","abstract":"<p>Image for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)position":{"name":"position","abstract":"<p>Position to display item in VR Help list</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(im)initWithVoiceCommands:handler:":{"name":"-initWithVoiceCommands:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)protocol":{"name":"protocol","abstract":"<p>Protocol type, see VideoStreamingProtocol</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)codec":{"name":"codec","abstract":"<p>Codec type, see VideoStreamingCodec</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(im)initWithCodec:protocol:":{"name":"-initWithCodec:protocol:","abstract":"<p>Convenience init</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredResolution":{"name":"preferredResolution","abstract":"<p>The preferred resolution of a video stream for decoding and rendering on HMI</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)maxBitrate":{"name":"maxBitrate","abstract":"<p>The maximum bitrate of video stream that is supported, in kbps, optional</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>Detailed information on each format supported by this system, in its preferred order</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported":{"name":"hapticSpatialDataSupported","abstract":"<p>True if the system can utilize the haptic spatial data from the source being streamed.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)diagonalScreenSize":{"name":"diagonalScreenSize","abstract":"<p>The diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)pixelPerInch":{"name":"pixelPerInch","abstract":"<p>The diagonal resolution in pixels divided by the diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)major":{"name":"major","abstract":"<p>Major version (e.g. X.0.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)minor":{"name":"minor","abstract":"<p>Minor version (e.g. 0.X.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)patch":{"name":"patch","abstract":"<p>Patch version (e.g. 0.0.X)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)stringVersion":{"name":"stringVersion","abstract":"<p>A String format of the current SDLVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithMajor:minor:patch:":{"name":"-initWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithMajor:minor:patch:":{"name":"+versionWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithString:":{"name":"-initWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithString:":{"name":"+versionWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithSDLMsgVersion:":{"name":"-initWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSDLMsgVersion:":{"name":"+versionWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)compare:":{"name":"-compare:","abstract":"<p>Compare two SDLVersions</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanVersion:":{"name":"-isLessThanVersion:","abstract":"<p>Compare is less than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isEqualToVersion:":{"name":"-isEqualToVersion:","abstract":"<p>Compare is equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanVersion:":{"name":"-isGreaterThanVersion:","abstract":"<p>Compare is greater than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanOrEqualToVersion:":{"name":"-isGreaterThanOrEqualToVersion:","abstract":"<p>Compare is greater than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanOrEqualToVersion:":{"name":"-isLessThanOrEqualToVersion:","abstract":"<p>Compare is less than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)make":{"name":"make","abstract":"<p>The make of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)model":{"name":"model","abstract":"<p>The model of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)modelYear":{"name":"modelYear","abstract":"<p>The model year of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)trim":{"name":"trim","abstract":"<p>The trim of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithDataType:resultCode:":{"name":"-initWithDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a dataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithCustomOEMDataType:resultCode:":{"name":"-initWithCustomOEMDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a customDataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)dataType":{"name":"dataType","abstract":"<p>Defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)customOEMDataType":{"name":"customOEMDataType","abstract":"<p>OEM custom defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)resultCode":{"name":"resultCode","abstract":"<p>Published data result code</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(im)initWithTurnList:softButtons:":{"name":"-initWithTurnList:softButtons:","abstract":"<p>Convenience init to update a list of maneuvers for navigation</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)turnList":{"name":"turnList","abstract":"<p>Optional, SDLTurn, 1 - 100 entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)softButtons":{"name":"softButtons","abstract":"<p>Required, SDLSoftButton, 0 - 1 Entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to unsubscribe to the GPSData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to unsubscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to unsubscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to unsubscribe to the fuel level state.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to unsubscribe to the fuel range.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The result of requesting to unsubscribe to the external temperature in degrees celsius.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to unsubscribe to the tireStatus.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to unsubscribe to the odometer in km.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the seat belts.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to unsubscribe to the body information including power modes.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to unsubscribe to the device status including signal and battery strength.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to unsubscribe to the status of the brake pedal.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the wipers.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>The result of requesting to unsubscribe from the status of driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the head lamps.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to unsubscribe to the emergency call info</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to unsubscribe to the airbag status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to unsubscribe to the emergency event</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to unsubscribe to the cluster modes</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to unsubscribe to the myKey status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to unsubscribe to the electronic parking brake status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to unsubscribe to the turn signal</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to unsubscribe to the cloud app vehicle id</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for unsubscribing to all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>If true, unsubscribes from GPS</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>If true, unsubscribes from Speed</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>If true, unsubscribes from RPM</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>If true, unsubscribes from Fuel Level</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>If true, unsubscribes from Fuel Level State</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>If true, unsubscribes from Fuel Range</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>If true, unsubscribes from Instant Fuel Consumption</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>If true, unsubscribes from External Temperature</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>If true, unsubscribes from Tire Pressure</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>If true, unsubscribes from Odometer</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>If true, unsubscribes from Belt Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>If true, unsubscribes from Body Information</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>If true, unsubscribes from Device Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>If true, unsubscribes from Driver Braking</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>If true, unsubscribes from Wiper Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>If true, unsubscribes from Head Lamp Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>If true, unsubscribes from Engine Oil Life</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>If true, unsubscribes from Engine Torque</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>If true, unsubscribes from Acc Pedal Position</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>If true, unsubscribes from Steering Wheel Angle data</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>If true, unsubscribes from eCallInfo</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>If true, unsubscribes from Airbag Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>If true, unsubscribes from Emergency Event</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>If true, unsubscribes from Cluster Mode Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>If true, unsubscribes from My Key</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, unsubscribes to the Electronic Parking Brake Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, unsubscribes to the Turn Signal</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, unsubscribes to the Cloud App Vehicle ID</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(im)initWithButtonName:":{"name":"-initWithButtonName:","abstract":"<p>Convenience init to unsubscribe from a subscription button</p>","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>A name of the button to unsubscribe from","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(im)initWithServiceID:":{"name":"-initWithServiceID:","abstract":"<p>Create an instance of UnpublishAppService with the serviceID that corresponds with the service to be unpublished</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(py)serviceID":{"name":"serviceID","abstract":"<p>The ID of the service to be unpublished.</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(im)initWithNavigationText:turnIcon:":{"name":"-initWithNavigationText:turnIcon:","abstract":"<p>Convenience init to UpdateTurnList for navigation</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)navigationText":{"name":"navigationText","abstract":"<p>Individual turn text. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)turnIcon":{"name":"turnIcon","abstract":"<p>Individual turn icon. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventDelegate":{"name":"touchEventDelegate","abstract":"<p>Notified of processed touches such as pinches, pans, and taps</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventHandler":{"name":"touchEventHandler","abstract":"<p>Returns all OnTouchEvent notifications as SDLTouch and SDLTouchType objects.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapDistanceThreshold":{"name":"tapDistanceThreshold","abstract":"<p>Distance between two taps on the screen, in the head unit&rsquo;s coordinate system, used for registering double-tap callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)panDistanceThreshold":{"name":"panDistanceThreshold","abstract":"<p>Minimum distance for a pan gesture in the head unit&rsquo;s coordinate system, used for registering pan callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapTimeThreshold":{"name":"tapTimeThreshold","abstract":"<p>Time (in seconds) between tap events to register a double-tap callback. This must be greater than 0.0.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)enableSyncedPanning":{"name":"enableSyncedPanning","abstract":"<p>If set to NO, the display link syncing will be ignored. Defaults to YES.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"<p>Boolean denoting whether or not the touch manager should deliver touch event callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"<p>Cancels pending touch event timers that may be in progress.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)initWithHitTester:videoScaleManager:":{"name":"-initWithHitTester:videoScaleManager:","abstract":"<p>Initialize a touch manager with a hit tester and a video scale manager.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)syncFrame":{"name":"-syncFrame","abstract":"<p>Called by SDLStreamingMediaManager in sync with the streaming framerate. This helps to moderate panning gestures by allowing the UI to be modified in time with the framerate.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)pressAvailable":{"name":"pressAvailable","abstract":"<p>Whether or not long presses are available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)multiTouchAvailable":{"name":"multiTouchAvailable","abstract":"<p>Whether or not multi-touch (e.g. a pinch gesture) is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)doublePressAvailable":{"name":"doublePressAvailable","abstract":"<p>Whether or not a double tap is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)touchEventId":{"name":"touchEventId","abstract":"<p>A touch&rsquo;s unique identifier. The application can track the current touch events by id.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)timeStamp":{"name":"timeStamp","abstract":"<p>The time that the touch was recorded. This number can the time since the beginning of the session or something else as long as the units are in milliseconds.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)coord":{"name":"coord","abstract":"<p>The touch&rsquo;s coordinate</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)x":{"name":"x","abstract":"<p>The x value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)y":{"name":"y","abstract":"<p>The y value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(im)initWithTouchEvent:":{"name":"-initWithTouchEvent:","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)identifier":{"name":"identifier","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)location":{"name":"location","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)timeStamp":{"name":"timeStamp","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isFirstFinger":{"name":"isFirstFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isSecondFinger":{"name":"isSecondFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)pressureTelltale":{"name":"pressureTelltale","abstract":"<p>Status of the Tire Pressure Telltale. See WarningLightStatus.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftFront":{"name":"leftFront","abstract":"<p>The status of the left front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightFront":{"name":"rightFront","abstract":"<p>The status of the right front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftRear":{"name":"leftRear","abstract":"<p>The status of the left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightRear":{"name":"rightRear","abstract":"<p>The status of the right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerLeftRear":{"name":"innerLeftRear","abstract":"<p>The status of the inner left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerRightRear":{"name":"innerRightRear","abstract":"<p>The status of the innter right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)name":{"name":"name","abstract":"<p>The enumeration identifying the field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)characterSet":{"name":"characterSet","abstract":"<p>The set of characters that are supported by this text field. All text is sent in UTF-8 format, but not all systems may support all of the characters expressed by UTF-8. All systems will support at least ASCII, but they may support more, either the LATIN-1 character set, or the full UTF-8 character set.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)width":{"name":"width","abstract":"<p>The number of characters in one row of this field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)rows":{"name":"rows","abstract":"<p>The number of rows for this text field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(im)initWithName:characterSet:width:rows:":{"name":"-initWithName:characterSet:width:rows:","abstract":"<p>Convenience initalizer for the TextField RPC struct</p>","parent_name":"SDLTextField"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Constructor with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:":{"name":"-initWithTemplate:","abstract":"<p>Init with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:dayColorScheme:nightColorScheme:":{"name":"-initWithTemplate:dayColorScheme:nightColorScheme:","abstract":"<p>Convinience constructor with all the parameters.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)template":{"name":"template","abstract":"<p>Predefined or dynamically created window template. Currently only predefined window template layouts are defined.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:":{"name":"-initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryColor:secondaryColor:backgroundColor:":{"name":"-initWithPrimaryColor:secondaryColor:backgroundColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)primaryColor":{"name":"primaryColor","abstract":"<p>The &ldquo;primary&rdquo; color. This must always be your primary brand color. If the OEM only uses one color, this will be the color. It is recommended to the OEMs that the primaryColor should change the <code>mediaClockTimer</code> bar and the highlight color of soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)secondaryColor":{"name":"secondaryColor","abstract":"<p>The &ldquo;secondary&rdquo; color. This may be an accent or complimentary color to your primary brand color. If the OEM uses this color, they must also use the primary color. It is recommended to the OEMs that the secondaryColor should change the background color of buttons, such as soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color to be used on the template. If the OEM does not support this parameter, assume on &ldquo;dayColorScheme&rdquo; that this will be a light color, and on &ldquo;nightColorScheme&rdquo; a dark color. You should do the same for your custom schemes.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithFahrenheitValue:":{"name":"-initWithFahrenheitValue:","abstract":"<p>Convenience init for a fahrenheit temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithCelsiusValue:":{"name":"-initWithCelsiusValue:","abstract":"<p>Convenience init for a celsius temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithUnit:value:":{"name":"-initWithUnit:value:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)unit":{"name":"unit","abstract":"<p>Temperature unit</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)value":{"name":"value","abstract":"<p>Temperature value in specified unit. Range depends on OEM and is not checked by SDL.</p>","parent_name":"SDLTemperature"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(im)initWithText:type:":{"name":"-initWithText:type:","abstract":"<p>Initialize with text and a type</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)textChunksFromString:":{"name":"+textChunksFromString:","abstract":"<p>Create TTS using text</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)sapiChunksFromString:":{"name":"+sapiChunksFromString:","abstract":"<p>Create TTS using SAPI</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)lhPlusChunksFromString:":{"name":"+lhPlusChunksFromString:","abstract":"<p>Create TTS using LH Plus</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)prerecordedChunksFromString:":{"name":"+prerecordedChunksFromString:","abstract":"<p>Create TTS using prerecorded chunks</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)silenceChunks":{"name":"+silenceChunks","abstract":"<p>Create TTS using silence</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)fileChunksWithName:":{"name":"+fileChunksWithName:","abstract":"<p>Create &ldquo;TTS&rdquo; to play an audio file previously uploaded to the system.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)text":{"name":"text","abstract":"<p>Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the &ldquo;type&rdquo; field.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)type":{"name":"type","abstract":"<p>The type of information in the &ldquo;text&rdquo; field (e.g. phrase to be spoken, phoneme specification, name of pre-recorded sound).</p>","parent_name":"SDLTTSChunk"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithType:fileName:":{"name":"-initWithType:fileName:","abstract":"<p>Create a generic system request with a file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithProprietaryType:fileName:":{"name":"-initWithProprietaryType:fileName:","abstract":"<p>Create an OEM_PROPRIETARY system request with a subtype and file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request. Note that Proprietary requests should forward the binary data to the known proprietary module on the system.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)fileName":{"name":"fileName","abstract":"<p>Filename of HTTP data to store in predefined system staging area.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displays":{"name":"displays","abstract":"<p>Provides window capabilities of all displays connected with SDL. By default, one display is connected and supported which includes window capability information of the default main window of the display. May be nil if the system has not provided display and window capability information yet.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>If returned, the platform supports on-screen SoftButtons</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)prerecordedSpeechCapabilities":{"name":"prerecordedSpeechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)vrCapability":{"name":"vrCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)pcmStreamCapability":{"name":"pcmStreamCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>If returned, the platform supports app services</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>If returned, the platform supports navigation</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>If returned, the platform supports making phone calls</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>If returned, the platform supports video streaming</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>If returned, the platform supports remote control capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>If returned, the platform supports remote control capabilities for seats</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>If returned, the platform supports driver distraction capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)defaultMainWindowCapability":{"name":"defaultMainWindowCapability","abstract":"<p>Returns the window capability object of the default main window which is always pre-created by the connected system. This is a convenience method for easily accessing the capabilities of the default main window.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)supportsSubscriptions":{"name":"supportsSubscriptions","abstract":"<p>YES if subscriptions are available on the connected module and you will automatically be notified if the value changes on the module. If NO, calls to <code>subscribe</code> methods will subscribe to updates, but the module will not automatically notify you. You will need to call <code>updateWithCapabilityType:completionHandler:</code> to force an update if you need one (though this should be rare). This does not apply to the <code>DISPLAYS</code> capability type which you can always subscribe to.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)init":{"name":"-init","abstract":"<p>Init is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"<p>Creates a new system capability manager with a specified connection manager</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)start":{"name":"-start","abstract":"<p>Starts the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)windowCapabilityWithWindowID:":{"name":"-windowCapabilityWithWindowID:","abstract":"<p>Returns the window capability of one of your app&rsquo;s windows with the specified window ID that is on the primary display (i.e. the head unit itself). This is a convenience method to easily access capabilities of windows such as your apps&rsquo; widget windows.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)isCapabilitySupported:":{"name":"-isCapabilitySupported:","abstract":"<p>Returns whether or not the capability type is supported on the module. You can use this to check if subscribing to the capability will work. If this returns NO, then the feature is not supported by the head unit. If YES, the feature is supported by the head unit. You can subscribe to the capability type to get more information about the capability&rsquo;s support and features on the connected module.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)updateCapabilityType:completionHandler:":{"name":"-updateCapabilityType:completionHandler:","abstract":"<p>This method has been superseded by the <code>subscribeToCapabilityType:</code> methods. You should use one of those methods instead unless you only want a value once (you don&rsquo;t want to keep a long-lasting observer) and it must be current (most capabilities do not need to be updated). If you have a separate subscription observer and are connected to a head unit that does not support subscriptions, when this method returns, it will also call all subscription callbacks that you&rsquo;ve set up with the new value if there is one. Therefore, you can use this method to force an update to all subscriptions of that particular type on head units that don&rsquo;t support subscriptions (<code>supportsSubscriptions == NO</code>).</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withUpdateHandler:":{"name":"-subscribeToCapabilityType:withUpdateHandler:","abstract":"<p>Subscribe to a particular capability type using a handler callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withObserver:selector:":{"name":"-subscribeToCapabilityType:withObserver:selector:","abstract":"<p>Subscribe to a particular capability type with a selector callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)unsubscribeFromCapabilityType:withObserver:":{"name":"-unsubscribeFromCapabilityType:withObserver:","abstract":"<p>Unsubscribe from a particular capability type. If it was subscribed with a block / handler, the return value should be passed to the <code>observer</code> to unsubscribe the block. If it was subscribed with a selector, the <code>observer</code> object (on which the selector exists and is called) should be passed to unsubscribe the object selector.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithAppServicesCapabilities:":{"name":"-initWithAppServicesCapabilities:","abstract":"<p>Convenience init for an App Service Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithNavigationCapability:":{"name":"-initWithNavigationCapability:","abstract":"<p>Convenience init for a Navigation Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithPhoneCapability:":{"name":"-initWithPhoneCapability:","abstract":"<p>Convenience init for a Phone Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithVideoStreamingCapability:":{"name":"-initWithVideoStreamingCapability:","abstract":"<p>Convenience init for a Video Streaming Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithRemoteControlCapability:":{"name":"-initWithRemoteControlCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDisplayCapabilities:":{"name":"-initWithDisplayCapabilities:","abstract":"<p>Convenience init for DisplayCapability list</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithSeatLocationCapability:":{"name":"-initWithSeatLocationCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDriverDistractionCapability:":{"name":"-initWithDriverDistractionCapability:","abstract":"<p>Convenience init for a Driver Distraction capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other parameter included.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>Describes the capabilities of app services including what service types are supported and the current state of services.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>Describes the extended capabilities of the onboard navigation system</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s phone feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes the capabilities of the module&rsquo;s video streaming feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s remote control feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>Describes information about the locations of each seat</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contain the display related information and all windows related to that display</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>Describes capabilities when the driver is distracted</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(im)initWithTryAgainTime:":{"name":"-initWithTryAgainTime:","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in milliseconds) that an app must wait before resending an alert. If provided, another system event or overlay currently has a higher priority than this alert. An app must not send an alert without waiting at least the amount of time dictated.","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(im)initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:":{"name":"-initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed for the corresponding alert. See Image. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least one item.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)duration":{"name":"duration","abstract":"<p>Timeout in milliseconds. Typical timeouts are 3-5 seconds. If omitted, timeout is set to 5s.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)softButtons":{"name":"softButtons","abstract":"<p>App defined SoftButtons. If omitted on supported displays, the displayed alert shall not have any SoftButtons.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to subscribe to the GPSData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to subscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to subscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to subscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to subscribe to the fuel level state.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to subscribe to the fuel range.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The result of requesting to subscribe to the external temperature in degrees celsius.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to subscribe to the tireStatus.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to subscribe to the odometer in km.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to subscribe to the status of the seat belts.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to subscribe to the body information including power modes.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to subscribe to the device status including signal and battery strength.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to subscribe to the status of the brake pedal.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to subscribe to the status of the wipers.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to subscribe to the status of the head lamps.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to subscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to subscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to subscribe to the emergency call info</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to subscribe to the airbag status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to subscribe to the emergency event</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to subscribe to the cluster modes</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to subscribe to the myKey status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to subscribe to the electronic parking brake status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to subscribe to the turn signal</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to subscribe to the cloud app vehicle ID</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, subscribes GPS data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, subscribes Speed data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, subscribes RPM data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, subscribes Fuel Level data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, subscribes Fuel Level State data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, subscribes Fuel Range data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, subscribes Instant Fuel Consumption data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>A boolean value. If true, subscribes External Temperature data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, subscribes Tire Pressure status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, subscribes Odometer data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, subscribes Belt Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, subscribes Body Information data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, subscribes Device Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, subscribes Driver Braking data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, subscribes Wiper Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, subscribes Head Lamp Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, subscribes to Engine Oil Life data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, subscribes Engine Torque data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, subscribes Acc Pedal Position data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, subscribes Steering Wheel Angle data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, subscribes eCall Info data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, subscribes Airbag Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, subscribes Emergency Event data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, subscribes Cluster Mode Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, subscribes myKey data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, subscribes to the electronic parking brake status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, subscribes to the turn signal status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, subscribes to the cloud app vehicle ID.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithButtonName:handler:":{"name":"-initWithButtonName:handler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs with a button name.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you subscribed to is selected.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button to subscribe to","parent_name":"SDLSubscribeButton"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)displayViewportResolution":{"name":"displayViewportResolution","abstract":"<p>The screen resolution of the connected display. The units are pixels.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)appViewportFrame":{"name":"appViewportFrame","abstract":"<p>The frame of the app&rsquo;s projecting view. This is calculated by dividing the display&rsquo;s viewport resolution by the scale. The units are points.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)init":{"name":"-init","abstract":"<p>Creates a default streaming video scale manager.","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)initWithScale:displayViewportResolution:":{"name":"-initWithScale:displayViewportResolution:","abstract":"<p>Convenience init for creating the manager with a scale and connected display viewport resolution.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleTouchEventCoordinates:":{"name":"-scaleTouchEventCoordinates:","abstract":"<p>Scales the coordinates of an <code>OnTouchEvent</code> from the display&rsquo;s coordinate system to the app&rsquo;s viewport coordinate system. If the scale value is less than 1.0, the touch events will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleHapticRect:":{"name":"-scaleHapticRect:","abstract":"<p>Scales a haptic rectangle from the app&rsquo;s viewport coordinate system to the display&rsquo;s coordinate system. If the scale value is less than 1.0, the haptic rectangle will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager":{"name":"touchManager","abstract":"<p>Touch Manager responsible for providing touch event notifications.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioManager":{"name":"audioManager","abstract":"<p>Audio Manager responsible for managing streaming audio.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)rootViewController":{"name":"rootViewController","abstract":"<p>This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html\">SDLStreamingMediaConfiguration</a></code> <code>rootViewController</code>. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)focusableItemManager":{"name":"focusableItemManager","abstract":"<p>A haptic interface that can be updated to reparse views within the window you&rsquo;ve provided. Send a <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLDidUpdateProjectionView\">SDLDidUpdateProjectionView</a></code> notification or call the <code>updateInterfaceLayout</code> method to reparse. The &ldquo;output&rdquo; of this haptic interface occurs in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager\">touchManager</a></code> property where it will call the delegate.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)streamingSupported":{"name":"streamingSupported","abstract":"<p>Whether or not video streaming is supported</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoConnected":{"name":"videoConnected","abstract":"<p>Whether or not the video session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoEncrypted":{"name":"videoEncrypted","abstract":"<p>Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioEncrypted":{"name":"audioEncrypted","abstract":"<p>Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoStreamingPaused":{"name":"videoStreamingPaused","abstract":"<p>Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)screenSize":{"name":"screenSize","abstract":"<p>The current screen resolution of the connected display in pixels.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoFormat":{"name":"videoFormat","abstract":"<p>This is the agreed upon format of video encoder that is in use, or nil if not currently connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>A list of all supported video formats by this manager</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)pixelBufferPool":{"name":"pixelBufferPool","abstract":"<p>The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)requestedEncryptionType":{"name":"requestedEncryptionType","abstract":"<p>The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)showVideoBackgroundDisplay":{"name":"showVideoBackgroundDisplay","abstract":"<p>When YES, the StreamingMediaManager will send a black screen with &ldquo;Video Backgrounded String&rdquo;. Defaults to YES.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)initWithConnectionManager:configuration:systemCapabilityManager:":{"name":"-initWithConnectionManager:configuration:systemCapabilityManager:","abstract":"<p>Create a new streaming media manager for navigation and projection apps with a specified configuration.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startWithProtocol:":{"name":"-startWithProtocol:","abstract":"<p>Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopAudio":{"name":"-stopAudio","abstract":"<p>Stop the audio feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopVideo":{"name":"-stopVideo","abstract":"<p>Stop the video feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:":{"name":"-sendVideoData:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:presentationTimestamp:":{"name":"-sendVideoData:presentationTimestamp:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)maximumDesiredEncryption":{"name":"maximumDesiredEncryption","abstract":"<p>What encryption level video/audio streaming should be. The default is SDLStreamingEncryptionFlagAuthenticateAndEncrypt.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)customVideoEncoderSettings":{"name":"customVideoEncoderSettings","abstract":"<p>Properties to use for applications that utilize the video encoder for streaming. See VTCompressionProperties.h for more details. For example, you can set kVTCompressionPropertyKey_ExpectedFrameRate to set your framerate. Setting the framerate this way will also set the framerate if you use CarWindow automatic streaming.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)dataSource":{"name":"dataSource","abstract":"<p>Usable to change run time video stream setup behavior. Only use this and modify the results if you <em>really</em> know what you&rsquo;re doing. The head unit defaults are generally good.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController":{"name":"rootViewController","abstract":"<p>Set the initial view controller your video streaming content is within.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)carWindowRenderingType":{"name":"carWindowRenderingType","abstract":"<p>Declares if CarWindow will use layer rendering or view rendering. Defaults to layer rendering.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)enableForcedFramerateSync":{"name":"enableForcedFramerateSync","abstract":"<p>When YES, the StreamingMediaManager will run a CADisplayLink with the framerate set to the video encoder settings kVTCompressionPropertyKey_ExpectedFrameRate. This then forces TouchManager (and CarWindow, if used) to sync their callbacks to the framerate. If using CarWindow, this <em>must</em> be YES. If NO, <code>enableSyncedPanning</code> on SDLTouchManager will be set to NO. Defaults to YES.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)allowMultipleViewControllerOrientations":{"name":"allowMultipleViewControllerOrientations","abstract":"<p>When YES, the StreamingMediaManager will disable its internal checks that the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController\">rootViewController</a></code> only has one <code>supportedOrientation</code>. Having multiple orientations can cause streaming issues. If you wish to disable this check, set it to YES. Defaults to NO.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)init":{"name":"-init","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfiguration":{"name":"+secureConfiguration","abstract":"<p>Create a secure video streaming configuration. Security managers will be provided from SDLEncryptionConfiguration and the encryption flag will be set to SDLStreamingEncryptionFlagAuthenticateAndEncrypt. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:dataSource:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)insecureConfiguration":{"name":"+insecureConfiguration","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually. This is equivalent to <code>init</code>.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingInsecureConfigurationWithInitialViewController:":{"name":"+autostreamingInsecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow insecure configuration with a view controller</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingSecureConfigurationWithInitialViewController:":{"name":"+autostreamingSecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow secure configuration with a view controller.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(im)initWithCountryCode:fccFacilityId:":{"name":"-initWithCountryCode:fccFacilityId:","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)countryCode":{"name":"countryCode","abstract":"<p>@abstract Binary Representation of ITU Country Code. USA Code is 001.</p>","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)fccFacilityId":{"name":"fccFacilityId","abstract":"<p>@abstract Binary representation of unique facility ID assigned by the FCC","parent_name":"SDLStationIDNumber"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithTimeInterval:":{"name":"-initWithTimeInterval:","abstract":"<p>Create a time struct with a time interval (time in seconds). Fractions of the second will be eliminated and rounded down.</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithHours:minutes:seconds:":{"name":"-initWithHours:minutes:seconds:","abstract":"<p>Create a time struct with hours, minutes, and seconds</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)hours":{"name":"hours","abstract":"<p>The hour of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)minutes":{"name":"minutes","abstract":"<p>The minute of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)seconds":{"name":"seconds","abstract":"<p>The second of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(im)initWithEscSystem:trailerSwayControl:":{"name":"-initWithEscSystem:trailerSwayControl:","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)escSystem":{"name":"escSystem","abstract":"<p>true if vehicle stability control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)trailerSwayControl":{"name":"trailerSwayControl","abstract":"<p>true if vehicle trailer sway control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTS:":{"name":"-initWithTTS:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTSChunks:":{"name":"-initWithTTSChunks:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of TTSChunk structs which, taken together, specify the phrase to be spoken</p>","parent_name":"SDLSpeak"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)name":{"name":"name","abstract":"<p>The name of this soft button state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)artwork":{"name":"artwork","abstract":"<p>The artwork to be used with this button or nil if it is text-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)text":{"name":"text","abstract":"<p>The text to be used with this button or nil if it is image-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)highlighted":{"name":"highlighted","abstract":"<p>Whether or not the button should be highlighted on the UI</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)systemAction":{"name":"systemAction","abstract":"<p>A special system action</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)softButton":{"name":"softButton","abstract":"<p>An SDLSoftButton describing this state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:image:":{"name":"-initWithStateName:text:image:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:artwork:":{"name":"-initWithStateName:text:artwork:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)name":{"name":"name","abstract":"<p>The name of this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states":{"name":"states","abstract":"<p>All states available to this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentState":{"name":"currentState","abstract":"<p>The name of the current state of this soft button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentStateSoftButton":{"name":"currentStateSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)eventHandler":{"name":"eventHandler","abstract":"<p>The handler to be called when the button is in the current state and is pressed</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:states:initialStateName:handler:":{"name":"-initWithName:states:initialStateName:handler:","abstract":"<p>Create a multi-state (or single-state, but you should use initWithName:state: instead for that case) soft button. For example, a button that changes its image or text, such as a repeat or shuffle button.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:state:handler:":{"name":"-initWithName:state:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:text:artwork:handler:":{"name":"-initWithName:text:artwork:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToStateNamed:":{"name":"-transitionToStateNamed:","abstract":"<p>Transition the soft button to another state in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property. The wrapper considers all transitions valid (assuming a state with that name exists).</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToNextState":{"name":"-transitionToNextState","abstract":"<p>Transition the soft button to the next state of the array set when in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)stateWithName:":{"name":"-stateWithName:","abstract":"<p>Return a state from the state array with a specific name.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>The button supports a short press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>The button supports a LONG press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>The button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)imageSupported":{"name":"imageSupported","abstract":"<p>The button supports referencing a static or dynamic image.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)textSupported":{"name":"textSupported","abstract":"<p>The button supports the use of text. If not included, the default value should be considered true that the button will support text.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithType:text:image:highlighted:buttonId:systemAction:handler:":{"name":"-initWithType:text:image:highlighted:buttonId:systemAction:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)handler":{"name":"handler","abstract":"<p>A handler that may optionally be run when the SDLSoftButton has a corresponding notification occur.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)type":{"name":"type","abstract":"<p>Describes whether this soft button displays only text, only an image, or both</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)text":{"name":"text","abstract":"<p>Optional text to display (if defined as TEXT or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)image":{"name":"image","abstract":"<p>Optional image struct for SoftButton (if defined as IMAGE or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)isHighlighted":{"name":"isHighlighted","abstract":"<p>Displays in an alternate mode, e.g. with a colored background or foreground. Depends on the IVI system.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)softButtonID":{"name":"softButtonID","abstract":"<p>Value which is returned via OnButtonPress / OnButtonEvent</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)systemAction":{"name":"systemAction","abstract":"<p>Parameter indicating whether selecting a SoftButton shall call a specific system action. This is intended to allow Notifications to bring the callee into full / focus; or in the case of persistent overlays, the overlay can persist when a SoftButton is pressed.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSliderResponse.html#/c:objc(cs)SDLSliderResponse(py)sliderPosition":{"name":"sliderPosition","abstract":"<p>The selected position of the slider.</p>","parent_name":"SDLSliderResponse"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:":{"name":"-initWithNumTicks:position:","abstract":"<p>Creates a slider with only the number of ticks and position. Note that this is not enough to get a SUCCESS response. You must supply additional data. See below for required parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooter:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooter:timeout:","abstract":"<p>Creates a slider with all required data and a static footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:","abstract":"<p>Creates an slider with all required data and a dynamic footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)numTicks":{"name":"numTicks","abstract":"<p>Represents a number of selectable items on a horizontal axis.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)position":{"name":"position","abstract":"<p>Initial position of slider control (cannot exceed numTicks).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderHeader":{"name":"sliderHeader","abstract":"<p>Text header to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderFooter":{"name":"sliderFooter","abstract":"<p>Text footer to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. sliding control resets timeout). If omitted, the value is set to 10 seconds.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific slider to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLSlider"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)status":{"name":"status","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)monitoringSystemStatus":{"name":"monitoringSystemStatus","abstract":"<p>The status of TPMS for this particular tire</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)pressure":{"name":"pressure","abstract":"<p>The pressure value of this particular tire in kPa (kilopascals)</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(im)initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:":{"name":"-initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:","abstract":"<p>Convenience init to create navigation directions</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText1":{"name":"navigationText1","abstract":"<p>The first line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText2":{"name":"navigationText2","abstract":"<p>The second line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)eta":{"name":"eta","abstract":"<p>Estimated Time of Arrival time at final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)timeToDestination":{"name":"timeToDestination","abstract":"<p>The amount of time needed to reach the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)totalDistance":{"name":"totalDistance","abstract":"<p>The distance to the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)turnIcon":{"name":"turnIcon","abstract":"<p>An icon to show with the turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)nextTurnIcon":{"name":"nextTurnIcon","abstract":"<p>An icon to show with the next turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuver":{"name":"distanceToManeuver","abstract":"<p>Fraction of distance till next maneuver (starting from when AlertManeuver is triggered). Used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuverScale":{"name":"distanceToManeuverScale","abstract":"<p>Distance till next maneuver (starting from) from previous maneuver. Used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)maneuverComplete":{"name":"maneuverComplete","abstract":"<p>If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)softButtons":{"name":"softButtons","abstract":"<p>Three dynamic SoftButtons available (first SoftButton is fixed to &ldquo;Turns&rdquo;). If omitted on supported displays, the currently displayed SoftButton values will not change.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","abstract":"<p>Creates a ShowAppMenu RPC to open the app menu directly to a AddSubMenu RPC&rsquo;s submenu.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(py)menuID":{"name":"menuID","abstract":"<p>A Menu ID that identifies the AddSubMenu to open if it correlates with the AddSubMenu menuID parameter. If not set the top level menu will be opened.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:":{"name":"-initWithMainField1:mainField2:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:":{"name":"-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField1":{"name":"mainField1","abstract":"<p>The text displayed in a single-line display, or in the upper display","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField2":{"name":"mainField2","abstract":"<p>The text displayed on the second display line of a two-line display</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField3":{"name":"mainField3","abstract":"<p>The text displayed on the first display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField4":{"name":"mainField4","abstract":"<p>The text displayed on the second display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)alignment":{"name":"alignment","abstract":"<p>The alignment that Specifies how mainField1 and mainField2 text","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)statusBar":{"name":"statusBar","abstract":"<p>Text in the Status Bar</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaClock":{"name":"mediaClock","abstract":"<p>This property is deprecated use SetMediaClockTimer instead.","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaTrack":{"name":"mediaTrack","abstract":"<p>The text in the track field</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)graphic":{"name":"graphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)softButtons":{"name":"softButtons","abstract":"<p>The the Soft buttons defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)customPresets":{"name":"customPresets","abstract":"<p>The Custom Presets defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)metadataTags":{"name":"metadataTags","abstract":"<p>Text Field Metadata</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateConfiguration":{"name":"templateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateTitle":{"name":"templateTitle","abstract":"<p>The title of the current template.</p>","parent_name":"SDLShow"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)pauseWithPlayPauseIndicator:":{"name":"+pauseWithPlayPauseIndicator:","abstract":"<p>Pause an existing (counting up / down) media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:":{"name":"+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTime:endTime:playPauseIndicator:":{"name":"+updatePauseWithNewStartTime:endTime:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:":{"name":"+resumeWithPlayPauseIndicator:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)clearWithPlayPauseIndicator:":{"name":"+clearWithPlayPauseIndicator:","abstract":"<p>Remove a media clock timer from the screen</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:playPauseIndicator:":{"name":"-initWithUpdateMode:startTime:endTime:playPauseIndicator:","abstract":"<p>Create a SetMediaClockTimer RPC with all available parameters. It&rsquo;s recommended to use the specific initializers above.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)startTime":{"name":"startTime","abstract":"<p>A Start Time with specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)endTime":{"name":"endTime","abstract":"<p>An END time of type SDLStartTime, specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)updateMode":{"name":"updateMode","abstract":"<p>The media clock/timer update mode (COUNTUP/COUNTDOWN/PAUSE/RESUME)</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)audioStreamingIndicator":{"name":"audioStreamingIndicator","abstract":"<p>The audio streaming indicator used for a play/pause button.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetInteriorVehicleDataResponse.html#/c:objc(cs)SDLSetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The new module data for the requested module</p>","parent_name":"SDLSetInteriorVehicleDataResponse"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(im)initWithModuleData:":{"name":"-initWithModuleData:","abstract":"<p>Convenience init to change settings of a module</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The module data to set for the requested RC module.</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Initialize SetGlobalProperties with all possible items</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Convenience init for setting all possible global properties</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help prompt for when the user asks for help with an interface prompt</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Help prompt for when an interface prompt times out</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelpTitle":{"name":"vrHelpTitle","abstract":"<p>Sets a voice recognition Help Title</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelp":{"name":"vrHelp","abstract":"<p>Sets the items listed in the VR help screen used in an interaction started by Push to Talk</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuTitle":{"name":"menuTitle","abstract":"<p>Text for the menu button label</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuIcon":{"name":"menuIcon","abstract":"<p>Icon for the menu button</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)keyboardProperties":{"name":"keyboardProperties","abstract":"<p>On-screen keyboard (perform interaction) configuration</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)userLocation":{"name":"userLocation","abstract":"<p>Location of the user&rsquo;s seat. Default is driver&rsquo;s seat location if it is not set yet</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuLayout":{"name":"menuLayout","abstract":"<p>The main menu layout. If this is sent while a menu is already on-screen, the head unit will change the display to the new layout type. See available menu layouts on DisplayCapabilities.menuLayoutsAvailable. Defaults to the head unit default.</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>The display capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The soft button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>The preset bank capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:":{"name":"-initWithLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithPredefinedLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)displayLayout":{"name":"displayLayout","abstract":"<p>A display layout. Predefined or dynamically created screen layout.","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(py)properties":{"name":"properties","abstract":"<p>The new cloud application properties.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to set an image icon from a file name. The file must already be uploaded to the head unit.</p>","parent_name":"SDLSetAppIcon"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(py)syncFileName":{"name":"syncFileName","abstract":"<p>A file reference name","parent_name":"SDLSetAppIcon"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:":{"name":"-initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:","abstract":"<p>Create a <code>SendLocation</code> request with an address object, without Lat/Long coordinates.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate, not an address object</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate and an address object and let the nav system decide how to parse it</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>The longitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>The latitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationName":{"name":"locationName","abstract":"<p>Name / title of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description of the intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)deliveryMode":{"name":"deliveryMode","abstract":"<p>Mode in which the sendLocation request is sent</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)timeStamp":{"name":"timeStamp","abstract":"<p>Arrival time of Location. If multiple SendLocations are sent, this will be used for sorting as well.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address":{"name":"address","abstract":"<p>Address to be used for setting destination. Either the latitude / longitude OR the <code>address</code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(im)initWithHapticRectData:":{"name":"-initWithHapticRectData:","abstract":"<p>Constructs a new SDLSendHapticData object indicated by the hapticSpatialData parameter</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(py)hapticRectData":{"name":"hapticRectData","abstract":"<p>Array of spatial data structures that represent the locations of all user controls present on the HMI. This data should be updated if/when the application presents a new screen. When a request is sent, if successful, it will replace all spatial data previously sent through RPC. If an empty array is sent, the existing spatial data will be cleared</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:action:":{"name":"-initWithId:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:label:action:":{"name":"-initWithId:label:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)id":{"name":"id","abstract":"<p>@abstract id of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)label":{"name":"label","abstract":"<p>@abstract label of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)action":{"name":"action","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(im)initWithSeats:cols:rows:levels:":{"name":"-initWithSeats:cols:rows:levels:","abstract":"<p>Constructs a newly allocated SDLSeatLocationCapability object with all parameters</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)cols":{"name":"cols","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)rows":{"name":"rows","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)levels":{"name":"levels","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)seats":{"name":"seats","abstract":"<p>Contains a list of SeatLocation in the vehicle, the first element is the driver&rsquo;s seat","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocation.html#/c:objc(cs)SDLSeatLocation(py)grid":{"name":"grid","abstract":"<p>Optional</p>","parent_name":"SDLSeatLocation"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:":{"name":"-initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:","abstract":"<p>Convenience init for setting all possible seat control data</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:":{"name":"-initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)id":{"name":"id","abstract":"<p>@abstract id of seat that is a remote controllable seat.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingEnabled":{"name":"heatingEnabled","abstract":"<p>@abstract Whether or not heating is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingEnabled":{"name":"coolingEnabled","abstract":"<p>@abstract Whether or not cooling is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingLevel":{"name":"heatingLevel","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingLevel":{"name":"coolingLevel","abstract":"<p>@abstract cooling level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)horizontalPosition":{"name":"horizontalPosition","abstract":"<p>@abstract horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)verticalPosition":{"name":"verticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)frontVerticalPosition":{"name":"frontVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backVerticalPosition":{"name":"backVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backTiltAngle":{"name":"backTiltAngle","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportHorizontalPosition":{"name":"headSupportHorizontalPosition","abstract":"<p>@abstract head Support Horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportVerticalPosition":{"name":"headSupportVerticalPosition","abstract":"<p>@abstract head Support Vertical Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageEnabled":{"name":"massageEnabled","abstract":"<p>@abstract Whether or not massage is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract Array of massage mode data.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageCushionFirmness":{"name":"massageCushionFirmness","abstract":"<p>@abstract Array of firmness of a cushion.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)memory":{"name":"memory","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:":{"name":"-initWithName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with moduleName and moduleInfo</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with all parameters</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingEnabledAvailable":{"name":"heatingEnabledAvailable","abstract":"<p>@abstract Whether or not heating is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingEnabledAvailable":{"name":"coolingEnabledAvailable","abstract":"<p>@abstract Whether or not cooling is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingLevelAvailable":{"name":"heatingLevelAvailable","abstract":"<p>@abstract Whether or not heating level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingLevelAvailable":{"name":"coolingLevelAvailable","abstract":"<p>@abstract Whether or not cooling level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)horizontalPositionAvailable":{"name":"horizontalPositionAvailable","abstract":"<p>@abstract Whether or not horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)verticalPositionAvailable":{"name":"verticalPositionAvailable","abstract":"<p>@abstract Whether or not vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)frontVerticalPositionAvailable":{"name":"frontVerticalPositionAvailable","abstract":"<p>@abstract Whether or not front Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backVerticalPositionAvailable":{"name":"backVerticalPositionAvailable","abstract":"<p>@abstract Whether or not back Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backTiltAngleAvailable":{"name":"backTiltAngleAvailable","abstract":"<p>@abstract Whether or not backTilt Angle Available is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportHorizontalPositionAvailable":{"name":"headSupportHorizontalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportVerticalPositionAvailable":{"name":"headSupportVerticalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageEnabledAvailable":{"name":"massageEnabledAvailable","abstract":"<p>@abstract Whether or not massage Enabled is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageModeAvailable":{"name":"massageModeAvailable","abstract":"<p>@abstract Whether or not massage Mode is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageCushionFirmnessAvailable":{"name":"massageCushionFirmnessAvailable","abstract":"<p>@abstract Whether or not massage Cushion Firmness is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)memoryAvailable":{"name":"memoryAvailable","abstract":"<p>@abstract Whether or not memory is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>@abstract Information about a RC module, including its id.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:":{"name":"-initWithMessage:","abstract":"<p>Convenience init for creating a scrolling message with text.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:timeout:softButtons:cancelID:":{"name":"-initWithMessage:timeout:softButtons:cancelID:","abstract":"<p>Convenience init for creating a scrolling message with text and buttons.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)scrollableMessageBody":{"name":"scrollableMessageBody","abstract":"<p>Body of text that can include newlines and tabs.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. scrolling message resets timeout). If not set, a default value of 30 seconds is used by Core.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed scrollable message. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton will be displayed.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific scrollable message to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)resolution":{"name":"resolution","abstract":"<p>The resolution of the prescribed screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)touchEventAvailable":{"name":"touchEventAvailable","abstract":"<p>Types of screen touch events available in screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1":{"name":"textField1","abstract":"<p>The top text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2":{"name":"textField2","abstract":"<p>The second text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3":{"name":"textField3","abstract":"<p>The third text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4":{"name":"textField4","abstract":"<p>The fourth text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)mediaTrackTextField":{"name":"mediaTrackTextField","abstract":"<p>The media text field available within the media layout. Often less emphasized than textField(1-4)</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)primaryGraphic":{"name":"primaryGraphic","abstract":"<p>The primary graphic within a template layout</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>A secondary graphic used in some template layouts</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textAlignment":{"name":"textAlignment","abstract":"<p>What alignment textField(1-4) should use</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1Type":{"name":"textField1Type","abstract":"<p>The type of data textField1 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2Type":{"name":"textField2Type","abstract":"<p>The type of data textField2 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3Type":{"name":"textField3Type","abstract":"<p>The type of data textField3 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4Type":{"name":"textField4Type","abstract":"<p>The type of data textField4 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)title":{"name":"title","abstract":"<p>The title of the current template layout.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)softButtonObjects":{"name":"softButtonObjects","abstract":"<p>The current list of soft buttons within a template layout. Set this array to change the displayed soft buttons.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menuConfiguration":{"name":"menuConfiguration","abstract":"<p>Configures the layout of the menu and sub-menus. If set after a menu already exists, the existing main menu layout will be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menu":{"name":"menu","abstract":"<p>The current list of menu cells displayed in the app&rsquo;s menu.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)dynamicMenuUpdatesMode":{"name":"dynamicMenuUpdatesMode","abstract":"<p>Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The current list of voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)keyboardConfiguration":{"name":"keyboardConfiguration","abstract":"<p>The default keyboard configuration, this can be additionally customized by each SDLKeyboardDelegate.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)preloadedChoices":{"name":"preloadedChoices","abstract":"<p>Cells will be hashed by their text, image names, and VR command text. When assembling an SDLChoiceSet, you can pull objects from here, or recreate them. The preloaded versions will be used so long as their text, image names, and VR commands are the same.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Starts the manager and all sub-managers</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)beginUpdates":{"name":"-beginUpdates","abstract":"<p>Delays all screen updates until endUpdatesWithCompletionHandler: is called.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdates":{"name":"-endUpdates","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)changeLayout:withCompletionHandler:":{"name":"-changeLayout:withCompletionHandler:","abstract":"<p>Change the current layout to a new layout and optionally update the layout&rsquo;s night and day color schemes. The values set for the text, graphics, buttons and template title persist between layout changes. To update the text, graphics, buttons and template title at the same time as the template, batch all the updates between <code>beginUpdates</code> and <code>endUpdates</code>. If the layout update fails while batching, then the updated text, graphics, buttons or template title will also not be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)softButtonObjectNamed:":{"name":"-softButtonObjectNamed:","abstract":"<p>Retrieve a SoftButtonObject based on its name.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withUpdateHandler:":{"name":"-subscribeButton:withUpdateHandler:","abstract":"<p>Subscribes to a subscribe button. The update handler will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the updateHandler.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withObserver:selector:":{"name":"-subscribeButton:withObserver:selector:","abstract":"<p>Subscribes to a subscribe button. The selector will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the selector.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)unsubscribeButton:withObserver:withCompletionHandler:":{"name":"-unsubscribeButton:withObserver:withCompletionHandler:","abstract":"<p>Unsubscribes to a subscribe button. Please note that if a subscribe button has multiple subscribers the observer will no longer get notifications, however, the app will still be subscribed to the hard button until the last subscriber is removed.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)preloadChoices:withCompletionHandler:":{"name":"-preloadChoices:withCompletionHandler:","abstract":"<p>Preload cells to the head unit. This will <em>greatly</em> reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You <em>do not</em> need to wait until the completion handler is called to present a choice set containing choices being loaded. The choice set will wait until the preload completes and then immediately present.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)deleteChoices:":{"name":"-deleteChoices:","abstract":"<p>Delete loaded cells from the head unit. If the cells don&rsquo;t exist on the head unit they will be ignored.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentChoiceSet:mode:":{"name":"-presentChoiceSet:mode:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentSearchableChoiceSet:mode:withKeyboardDelegate:":{"name":"-presentSearchableChoiceSet:mode:withKeyboardDelegate:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentKeyboardWithInitialText:delegate:":{"name":"-presentKeyboardWithInitialText:delegate:","abstract":"<p>Present a keyboard-only interface to the user and receive input. The user will be able to input text in the keyboard when in a non-driver distraction situation.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)dismissKeyboardWithCancelID:":{"name":"-dismissKeyboardWithCancelID:","abstract":"<p>Cancels the keyboard-only interface if it is currently showing. If the keyboard has not yet been sent to Core, it will not be sent.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openMenu":{"name":"-openMenu","abstract":"<p>Present the top-level of your application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openSubmenu:":{"name":"-openSubmenu:","abstract":"<p>Present the application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden. You must update the menu with the proper cells before calling this method. This RPC will fail if the cell does not contain a sub menu, or is not in the menu array.</p>","parent_name":"SDLScreenManager"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(im)initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:":{"name":"-initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:","abstract":"<p>Convenience init to SISData</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationShortName":{"name":"stationShortName","abstract":"<p>@abstract Identifies the 4-alpha-character station call sign","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationIDNumber":{"name":"stationIDNumber","abstract":"<p>@abstract Used for network Application.","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLongName":{"name":"stationLongName","abstract":"<p>@abstract Identifies the station call sign or other identifying","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLocation":{"name":"stationLocation","abstract":"<p>@abstract Provides the 3-dimensional geographic station location</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationMessage":{"name":"stationMessage","abstract":"<p>@abstract May be used to convey textual information of general interest","parent_name":"SDLSISData"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init to reset global properties.</p>","parent_name":"SDLResetGlobalProperties"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(py)properties":{"name":"properties","abstract":"<p>An array of one or more GlobalProperty enumeration elements","parent_name":"SDLResetGlobalProperties"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:","abstract":"<p>Constructs a newly allocated SDLRemoteControlCapabilities object with given parameters</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)climateControlCapabilities":{"name":"climateControlCapabilities","abstract":"<p>If included, the platform supports RC climate controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)radioControlCapabilities":{"name":"radioControlCapabilities","abstract":"<p>If included, the platform supports RC radio controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>If included, the platform supports RC button controls with the included button names.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)seatControlCapabilities":{"name":"seatControlCapabilities","abstract":"<p>If included, the platform supports seat controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)audioControlCapabilities":{"name":"audioControlCapabilities","abstract":"<p>If included, the platform supports audio controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)hmiSettingsControlCapabilities":{"name":"hmiSettingsControlCapabilities","abstract":"<p>If included, the platform supports hmi setting controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)lightControlCapabilities":{"name":"lightControlCapabilities","abstract":"<p>If included, the platform supports light controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to release a controlled module</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the negotiated version number of the SmartDeviceLink protocol that is to be supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)language":{"name":"language","abstract":"<p>The currently active VR+TTS language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>The currently active display language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contains information about the display&rsquo;s capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>Contains information about the head unit button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>Contains information about the head unit soft button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<p>Contains information about the HMI zone capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<p>Contains information about the text-to-speech capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)prerecordedSpeech":{"name":"prerecordedSpeech","abstract":"<p>Contains a list of prerecorded speech items present on the platform.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vrCapabilities":{"name":"vrCapabilities","abstract":"<p>Contains information about the VR capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for PerformAudioPassThru, e.g. {8kHz,8-bit,PCM}. The audio is recorded in monaural.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)pcmStreamCapabilities":{"name":"pcmStreamCapabilities","abstract":"<p>Describes different audio type configurations for the audio PCM stream service, e.g. {8kHz,8-bit,PCM}</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vehicleType":{"name":"vehicleType","abstract":"<p>Specifies the connected vehicle&rsquo;s type.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)supportedDiagModes":{"name":"supportedDiagModes","abstract":"<p>Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<p>Specifies the HMI capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlVersion":{"name":"sdlVersion","abstract":"<p>The version of SDL Core running on the connected head unit</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The software version of the system that implements the SmartDeviceLink core.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)iconResumed":{"name":"iconResumed","abstract":"<p>Existence of apps icon at system. If true, apps icon was resumed at system. If false, apps icon is not resumed at system.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithLifecycleConfiguration:":{"name":"-initWithLifecycleConfiguration:","abstract":"<p>Convenience init for registering the application with a lifecycle configuration.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:":{"name":"-initWithAppName:appId:languageDesired:","abstract":"<p>Convenience init for registering the application with an app name, app id, and desired language.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:":{"name":"-initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init for registering the application with all possible options.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the version number of the SmartDeviceLink protocol that is supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appName":{"name":"appName","abstract":"<p>The mobile application&rsquo;s name. This name is displayed in the SDL Mobile Applications menu. It also serves as the unique identifier of the application for SmartDeviceLink. Applications with the same name will be rejected.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ttsName":{"name":"ttsName","abstract":"<p>Text-to-speech string for voice recognition of the mobile application name. Meant to overcome any failing on speech engine in properly pronouncing / understanding app name.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Provides an abbreviated version of the app name (if needed), that will be displayed on head units that support very few characters. If not provided, the appName is used instead (and will be truncated if too long). It&rsquo;s recommended that this string be no longer than 5 characters.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Defines additional voice recognition commands</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)isMediaApplication":{"name":"isMediaApplication","abstract":"<p>Indicates if the application is a media or a non-media application. Media applications will appear in the head unit&rsquo;s media source list and can use the <code>MEDIA</code> template.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)languageDesired":{"name":"languageDesired","abstract":"<p>App&rsquo;s starting VR+TTS language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hmiDisplayLanguageDesired":{"name":"hmiDisplayLanguageDesired","abstract":"<p>Current app&rsquo;s expected display language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appHMIType":{"name":"appHMIType","abstract":"<p>List of all applicable app HMI types stating which HMI classifications to be given to the app.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hashID":{"name":"hashID","abstract":"<p>ID used to uniquely identify a previous state of all app data that can persist through connection cycles (e.g. ignition cycles). This registered data (commands, submenus, choice sets, etc.) can be reestablished without needing to explicitly re-send each piece. If omitted, then the previous state of an app&rsquo;s commands, etc. will not be restored.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)deviceInfo":{"name":"deviceInfo","abstract":"<p>Information about the connecting device.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appID":{"name":"appID","abstract":"<p>ID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)fullAppID":{"name":"fullAppID","abstract":"<p>A full UUID appID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appInfo":{"name":"appInfo","abstract":"<p>Contains detailed information about the registered application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithX:y:width:height:":{"name":"-initWithX:y:width:height:","abstract":"<p>Create a Rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithCGRect:":{"name":"-initWithCGRect:","abstract":"<p>Create a Rectangle from a CGRect</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)x":{"name":"x","abstract":"<p>The X-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)y":{"name":"y","abstract":"<p>The Y-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)width":{"name":"width","abstract":"<p>The width of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)height":{"name":"height","abstract":"<p>The height of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLReadDIDResponse.html#/c:objc(cs)SDLReadDIDResponse(py)didResult":{"name":"didResult","abstract":"<p>Array of requested DID results (with data if available).</p>","parent_name":"SDLReadDIDResponse"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(im)initWithECUName:didLocation:":{"name":"-initWithECUName:didLocation:","abstract":"<p>Convenience init</p>","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)ecuName":{"name":"ecuName","abstract":"<p>An ID of the vehicle module","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)didLocation":{"name":"didLocation","abstract":"<p>Raw data from vehicle data DID location(s)","parent_name":"SDLReadDID"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initFMWithFrequencyInteger:frequencyFraction:hdChannel:":{"name":"-initFMWithFrequencyInteger:frequencyFraction:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initAMWithFrequencyInteger:hdChannel:":{"name":"-initAMWithFrequencyInteger:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initXMWithFrequencyInteger:":{"name":"-initXMWithFrequencyInteger:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyInteger":{"name":"frequencyInteger","abstract":"<p>The integer part of the frequency ie for 101.7 this value should be 101</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyFraction":{"name":"frequencyFraction","abstract":"<p>The fractional part of the frequency for 101.7 is 7</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)band":{"name":"band","abstract":"<p>Radio band value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)rdsData":{"name":"rdsData","abstract":"<p>Read only parameter. See RDSData data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDs":{"name":"availableHDs","abstract":"<p>number of HD sub-channels if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDChannels":{"name":"availableHDChannels","abstract":"<p>the list of available hd sub-channel indexes, empty list means no Hd channel is available, read-only</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdChannel":{"name":"hdChannel","abstract":"<p>Current HD sub-channel if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalStrength":{"name":"signalStrength","abstract":"<p>Signal Strength Value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalChangeThreshold":{"name":"signalChangeThreshold","abstract":"<p>If the signal strength falls below the set value for this parameter, the radio will tune to an alternative frequency</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)radioEnable":{"name":"radioEnable","abstract":"<p>True if the radio is on, false is the radio is off. When the radio is disabled, no data other than radioEnable is included in a GetInteriorVehicleData response</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)state":{"name":"state","abstract":"<p>Read only parameter. See RadioState data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdRadioEnable":{"name":"hdRadioEnable","abstract":"<p>True if the hd radio is on, false is the radio is off</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)sisData":{"name":"sisData","abstract":"<p>Read Read-only Station Information Service (SIS) data provides basic information","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>The short friendly name of the radio control module.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioEnableAvailable":{"name":"radioEnableAvailable","abstract":"<p>Availability of the control of enable/disable radio.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioBandAvailable":{"name":"radioBandAvailable","abstract":"<p>Availability of the control of radio band.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioFrequencyAvailable":{"name":"radioFrequencyAvailable","abstract":"<p>Availability of the control of radio frequency.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdChannelAvailable":{"name":"hdChannelAvailable","abstract":"<p>Availability of the control of HD radio channel.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)rdsDataAvailable":{"name":"rdsDataAvailable","abstract":"<p>Availability of the getting Radio Data System (RDS) data.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDsAvailable":{"name":"availableHDsAvailable","abstract":"<p>Availability of the getting the number of available HD channels.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDChannelsAvailable":{"name":"availableHDChannelsAvailable","abstract":"<p>Availability of the list of available HD sub-channel indexes.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)stateAvailable":{"name":"stateAvailable","abstract":"<p>Availability of the getting the Radio state.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalStrengthAvailable":{"name":"signalStrengthAvailable","abstract":"<p>Availability of the getting the signal strength.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalChangeThresholdAvailable":{"name":"signalChangeThresholdAvailable","abstract":"<p>Availability of the getting the signal Change Threshold</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdRadioEnableAvailable":{"name":"hdRadioEnableAvailable","abstract":"<p>Availability of the control of enable/disable HD radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)siriusXMRadioAvailable":{"name":"siriusXMRadioAvailable","abstract":"<p>Availability of sirius XM radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)sisDataAvailable":{"name":"sisDataAvailable","abstract":"<p>Availability of the getting HD radio Station Information Service (SIS) data.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)store":{"name":"store","abstract":"<p>The store that contains RPC data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)payloadProtected":{"name":"payloadProtected","abstract":"<p>Declares if the RPC payload ought to be protected</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)serializeAsDictionary:":{"name":"-serializeAsDictionary:","abstract":"<p>Converts struct to JSON formatted data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(py)response":{"name":"response","abstract":"<p>The response to be included within the userinfo dictionary</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)initWithName:object:rpcResponse:":{"name":"-initWithName:object:rpcResponse:","abstract":"<p>Create an NSNotification object containing an SDLRPCResponse</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseMemberOfClass:":{"name":"-isResponseMemberOfClass:","abstract":"<p>Returns whether or not the containing response is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseKindOfClass:":{"name":"-isResponseKindOfClass:","abstract":"<p>Returns whether or not the containing response is a kind of class, including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)correlationID":{"name":"correlationID","abstract":"<p>The correlation id of the corresponding SDLRPCRequest.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)success":{"name":"success","abstract":"<p>Whether or not the SDLRPCRequest was successful.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)resultCode":{"name":"resultCode","abstract":"<p>The result of the SDLRPCRequest. If the request failed, the result code contains the failure reason.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)info":{"name":"info","abstract":"<p>More detailed success or error message.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(py)request":{"name":"request","abstract":"<p>The request to be included in the userinfo dictionary</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)initWithName:object:rpcRequest:":{"name":"-initWithName:object:rpcRequest:","abstract":"<p>Create an NSNotification object containing an SDLRPCRequest</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestMemberOfClass:":{"name":"-isRequestMemberOfClass:","abstract":"<p>Returns whether or not the containing request is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestKindOfClass:":{"name":"-isRequestKindOfClass:","abstract":"<p>Returns whether or not the containing request is a kind of class, including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequest.html#/c:objc(cs)SDLRPCRequest(py)correlationID":{"name":"correlationID","abstract":"<p>A unique id assigned to message sent to Core. The Correlation ID is used to map a request to its response.</p>","parent_name":"SDLRPCRequest"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcAllowed":{"name":"rpcAllowed","abstract":"<p>Whether or not the RPC is allowed.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcParameters":{"name":"rpcParameters","abstract":"<p>Holds a dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(im)initWithRPCName:isRPCAllowed:rpcParameters:":{"name":"-initWithRPCName:isRPCAllowed:rpcParameters:","abstract":"<p>Initializes a SDLRPCPermissionStatus object.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(py)notification":{"name":"notification","abstract":"<p>The notification within the userinfo dictionary</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)initWithName:object:rpcNotification:":{"name":"-initWithName:object:rpcNotification:","abstract":"<p>Create an NSNotification object caontaining an SDLRPCNotification</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationMemberOfClass:":{"name":"-isNotificationMemberOfClass:","abstract":"<p>Returns whether or not the containing notification is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationKindOfClass:":{"name":"-isNotificationKindOfClass:","abstract":"<p>Returns whether or not the containing notification is a kind of class, including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setFunctionName:":{"name":"-setFunctionName:","abstract":"<p>Sets the function name.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setParameters:value:":{"name":"-setParameters:value:","abstract":"<p>Sets a key-value pair using the function name as the key.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)bulkData":{"name":"bulkData","abstract":"<p>The data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)name":{"name":"name","abstract":"<p>The name of the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)parameters":{"name":"parameters","abstract":"<p>The JSON-RPC parameters</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)messageType":{"name":"messageType","abstract":"<p>The type of data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithRed:green:blue:":{"name":"-initWithRed:green:blue:","abstract":"<p>Create an SDL color object with red / green / blue values between 0-255</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithColor:":{"name":"-initWithColor:","abstract":"<p>Create an SDL color object with a UIColor object.</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)red":{"name":"red","abstract":"<p>The red value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)green":{"name":"green","abstract":"<p>The green value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)blue":{"name":"blue","abstract":"<p>The blue value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(im)initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:":{"name":"-initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:","abstract":"<p>Convenience init</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programService":{"name":"programService","abstract":"<p>Program Service Name</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)radioText":{"name":"radioText","abstract":"<p>Radio Text</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)clockText":{"name":"clockText","abstract":"<p>The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programIdentification":{"name":"programIdentification","abstract":"<p>Program Identification - the call sign for the radio station</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programType":{"name":"programType","abstract":"<p>The program type - The region should be used to differentiate between EU","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficProgramIdentification":{"name":"trafficProgramIdentification","abstract":"<p>Traffic Program Identification - Identifies a station that offers traffic</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficAnnouncementIdentification":{"name":"trafficAnnouncementIdentification","abstract":"<p>Traffic Announcement Identification - Indicates an ongoing traffic announcement</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)region":{"name":"region","abstract":"<p>Region</p>","parent_name":"SDLRDSData"},"Classes/SDLPutFileResponse.html#/c:objc(cs)SDLPutFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available in SDL Core for the registered app. If the transfer has systemFile enabled, then the value will be set to 0 automatically.</p>","parent_name":"SDLPutFileResponse"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)init":{"name":"-init","abstract":"<p>Init</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:":{"name":"-initWithFileName:fileType:","abstract":"<p>Convenience init for creating a putfile with a name and file format.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:":{"name":"-initWithFileName:fileType:persistentFile:","abstract":"<p>Convenience init for creating a putfile with a name, file format, and persistance.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload. A CRC checksum is calculated for the bulk data.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)sdlFileName":{"name":"sdlFileName","abstract":"<p>File reference name</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)fileType":{"name":"fileType","abstract":"<p>A FileType value representing a selected file type</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)persistentFile":{"name":"persistentFile","abstract":"<p>A value to indicates if the file is meant to persist between sessions / ignition cycles. If set to TRUE, then the system will aim to persist this file through session / cycles. While files with this designation will have priority over others, they are subject to deletion by the system at any time. In the event of automatic deletion by the system, the app will receive a rejection and have to resend the file. If omitted, the value will be set to false.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)systemFile":{"name":"systemFile","abstract":"<p>Indicates if the file is meant to be passed through core to elsewhere on the system. If set to TRUE, then the system will instead pass the data thru as it arrives to a predetermined area outside of core.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)offset":{"name":"offset","abstract":"<p>Offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)length":{"name":"length","abstract":"<p>Length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLPutFile"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(im)initWithAppServiceRecord:":{"name":"-initWithAppServiceRecord:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(py)appServiceRecord":{"name":"appServiceRecord","abstract":"<p>If the request was successful, this object will be the current status of the service record for the published service. This will include the Core supplied service ID.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(im)initWithAppServiceManifest:":{"name":"-initWithAppServiceManifest:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppService"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(py)appServiceManifest":{"name":"appServiceManifest","abstract":"<p>The manifest of the service that wishes to be published.","parent_name":"SDLPublishAppService"},"Classes/SDLPresetBankCapabilities.html#/c:objc(cs)SDLPresetBankCapabilities(py)onScreenPresetsAvailable":{"name":"onScreenPresetsAvailable","abstract":"<p>If Onscreen custom presets are available.</p>","parent_name":"SDLPresetBankCapabilities"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(im)initWithFirstTouch:secondTouch:":{"name":"-initWithFirstTouch:secondTouch:","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)firstTouch":{"name":"firstTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)secondTouch":{"name":"secondTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)distance":{"name":"distance","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)center":{"name":"center","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)isValid":{"name":"isValid","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(im)initWithDialNumber:":{"name":"-initWithDialNumber:","abstract":"<p>Convenience init for defining the phone capability</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(py)dialNumberEnabled":{"name":"dialNumberEnabled","abstract":"<p>Whether or not the DialNumber RPC is enabled.</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(py)requiresEncryption":{"name":"requiresEncryption","abstract":"<p>Flag indicating if the app requires an encryption service to be active.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLPermissionManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isRPCNameAllowed:":{"name":"-isRPCNameAllowed:","abstract":"<p>Determine if an individual RPC is allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)groupStatusOfRPCPermissions:":{"name":"-groupStatusOfRPCPermissions:","abstract":"<p>Determine if all RPCs are allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)statusesOfRPCPermissions:":{"name":"-statusesOfRPCPermissions:","abstract":"<p>Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber<BOOL> specifying if that RPC is currently allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)subscribeToRPCPermissions:groupType:withHandler:":{"name":"-subscribeToRPCPermissions:groupType:withHandler:","abstract":"<p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. Tthe callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeAllObservers":{"name":"-removeAllObservers","abstract":"<p>Remove every current observer</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeObserverForIdentifier:":{"name":"-removeObserverForIdentifier:","abstract":"<p>Remove block observers for the specified RPC</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)rpcNameRequiresEncryption:":{"name":"-rpcNameRequiresEncryption:","abstract":"<p>Check whether or not an RPC needs encryption.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isPermissionParameterAllowed:parameter:":{"name":"-isPermissionParameterAllowed:parameter:","abstract":"<p>Check whether a parameter of an RPC is allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC in the policy table.</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)hmiPermissions":{"name":"hmiPermissions","abstract":"<p>HMI Permissions for the individual RPC; i.e. which HMI levels may it be used in</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the RPC needs encryption</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(im)initWithRPCName:parameterPermissions:":{"name":"-initWithRPCName:parameterPermissions:","abstract":"<p>Creates a new permission element.</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)choiceID":{"name":"choiceID","abstract":"<p>ID of the choice that was selected in response to PerformInteraction. Only is valid if general result is &ldquo;success:true&rdquo;.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)manualTextEntry":{"name":"manualTextEntry","abstract":"<p>Manually entered text selection, e.g. through keyboard. Can be returned in lieu of choiceID, depending on the trigger source.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)triggerSource":{"name":"triggerSource","abstract":"<p>A <em>SDLTriggerSource</em> object which will be shown in the HMI. Only is valid if resultCode is SUCCESS.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:":{"name":"-initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:","abstract":"<p>Convenience init for creating a basic display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:":{"name":"-initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:","abstract":"<p>Convenience init for setting all parameters of a display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialText":{"name":"initialText","abstract":"<p>Text to be displayed first.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>This is the TTS prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionMode":{"name":"interactionMode","abstract":"<p>For application-requested interactions, this mode indicates the method in which the user is notified and uses the interaction. Users can choose either only by voice (VR_ONLY), by tactile selection from the menu (MANUAL_ONLY), or by either mode (BOTH).</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionChoiceSetIDList":{"name":"interactionChoiceSetIDList","abstract":"<p>List of interaction choice set IDs to use with an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help text. This is the spoken text when a user speaks &ldquo;help&rdquo; while the interaction is occurring.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Timeout text. This text is spoken when a VR interaction times out.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeout":{"name":"timeout","abstract":"<p>Timeout in milliseconds. Applies only to the menu portion of the interaction. The VR timeout will be handled by the platform. If omitted a standard value of 10 seconds is used.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)vrHelp":{"name":"vrHelp","abstract":"<p>Suggested voice recognition help items to display on-screen during a perform interaction. If omitted on supported displays, the default generated list of suggested choices shall be displayed.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionLayout":{"name":"interactionLayout","abstract":"<p>For tactile interaction modes (MANUAL_ONLY, or BOTH), the layout mode of how the choices are presented.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific perform interaction to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>initial prompt which will be spoken before opening the audio pass","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText1":{"name":"audioPassThruDisplayText1","abstract":"<p>a line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText2":{"name":"audioPassThruDisplayText2","abstract":"<p>A line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)samplingRate":{"name":"samplingRate","abstract":"<p>A samplingRate</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)maxDuration":{"name":"maxDuration","abstract":"<p>the maximum duration of audio recording in milliseconds</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>the quality the audio is recorded - 8 bit or 16 bit</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioType":{"name":"audioType","abstract":"<p>an audioType</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)muteAudio":{"name":"muteAudio","abstract":"<p>a Boolean value representing if the current audio source should be","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioDataHandler":{"name":"audioDataHandler","abstract":"<p>A handler that will be called whenever an <code>onAudioPassThru</code> notification is received.</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(im)initWithServiceSpecificResult:":{"name":"-initWithServiceSpecificResult:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(py)serviceSpecificResult":{"name":"serviceSpecificResult","abstract":"<p>The service can provide specific result strings to the consumer through this param.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:":{"name":"-initWithServiceUri:serviceID:originApp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:requestServiceActive:":{"name":"-initWithServiceUri:serviceID:originApp:requestServiceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceUri":{"name":"serviceUri","abstract":"<p>Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes no guarantee that this URI is correct.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceID":{"name":"serviceID","abstract":"<p>The service ID that the app consumer wishes to send this URI.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)originApp":{"name":"originApp","abstract":"<p>This string is the appID of the app requesting the app service provider take the specific action.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)requestServiceActive":{"name":"requestServiceActive","abstract":"<p>This flag signals the requesting consumer would like this service to become the active primary service of the destination&rsquo;s type.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all parameters that are permitted for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all parameters that are prohibited for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLOnWayPointChange.html#/c:objc(cs)SDLOnWayPointChange(py)waypoints":{"name":"waypoints","abstract":"<p>Location address for display purposes only</p>","parent_name":"SDLOnWayPointChange"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:updateSubCells:":{"name":"-initWithMenuID:updateSubCells:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)menuID":{"name":"menuID","abstract":"<p>This menuID must match a menuID in the current menu structure","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)updateSubCells":{"name":"updateSubCells","abstract":"<p>If not set, assume false. If true, the app should send AddCommands with parentIDs matching the menuID. These AddCommands will then be attached to the submenu and displayed if the submenu is selected.</p>","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(im)initWithFileName:":{"name":"-initWithFileName:","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(py)fileName":{"name":"fileName","abstract":"<p>File reference name.","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)type":{"name":"type","abstract":"<p>The type of touch event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)event":{"name":"event","abstract":"<p>List of all individual touches involved in this event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTBTClientState.html#/c:objc(cs)SDLOnTBTClientState(py)state":{"name":"state","abstract":"<p>Current State of TBT client</p>","parent_name":"SDLOnTBTClientState"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)url":{"name":"url","abstract":"<p>Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If not blank, the binary data shall be forwarded to the url with a provided timeout in seconds.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)timeout":{"name":"timeout","abstract":"<p>Optional timeout for HTTP requests Required if a URL is provided</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)fileType":{"name":"fileType","abstract":"<p>Optional file type (meant for HTTP file requests).</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(im)initWithSystemCapability:":{"name":"-initWithSystemCapability:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(py)systemCapability":{"name":"systemCapability","abstract":"<p>The system capability that has been updated.</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)URL":{"name":"URL","abstract":"<p>The url</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>How long until a timeout</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allocatedModules":{"name":"allocatedModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)freeModules":{"name":"freeModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that are free to access for the application.</p>","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allowed":{"name":"allowed","abstract":"<p>Issued by SDL to notify the application about remote control status change on SDL","parent_name":"SDLOnRCStatus"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)permissionItem":{"name":"permissionItem","abstract":"<p>Describes change in permissions for a given set of RPCs</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the app needs the encryption permission</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)language":{"name":"language","abstract":"<p>Current SDL voice engine (VR+TTS) language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>Current display language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)event":{"name":"event","abstract":"<p>The type of keyboard input</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)data":{"name":"data","abstract":"<p>The current keyboard string input from the user</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnInteriorVehicleData.html#/c:objc(cs)SDLOnInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The subscribed module data that changed</p>","parent_name":"SDLOnInteriorVehicleData"},"Classes/SDLOnHashChange.html#/c:objc(cs)SDLOnHashChange(py)hashID":{"name":"hashID","abstract":"<p>Calculated hash ID to be referenced during RegisterAppInterface request.</p>","parent_name":"SDLOnHashChange"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>SDLHMILevel in effect for the application</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>Current state of audio streaming for the application. When this parameter has a value of NOT_AUDIBLE, the application must stop streaming audio to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)videoStreamingState":{"name":"videoStreamingState","abstract":"<p>Current availablility of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)systemContext":{"name":"systemContext","abstract":"<p>Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended for. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(im)initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:":{"name":"-initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:","abstract":"<p>Initialize an SDLOnHMIStatus RPC with initial parameters</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)URL":{"name":"URL","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded to the provided URL.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded with the provided timeout in seconds.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)state":{"name":"state","abstract":"<p>The driver distraction state (i.e. whether driver distraction rules are in effect, or not)</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalEnabled":{"name":"lockScreenDismissalEnabled","abstract":"<p>If enabled, the lock screen will be able to be dismissed while connected to SDL, allowing users the ability to interact with the app.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalWarning":{"name":"lockScreenDismissalWarning","abstract":"<p>Warning message to be displayed on the lock screen when dismissal is enabled. This warning should be used to ensure that the user is not the driver of the vehicle, ex. <code>Swipe up to dismiss, acknowledging that you are not the driver.</code>. This parameter must be present if &ldquo;lockScreenDismissalEnabled&rdquo; is set to true.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)cmdID":{"name":"cmdID","abstract":"<p>The command ID of the command the user selected. This is the command ID value provided by the application in the SDLAddCommand operation that created the command.</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)triggerSource":{"name":"triggerSource","abstract":"<p>Indicates whether command was selected via voice or via a menu selection (using the OK button).</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The button&rsquo;s name</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonEventMode":{"name":"buttonEventMode","abstract":"<p>Indicates whether this is an UP or DOWN event</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(im)initWithServiceData:":{"name":"-initWithServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(py)serviceData":{"name":"serviceData","abstract":"<p>The updated app service data.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppInterfaceUnregistered.html#/c:objc(cs)SDLOnAppInterfaceUnregistered(py)reason":{"name":"reason","abstract":"<p>The reason application&rsquo;s interface was terminated</p>","parent_name":"SDLOnAppInterfaceUnregistered"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:","abstract":"<p>Convenience init to describe an oasis address</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:","abstract":"<p>Convenience init to describe an oasis address with all parameters</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryName":{"name":"countryName","abstract":"<p>Name of the country (localized)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryCode":{"name":"countryCode","abstract":"<p>countryCode of the country(ISO 3166-2)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)postalCode":{"name":"postalCode","abstract":"<p>postalCode of location (PLZ, ZIP, PIN, CAP etc.)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)administrativeArea":{"name":"administrativeArea","abstract":"<p>Portion of country (e.g. state)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subAdministrativeArea":{"name":"subAdministrativeArea","abstract":"<p>Portion of administrativeArea (e.g. county)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)locality":{"name":"locality","abstract":"<p>Hypernym for city/village</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subLocality":{"name":"subLocality","abstract":"<p>Hypernym for district</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)thoroughfare":{"name":"thoroughfare","abstract":"<p>Hypernym for street, road etc.</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subThoroughfare":{"name":"subThoroughfare","abstract":"<p>Portion of thoroughfare (e.g. house number)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allResponseNames":{"name":"+allResponseNames","abstract":"<p>All of the possible SDL RPC Response notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allButtonEventNotifications":{"name":"+allButtonEventNotifications","abstract":"<p>All of the possible SDL Button event notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(im)initWithAcceptsWayPoints:":{"name":"-initWithAcceptsWayPoints:","abstract":"<p>Convenience init.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(py)acceptsWayPoints":{"name":"acceptsWayPoints","abstract":"<p>Informs the subscriber if this service can actually accept way points.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:":{"name":"-initWithTimestamp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:":{"name":"-initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)timestamp":{"name":"timestamp","abstract":"<p>This is the timestamp of when the data was generated. This is to ensure any time or distance given in the data can accurately be adjusted if necessary.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)origin":{"name":"origin","abstract":"<p>The start location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destination":{"name":"destination","abstract":"<p>The final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destinationETA":{"name":"destinationETA","abstract":"<p>The estimated time of arrival at the final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)instructions":{"name":"instructions","abstract":"<p>This array should be ordered with all remaining instructions. The start of this array should always contain the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionETA":{"name":"nextInstructionETA","abstract":"<p>The estimated time of arrival at the next destination.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistance":{"name":"nextInstructionDistance","abstract":"<p>The distance to this instruction from current location. This should only be updated ever .1 unit of distance. For more accuracy the consumer can use the GPS location of itself and the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistanceScale":{"name":"nextInstructionDistanceScale","abstract":"<p>Distance till next maneuver (starting from) from previous maneuver.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)prompt":{"name":"prompt","abstract":"<p>This is a prompt message that should be conveyed to the user through either display or voice (TTS). This param will change often as it should represent the following: approaching instruction, post instruction, alerts that affect the current navigation session, etc.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:":{"name":"-initWithLocationDetails:action:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:":{"name":"-initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)locationDetails":{"name":"locationDetails","abstract":"<p>The location details.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)action":{"name":"action","abstract":"<p>The navigation action.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)eta":{"name":"eta","abstract":"<p>The estimated time of arrival.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)bearing":{"name":"bearing","abstract":"<p>The angle at which this instruction takes place. For example, 0 would mean straight, &lt;=45 is bearing right, &gt;= 135 is sharp right, between 45 and 135 is a regular right, and 180 is a U-Turn, etc. </p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)junctionType":{"name":"junctionType","abstract":"<p>The navigation junction type.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)drivingSide":{"name":"drivingSide","abstract":"<p>Used to infer which side of the road this instruction takes place. For a U-Turn (action=TURN, bearing=180) this will determine which direction the turn should take place.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)details":{"name":"details","abstract":"<p>This is a string representation of this instruction, used to display instructions to the users. This is not intended to be read aloud to the users, see the param prompt in <code>NavigationServiceData</code> for that.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)image":{"name":"image","abstract":"<p>An image representation of this instruction.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(im)initWithSendLocation:waypoints:":{"name":"-initWithSendLocation:waypoints:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)sendLocationEnabled":{"name":"sendLocationEnabled","abstract":"<p>Whether or not the SendLocation RPC is enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)getWayPointsEnabled":{"name":"getWayPointsEnabled","abstract":"<p>Whether or not Waypoint related RPCs are enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLMyKey.html#/c:objc(cs)SDLMyKey(py)e911Override":{"name":"e911Override","abstract":"<p>Indicates whether e911 override is on. References signal &ldquo;MyKey_e911Override_St&rdquo;. See VehicleDataStatus.</p>","parent_name":"SDLMyKey"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"<p>The major version indicates versions that is not-compatible to previous versions</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)minorVersion":{"name":"minorVersion","abstract":"<p>The minor version indicates a change to a previous version that should still allow to be run on an older version (with limited functionality)</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"<p>Allows backward-compatible fixes to the API without increasing the minor version of the interface</p>","parent_name":"SDLMsgVersion"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)moduleId":{"name":"moduleId","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)location":{"name":"location","abstract":"<p>Location of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)serviceArea":{"name":"serviceArea","abstract":"<p>Service area of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)allowMultipleAccess":{"name":"allowMultipleAccess","abstract":"<p>Allow multiple users/apps to access the module or not</p>","parent_name":"SDLModuleInfo"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithRadioControlData:":{"name":"-initWithRadioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithClimateControlData:":{"name":"-initWithClimateControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithAudioControlData:":{"name":"-initWithAudioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithLightControlData:":{"name":"-initWithLightControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithHMISettingsControlData:":{"name":"-initWithHMISettingsControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with hmi settings data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithSeatControlData:":{"name":"-initWithSeatControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleType":{"name":"moduleType","abstract":"<p>The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)radioControlData":{"name":"radioControlData","abstract":"<p>The radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)climateControlData":{"name":"climateControlData","abstract":"<p>The climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)seatControlData":{"name":"seatControlData","abstract":"<p>The seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)audioControlData":{"name":"audioControlData","abstract":"<p>The audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)lightControlData":{"name":"lightControlData","abstract":"<p>The light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)hmiSettingsControlData":{"name":"hmiSettingsControlData","abstract":"<p>The hmi control data</p>","parent_name":"SDLModuleData"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:":{"name":"-initWithTextFieldTypes:mainField2:","abstract":"<p>Constructs a newly allocated SDLMetadataType object with NSArrays</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:mainField3:mainField4:":{"name":"-initWithTextFieldTypes:mainField2:mainField3:mainField4:","abstract":"<p>Constructs a newly allocated SDLMetadataType with all parameters</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField1":{"name":"mainField1","abstract":"<p>The type of data contained in the &ldquo;mainField1&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField2":{"name":"mainField2","abstract":"<p>The type of data contained in the &ldquo;mainField2&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField3":{"name":"mainField3","abstract":"<p>The type of data contained in the &ldquo;mainField3&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField4":{"name":"mainField4","abstract":"<p>The type of data contained in the &ldquo;mainField4&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:":{"name":"-initWithMenuName:","abstract":"<p>Convenience init with required parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentId:position:":{"name":"-initWithMenuName:parentId:position:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)parentID":{"name":"parentID","abstract":"<p>The unique ID of an existing submenu to which a command will be added</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)position":{"name":"position","abstract":"<p>The position within the items of the parent Command Menu</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)menuName":{"name":"menuName","abstract":"<p>The menu name which appears in menu, representing this command</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)mainMenuLayout":{"name":"mainMenuLayout","abstract":"<p>Changes the default main menu layout. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)defaultSubmenuLayout":{"name":"defaultSubmenuLayout","abstract":"<p>Changes the default submenu layout. To change this for an individual submenu, set the <code>menuLayout</code> property on the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html\">SDLMenuCell</a></code> initializer for creating a cell with sub-cells. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(im)initWithMainMenuLayout:defaultSubmenuLayout:":{"name":"-initWithMainMenuLayout:defaultSubmenuLayout:","abstract":"<p>Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overriden per-submenu if desired.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title":{"name":"title","abstract":"<p>The cell&rsquo;s text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)icon":{"name":"icon","abstract":"<p>The cell&rsquo;s icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells":{"name":"subCells","abstract":"<p>If this is non-nil, this cell will be a sub-menu button, displaying the subcells in a menu when pressed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)submenuLayout":{"name":"submenuLayout","abstract":"<p>The layout in which the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells\">subCells</a></code> will be displayed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:voiceCommands:handler:":{"name":"-initWithTitle:icon:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:submenuLayout:subCells:":{"name":"-initWithTitle:icon:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(im)initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:","abstract":"<p>Convenience init</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaImage":{"name":"mediaImage","abstract":"<p>Sets the media image associated with the currently playing media","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaType":{"name":"mediaType","abstract":"<p>The type of the currently playing or paused track.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaTitle":{"name":"mediaTitle","abstract":"<p>Music: The name of the current track","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaArtist":{"name":"mediaArtist","abstract":"<p>Music: The name of the current album artist","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaAlbum":{"name":"mediaAlbum","abstract":"<p>Music: The name of the current album","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)playlistName":{"name":"playlistName","abstract":"<p>Music: The name of the playlist or radio station, if the user is playing from a playlist, otherwise, Null","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)isExplicit":{"name":"isExplicit","abstract":"<p>Whether or not the content currently playing (e.g. the track, episode, or book) contains explicit content.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackProgress":{"name":"trackPlaybackProgress","abstract":"<p>Music: The current progress of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackDuration":{"name":"trackPlaybackDuration","abstract":"<p>Music: The total duration of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackProgress":{"name":"queuePlaybackProgress","abstract":"<p>Music: The current progress of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackDuration":{"name":"queuePlaybackDuration","abstract":"<p>Music: The total duration of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueCurrentTrackNumber":{"name":"queueCurrentTrackNumber","abstract":"<p>Music: The current number (1 based) of the track in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueTotalTrackCount":{"name":"queueTotalTrackCount","abstract":"<p>Music: The total number of tracks in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(im)initWithMassageMode:massageZone:":{"name":"-initWithMassageMode:massageZone:","abstract":"<p>@abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract mode of a massage zone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageZone":{"name":"massageZone","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(im)initWithMassageCushion:firmness:":{"name":"-initWithMassageCushion:firmness:","abstract":"<p>Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)cushion":{"name":"cushion","abstract":"<p>@abstract cushion of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)firmness":{"name":"firmness","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)configuration":{"name":"configuration","abstract":"<p>The configuration the manager was set up with.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>The current HMI level of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>The current audio streaming state of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemContext":{"name":"systemContext","abstract":"<p>The current system context of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)fileManager":{"name":"fileManager","abstract":"<p>The file manager to be used by the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)permissionManager":{"name":"permissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)streamManager":{"name":"streamManager","abstract":"<p>The streaming media manager to be used for starting video sessions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)screenManager":{"name":"screenManager","abstract":"<p>The screen manager for sending UI related RPCs.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemCapabilityManager":{"name":"systemCapabilityManager","abstract":"<p>Centralized manager for retrieving all system capabilities.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)registerResponse":{"name":"registerResponse","abstract":"<p>The response of a register call after it has been received.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)authToken":{"name":"authToken","abstract":"<p>The auth token, if received. This should be used to log into a user account. Primarily used for cloud apps with companion app stores.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)delegate":{"name":"delegate","abstract":"<p>The manager&rsquo;s delegate.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)pendingRPCTransactions":{"name":"pendingRPCTransactions","abstract":"<p>The currently pending RPC request send transactions</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)initWithConfiguration:delegate:":{"name":"-initWithConfiguration:delegate:","abstract":"<p>Initialize the manager with a configuration. Call <code>startWithHandler</code> to begin waiting for a connection.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startWithReadyHandler:":{"name":"-startWithReadyHandler:","abstract":"<p>Start the manager, which will tell it to start looking for a connection. Once one does, it will automatically run the setup process and call the readyBlock when done.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager, it will disconnect if needed and no longer look for a connection. You probably don&rsquo;t need to call this method ever.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startRPCEncryption":{"name":"-startRPCEncryption","abstract":"<p>Start the encryption lifecycle manager, which will attempt to open a secure service.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRPC:":{"name":"-sendRPC:","abstract":"<p>Send an RPC of type <code>Response</code>, <code>Notification</code> or <code>Request</code>. Responses and notifications sent to Core do not a response back from Core. Each request sent to Core does get a response, so if you need the response and/or error, call <code>sendRequest:withResponseHandler:</code> instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:":{"name":"-sendRequest:","abstract":"<p>Send an RPC request and don&rsquo;t bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:withResponseHandler:":{"name":"-sendRequest:withResponseHandler:","abstract":"<p>Send an RPC request and set a completion handler that will be called with the response when the response returns.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequests:progressHandler:completionHandler:":{"name":"-sendRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendSequentialRequests:progressHandler:completionHandler:":{"name":"-sendSequentialRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withBlock:":{"name":"-subscribeToRPC:withBlock:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a block callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withObserver:selector:":{"name":"-subscribeToRPC:withObserver:selector:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)unsubscribeFromRPC:withObserver:":{"name":"-unsubscribeFromRPC:withObserver:","abstract":"<p>Unsubscribe to callbacks about a particular RPC request, notification, or response.</p>","parent_name":"SDLManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)modules":{"name":"modules","abstract":"<p>Active log modules</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)targets":{"name":"targets","abstract":"<p>Active log targets</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)filters":{"name":"filters","abstract":"<p>Active log filters</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use this log level</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)formatType":{"name":"formatType","abstract":"<p>Active log format</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not verbose, debug, and warning logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)dateFormatter":{"name":"dateFormatter","abstract":"<p>Active date formatter</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)logQueue":{"name":"logQueue","abstract":"<p>The queue asynchronously logged logs are logged on. Say that 10 times fast.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)sharedManager":{"name":"+sharedManager","abstract":"<p>The singleton object</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)setConfiguration:":{"name":"+setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager&rsquo;s sharedManager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)setConfiguration:":{"name":"-setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to the sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"+logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"-logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this manager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"+logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to the sharedManager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"-logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to this manager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(py)filter":{"name":"filter","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)initWithCustomFilter:":{"name":"-initWithCustomFilter:","abstract":"<p>Create a new filter with a custom filter block. The filter block will take a log model and return a BOOL of pass / fail.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingString:caseSensitive:":{"name":"+filterByDisallowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs not containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingString:caseSensitive:":{"name":"+filterByAllowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingRegex:":{"name":"+filterByDisallowingRegex:","abstract":"<p>Returns a filter that only allows logs not passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingRegex:":{"name":"+filterByAllowingRegex:","abstract":"<p>Returns a filter that only allows logs passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingModules:":{"name":"+filterByDisallowingModules:","abstract":"<p>Returns a filter that only allows logs not within the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingModules:":{"name":"+filterByAllowingModules:","abstract":"<p>Returns a filter that only allows logs of the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingFileNames:":{"name":"+filterByDisallowingFileNames:","abstract":"<p>Returns a filter that only allows logs not within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingFileNames:":{"name":"+filterByAllowingFileNames:","abstract":"<p>Returns a filter that only allows logs within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)name":{"name":"name","abstract":"<p>The name of the this module, e.g. &ldquo;Transport&rdquo;</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)files":{"name":"files","abstract":"<p>All of the files contained within this module. When a log is logged, the <code>__FILE__</code> (in Obj-C) or <code>#file</code> (in Swift) is automatically captured and checked to see if any module has a file in this set that matches. If it does, it will be logged using the module&rsquo;s log level and the module&rsquo;s name will be printed in the formatted log.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)logLevel":{"name":"logLevel","abstract":"<p>The custom level of the log. This is <code>SDLLogLevelDefault</code> (whatever the current global log level is) by default.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)init":{"name":"-init","abstract":"<p>This method is unavailable and may not be used.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:level:":{"name":"-initWithName:files:level:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name, set of files, and associated log level.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:":{"name":"-initWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(cm)moduleWithName:files:":{"name":"+moduleWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)containsFile:":{"name":"-containsFile:","abstract":"<p>Returns whether or not this module contains a given file.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)modules":{"name":"modules","abstract":"<p>Any custom logging modules used by the developer&rsquo;s code. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)targets":{"name":"targets","abstract":"<p>Where the logs will attempt to output. Defaults to Console.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)filters":{"name":"filters","abstract":"<p>What log filters will run over this session. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)formatType":{"name":"formatType","abstract":"<p>How detailed of logs will be output. Defaults to Default.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not logs will be run on a separate queue, asynchronously, allowing the following code to run before the log completes. Or if it will occur synchronously, which will prevent logs from being missed, but will slow down surrounding code. Defaults to YES.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs will be dispatched to loggers asynchronously. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use the global log level. Defaults to Error.","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>A default logger for production. This sets the format type to Default, the log level to Error, and the target to SDLLogTargetOSLog.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)debugConfiguration":{"name":"+debugConfiguration","abstract":"<p>A debug logger for use in development. This sets the format type to Detailed, the log level to Debug, and enables the Console and ASL loggers.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)appIcon":{"name":"appIcon","abstract":"<p>The app&rsquo;s icon. This will be set by the lock screen configuration.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)vehicleIcon":{"name":"vehicleIcon","abstract":"<p>The vehicle&rsquo;s designated icon. This will be set by the lock screen manager when it is notified that a lock screen icon has been downloaded.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The designated background color set in the lock screen configuration, or the default SDL gray-blue.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)lockedLabelText":{"name":"lockedLabelText","abstract":"<p>The locked label string. This will be set by the lock screen manager to inform the user about the dismissable state.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)addDismissGestureWithCallback:":{"name":"-addDismissGestureWithCallback:","abstract":"<p>Adds a swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)removeDismissGesture":{"name":"-removeDismissGesture","abstract":"<p>Remove swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)displayMode":{"name":"displayMode","abstract":"<p>Describes when the lock screen will be displayed. Defaults to <code>SDLLockScreenConfigurationDisplayModeRequiredOnly</code>.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)enableDismissGesture":{"name":"enableDismissGesture","abstract":"<p>If YES, then the lock screen can be dismissed with a downward swipe on compatible head units. Requires a connection of SDL 6.0+ and the head unit to enable the feature. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)showDeviceLogo":{"name":"showDeviceLogo","abstract":"<p>If YES, then the lockscreen will show the vehicle&rsquo;s logo if the vehicle has made it available. If NO, then the lockscreen will not show the vehicle logo. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>Your app icon as it will appear on the lock screen.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)customViewController":{"name":"customViewController","abstract":"<p>A custom view controller that the lock screen will manage the presentation of.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)disabledConfiguration":{"name":"+disabledConfiguration","abstract":"<p>Use this configuration if you wish to manage a lock screen yourself. This may be useful if the automatic presentation feature of SDLLockScreenManager is failing for some reason.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfiguration":{"name":"+enabledConfiguration","abstract":"<p>Use this configuration for the basic default lock screen. A custom app icon will not be used.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithAppIcon:backgroundColor:":{"name":"+enabledConfigurationWithAppIcon:backgroundColor:","abstract":"<p>Use this configuration to provide a custom lock screen icon and a custom background color, or nil if you wish to use the default background color. This will use the default lock screen layout.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithViewController:":{"name":"+enabledConfigurationWithViewController:","abstract":"<p>Use this configuration if you wish to provide your own view controller for the lock screen. This view controller&rsquo;s presentation and dismissal will still be managed by the lock screen manager. Note that you may subclass SDLLockScreenViewController and pass it here to continue to have the vehicle icon set to your view controller by the manager.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:":{"name":"-initWithCoordinate:","abstract":"<p>Convenience init for location coordinate.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:":{"name":"-initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)coordinate":{"name":"coordinate","abstract":"<p>Latitude/Longitude of the location</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationName":{"name":"locationName","abstract":"<p>Name of location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description intended location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)searchAddress":{"name":"searchAddress","abstract":"<p>Address to be used by navigation engines for search.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(im)initWithLatitudeDegrees:longitudeDegrees:":{"name":"-initWithLatitudeDegrees:longitudeDegrees:","abstract":"<p>Convenience init for location coordinates</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)filenames":{"name":"filenames","abstract":"<p>An array of all filenames resident on the module for the given registered app. If omitted, then no files currently reside on the system.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available on the module for the registered app.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:":{"name":"-initWithId:status:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:density:color:":{"name":"-initWithId:status:density:color:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:lightStatus:lightDensity:lightColor:":{"name":"-initWithId:lightStatus:lightDensity:lightColor:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)id":{"name":"id","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)status":{"name":"status","abstract":"<p>@abstract Reflects the status of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)density":{"name":"density","abstract":"<p>@abstract Reflects the density of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)color":{"name":"color","abstract":"<p>@abstract Reflects the color of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(im)initWithLightStates:":{"name":"-initWithLightStates:","abstract":"<p>Constructs a newly allocated SDLLightControlData object with lightState</p>","parent_name":"SDLLightControlData"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(py)lightState":{"name":"lightState","abstract":"<p>@abstract An array of LightNames and their current or desired status.","parent_name":"SDLLightControlData"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(im)initWithModuleName:moduleInfo:supportedLights:":{"name":"-initWithModuleName:moduleInfo:supportedLights:","abstract":"<p>Constructs a newly allocated SDLLightControlCapabilities object with given parameters</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)supportedLights":{"name":"supportedLights","abstract":"<p>@abstract An array of available LightCapabilities that are controllable.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with the name of the light or group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:densityAvailable:colorAvailable:statusAvailable:":{"name":"-initWithName:densityAvailable:colorAvailable:statusAvailable:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with given parameters</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)name":{"name":"name","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)densityAvailable":{"name":"densityAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s density can be set remotely (similar to a dimmer).</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)colorAvailable":{"name":"colorAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s color can be set remotely by using the RGB color space.</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)statusAvailable":{"name":"statusAvailable","abstract":"<p>@abstract Indicates if the status (ON/OFF) can be set remotely.","parent_name":"SDLLightCapabilities"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)appName":{"name":"appName","abstract":"<p>The full name of the app to that the configuration should be updated to.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(im)initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:":{"name":"-initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:","abstract":"<p>Initializes and returns a newly allocated lifecycle configuration update object with the specified app data.","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:fullAppId:":{"name":"+defaultConfigurationWithAppName:fullAppId:","abstract":"<p>A production configuration that runs using IAP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:fullAppId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:fullAppId:ipAddress:port:","abstract":"<p>A debug configuration that runs using TCP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugMode":{"name":"tcpDebugMode","abstract":"<p>Whether or not debug mode is enabled</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugIPAddress":{"name":"tcpDebugIPAddress","abstract":"<p>The ip address at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugPort":{"name":"tcpDebugPort","abstract":"<p>The port at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appName":{"name":"appName","abstract":"<p>The full name of the app</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appId":{"name":"appId","abstract":"<p>The app id. This must be the same as the app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)fullAppId":{"name":"fullAppId","abstract":"<p>The full app id. This must be the same as the full app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)resumeHash":{"name":"resumeHash","abstract":"<p>A hash id which should be passed to the remote system in the RegisterAppInterface</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)isMedia":{"name":"isMedia","abstract":"<p>This is an automatically set based on the app type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType":{"name":"appType","abstract":"<p>The application type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)additionalAppTypes":{"name":"additionalAppTypes","abstract":"<p>Additional application types beyond <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType\">appType</a></code></p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)language":{"name":"language","abstract":"<p>The default language to use</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)languagesSupported":{"name":"languagesSupported","abstract":"<p>An array of all the supported languages</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>The application icon to be used on an app launching screen</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumProtocolVersion":{"name":"minimumProtocolVersion","abstract":"<p>The minimum protocol version that will be permitted to connect. This defaults to 1.0.0. If the protocol version of the head unit connected is below this version, the app will disconnect with an EndService protocol message and will not register.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumRPCVersion":{"name":"minimumRPCVersion","abstract":"<p>The minimum RPC version that will be permitted to connect. This defaults to 1.0.0. If the RPC version of the head unit connected is below this version, an UnregisterAppInterface will be sent.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)allowedSecondaryTransports":{"name":"allowedSecondaryTransports","abstract":"<p>Which transports are permitted to be used as secondary transports. A secondary transport is a transport that is connected as an alternate, higher bandwidth transport for situations when a low-bandwidth primary transport (such as Bluetooth) will restrict certain features (such as video streaming navigation).</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:","abstract":"<p>Create a Keyboard Properties RPC object</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)language":{"name":"language","abstract":"<p>The keyboard language</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>Desired keyboard layout</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keypressMode":{"name":"keypressMode","abstract":"<p>Desired keypress mode.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)limitedCharacterList":{"name":"limitedCharacterList","abstract":"<p>Array of keyboard characters to enable. All omitted characters will be greyed out (disabled) on the keyboard. If omitted, the entire keyboard will be enabled.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteText":{"name":"autoCompleteText","abstract":"<p>Allows an app to prepopulate the text field with a suggested or completed entry as the user types</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteList":{"name":"autoCompleteList","abstract":"<p>Allows an app to show a list of possible autocomplete suggestions as the user types</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionWidth":{"name":"resolutionWidth","abstract":"<p>Resolution width</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionHeight":{"name":"resolutionHeight","abstract":"<p>Resolution height</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(im)initWithWidth:height:":{"name":"-initWithWidth:height:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)name":{"name":"name","abstract":"<p>The name that identifies the field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>The image types that are supported in this field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageResolution":{"name":"imageResolution","abstract":"<p>The image resolution of this field</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(im)initWithName:imageTypeSupported:imageResolution:":{"name":"-initWithName:imageTypeSupported:imageResolution:","abstract":"<p>Convenience initalizer for the ImageField RPC struct</p>","parent_name":"SDLImageField"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:isTemplate:":{"name":"-initWithName:ofType:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:isTemplate:":{"name":"-initWithName:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticImageValue:":{"name":"-initWithStaticImageValue:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticIconName:":{"name":"-initWithStaticIconName:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)value":{"name":"value","abstract":"<p>The static hex icon value or the binary image file name identifier (sent by SDLPutFile)</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)imageType":{"name":"imageType","abstract":"<p>Describes whether the image is static or dynamic</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)isTemplate":{"name":"isTemplate","abstract":"<p>Indicates that this image can be (re)colored by the HMI to best fit the current color scheme.</p>","parent_name":"SDLImage"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)lowBeamsOn":{"name":"lowBeamsOn","abstract":"<p>Low beams are on or off.</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)highBeamsOn":{"name":"highBeamsOn","abstract":"<p>High beams are on or off</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)ambientLightSensorStatus":{"name":"ambientLightSensorStatus","abstract":"<p>Status of the ambient light senser</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(im)initWithId:rect:":{"name":"-initWithId:rect:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)id":{"name":"id","abstract":"<p>A user control spatial identifier</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)rect":{"name":"rect","abstract":"<p>The position of the haptic rectangle to be highlighted. The center of this rectangle will be &ldquo;touched&rdquo; when a press occurs.</p>","parent_name":"SDLHapticRect"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(im)initWithDisplaymode:temperatureUnit:distanceUnit:":{"name":"-initWithDisplaymode:temperatureUnit:distanceUnit:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)displayMode":{"name":"displayMode","abstract":"<p>@abstract Display the Display Mode used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)temperatureUnit":{"name":"temperatureUnit","abstract":"<p>@abstract Display the temperature unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)distanceUnit":{"name":"distanceUnit","abstract":"<p>@abstract Display the distance unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the hmi setting module.","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)distanceUnitAvailable":{"name":"distanceUnitAvailable","abstract":"<p>@abstract Availability of the control of distance unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)temperatureUnitAvailable":{"name":"temperatureUnitAvailable","abstract":"<p>@abstract Availability of the control of temperature unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)displayModeUnitAvailable":{"name":"displayModeUnitAvailable","abstract":"<p>@abstract Availability of the control of HMI display mode.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all HMI levels that are permitted for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all HMI levels that are prohibited for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(im)initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:":{"name":"-initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)navigation":{"name":"navigation","abstract":"<p>Availability of built in Nav. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)phoneCall":{"name":"phoneCall","abstract":"<p>Availability of built in phone. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)videoStreaming":{"name":"videoStreaming","abstract":"<p>Availability of built in video streaming. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)remoteControl":{"name":"remoteControl","abstract":"<p>Availability of built in remote control. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)appServices":{"name":"appServices","abstract":"<p>Availability of app services. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)displays":{"name":"displays","abstract":"<p>Availability of displays. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)seatLocation":{"name":"seatLocation","abstract":"<p>Availability of seatLocation. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)driverDistraction":{"name":"driverDistraction","abstract":"<p>Availability of driver distraction capability. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)col":{"name":"col","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)row":{"name":"row","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)level":{"name":"level","abstract":"<p>Optional, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)colspan":{"name":"colspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)rowspan":{"name":"rowspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)levelspan":{"name":"levelspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGetWayPointsResponse.html#/c:objc(cs)SDLGetWayPointsResponse(py)waypoints":{"name":"waypoints","abstract":"<p>Provides additional human readable info regarding the result.</p>","parent_name":"SDLGetWayPointsResponse"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init to get waypoints.</p>","parent_name":"SDLGetWayPoints"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(py)waypointType":{"name":"waypointType","abstract":"<p>To request for either the destination","parent_name":"SDLGetWayPoints"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>The stability controls status</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, requests GPS data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, requests Speed data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, requests RPM data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, requests Fuel Level data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, requests Fuel Level State data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, requests Fuel Range data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, requests Instant Fuel Consumption data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>A boolean value. If true, requests External Temperature data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)vin":{"name":"vin","abstract":"<p>A boolean value. If true, requests the Vehicle Identification Number.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, requests Tire Pressure data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, requests Odometer data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, requests Belt Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, requests Body Information data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, requests Device Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, requests Driver Braking data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, requests Wiper Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, requests Head Lamp Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, requests Engine Oil Life data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, requests Engine Torque data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, requests Acc Pedal Position data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, requests Steering Wheel Angle data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, requests Emergency Call Info data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, requests Air Bag Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, requests Emergency Event (if it occurred) data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, requests Cluster Mode Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, requests MyKey data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, requests Electronic Parking Brake status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, requests Turn Signal data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, requests the Cloud App Vehicle ID.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>A boolean value. If true, requests StabilityControlsStatus data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetSystemCapabilityResponse.html#/c:objc(cs)SDLGetSystemCapabilityResponse(py)systemCapability":{"name":"systemCapability","abstract":"<p>The requested system capability, of the type that was sent in the request</p>","parent_name":"SDLGetSystemCapabilityResponse"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:subscribe:":{"name":"-initWithType:subscribe:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>The type of system capability to get more information on</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)subscribe":{"name":"subscribe","abstract":"<p>Flag to subscribe to updates of the supplied service capability type. If true, the requester will be subscribed. If false, the requester will not be subscribed and be removed as a subscriber if it was previously subscribed.</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The requested data</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)isSubscribed":{"name":"isSubscribed","abstract":"<p>It is a conditional-mandatory parameter: must be returned in case &ldquo;subscribe&rdquo; parameter was present in the related request.</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataConsentResponse(py)allowed":{"name":"allowed","abstract":"<p>This array has the same size as &ldquo;moduleIds&rdquo; in the request; each element corresponding to one moduleId","parent_name":"SDLGetInteriorVehicleDataConsentResponse"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(im)initWithModuleType:moduleIds:":{"name":"-initWithModuleType:moduleIds:","abstract":"<p>Convenience init to get consent to control a module</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleIds":{"name":"moduleIds","abstract":"<p>Ids of a module of same type, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to get information of a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:moduleId:":{"name":"-initAndSubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to get information and subscribe to a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:moduleId:":{"name":"-initAndUnsubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to unsubscribe from particular module with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleType":{"name":"moduleType","abstract":"<p>The type of a RC module to retrieve module data from the vehicle.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)subscribe":{"name":"subscribe","abstract":"<p>If subscribe is true, the head unit will register OnInteriorVehicleData notifications for the requested module (moduleId and moduleType).","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(im)initWithOffset:length:fileType:crc:":{"name":"-initWithOffset:length:fileType:crc:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)fileType":{"name":"fileType","abstract":"<p>File type that is being sent in response.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:":{"name":"-initWithFileName:appServiceId:fileType:","abstract":"<p>Convenience init for sending a small file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:offset:length:":{"name":"-initWithFileName:appServiceId:fileType:offset:length:","abstract":"<p>Convenience init for sending a large file in multiple data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileName":{"name":"fileName","abstract":"<p>File name that should be retrieved.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)appServiceId":{"name":"appServiceId","abstract":"<p>ID of the service that should have uploaded the requested file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileType":{"name":"fileType","abstract":"<p>Selected file type.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)ecuHeader":{"name":"ecuHeader","abstract":"<p>2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf)</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)dtc":{"name":"dtc","abstract":"<p>Array of all reported DTCs on module (ecuHeader contains information if list is truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as defined in VHR_Layout_Specification_DTCs.pdf).</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:":{"name":"-initWithECUName:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:mask:":{"name":"-initWithECUName:mask:","abstract":"<p>Convenience init with all properties</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)ecuName":{"name":"ecuName","abstract":"<p>a name of the module to receive the DTC form","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)dtcMask":{"name":"dtcMask","abstract":"<p>DTC Mask Byte to be sent in diagnostic request to module. NSNumber* dtcMask Minvalue:0; Maxvalue:255</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(py)properties":{"name":"properties","abstract":"<p>The requested cloud application properties.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(im)initWithAppServiceData:":{"name":"-initWithAppServiceData:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(py)serviceData":{"name":"serviceData","abstract":"<p>Contains all the current data of the app service.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndSubscribeToAppServiceType:":{"name":"-initAndSubscribeToAppServiceType:","abstract":"<p>Convenience init for subscribing to a service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndUnsubscribeToAppServiceType:":{"name":"-initAndUnsubscribeToAppServiceType:","abstract":"<p>Convenience init for unsubscribing to a service type</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)subscribe":{"name":"subscribe","abstract":"<p>If true, the consumer is requesting to subscribe to all future updates from the service publisher. If false, the consumer doesn&rsquo;t wish to subscribe and should be unsubscribed if it was previously subscribed.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(im)initWithUserSelectedGear:actualGear:transmissionType:":{"name":"-initWithUserSelectedGear:actualGear:transmissionType:","abstract":"<p>Convenience initializer to assign all object properties</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)userSelectedGear":{"name":"userSelectedGear","abstract":"<p>Gear position selected by the user i.e. Park, Drive, Reverse</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)actualGear":{"name":"actualGear","abstract":"<p>Actual Gear in use by the transmission</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)transmissionType":{"name":"transmissionType","abstract":"<p>Tells the transmission type</p>","parent_name":"SDLGearStatus"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>longitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>latitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcYear":{"name":"utcYear","abstract":"<p>utc year</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMonth":{"name":"utcMonth","abstract":"<p>utc month</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcDay":{"name":"utcDay","abstract":"<p>utc day</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcHours":{"name":"utcHours","abstract":"<p>utc hours</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMinutes":{"name":"utcMinutes","abstract":"<p>utc minutes</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcSeconds":{"name":"utcSeconds","abstract":"<p>utc seconds</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)compassDirection":{"name":"compassDirection","abstract":"<p>Optional, Potential Compass Directions</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)pdop":{"name":"pdop","abstract":"<p>The 3D positional dilution of precision.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)hdop":{"name":"hdop","abstract":"<p>The horizontal dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)vdop":{"name":"vdop","abstract":"<p>the vertical dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)actual":{"name":"actual","abstract":"<p>What the coordinates are based on</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)satellites":{"name":"satellites","abstract":"<p>The number of satellites in view</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)dimension":{"name":"dimension","abstract":"<p>The supported dimensions of the GPS</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)altitude":{"name":"altitude","abstract":"<p>Altitude in meters</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)heading":{"name":"heading","abstract":"<p>Heading based on the GPS data.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)speed":{"name":"speed","abstract":"<p>Speed in KPH</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)shifted":{"name":"shifted","abstract":"<p>True, if GPS lat/long, time, and altitude have been purposefully shifted (requires a proprietary algorithm to unshift).","parent_name":"SDLGPSData"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(cm)sharedInstance":{"name":"+sharedInstance","abstract":"<p>The shared object for pulling function id information</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionNameForId:":{"name":"-functionNameForId:","abstract":"<p>Gets the function name for a given SDL RPC function ID</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionIdForName:":{"name":"-functionIdForName:","abstract":"<p>Gets the function ID for a given SDL RPC function name</p>","parent_name":"SDLFunctionID"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(im)initWithType:range:level:levelState:capacity:capacityUnit:":{"name":"-initWithType:range:level:levelState:capacity:capacityUnit:","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacity":{"name":"capacity","abstract":"<p>The absolute capacity of this fuel type.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacityUnit":{"name":"capacityUnit","abstract":"<p>The unit of the capacity of this fuel type such as liters for gasoline or kWh for batteries.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)level":{"name":"level","abstract":"<p>The relative remaining capacity of this fuel type (percentage).</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)levelState":{"name":"levelState","abstract":"<p>The fuel level state.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)type":{"name":"type","abstract":"<p>The vehicle&rsquo;s fuel type</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)range":{"name":"range","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)artworkRetryCount":{"name":"artworkRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLArtwork.html\">SDLArtwork</a></code> files in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)fileRetryCount":{"name":"fileRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload general <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLFile.html\">SDLFile</a></code>s in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default file manager configuration.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)init":{"name":"-init","abstract":"<p>Use <code>defaultConfiguration</code> instead</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)initWithArtworkRetryCount:fileRetryCount:":{"name":"-initWithArtworkRetryCount:fileRetryCount:","abstract":"<p>Creates a file manager configuration with customized upload retry counts.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)remoteFileNames":{"name":"remoteFileNames","abstract":"<p>A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)bytesAvailable":{"name":"bytesAvailable","abstract":"<p>The number of bytes still available for files for this app.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)currentState":{"name":"currentState","abstract":"<p>The state of the file manager.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)pendingTransactions":{"name":"pendingTransactions","abstract":"<p>The currently pending transactions (Upload, Delete, and List Files) in the file manager</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)suspended":{"name":"suspended","abstract":"<p>Whether or not the file manager is suspended. If suspended, the file manager can continue to queue uploads and deletes, but will not actually perform any of those until it is no longer suspended. This can be used for throttling down the file manager if other, important operations are taking place over the accessory connection.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)init":{"name":"-init","abstract":"<p>Initialize the class&hellip;or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"<p>Creates a new file manager with a specified connection manager and configuration</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>The manager stars up and attempts to fetch its initial list and transfer initial files.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)stop":{"name":"-stop","abstract":"<p>Cancels all file manager operations and deletes all associated data.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)hasUploadedFile:":{"name":"-hasUploadedFile:","abstract":"<p>Check if the remote system contains a file</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFileWithName:completionHandler:":{"name":"-deleteRemoteFileWithName:completionHandler:","abstract":"<p>Delete a file stored on the remote system</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFilesWithNames:completionHandler:":{"name":"-deleteRemoteFilesWithNames:completionHandler:","abstract":"<p>Deletes an array of files on the remote file system. The files are deleted in the order in which they are added to the array, with the first file to be deleted at index 0. The delete queue is sequential, meaning that once a delete request is sent to Core, the queue waits until a response is received from Core before the next the next delete request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFile:completionHandler:":{"name":"-uploadFile:completionHandler:","abstract":"<p>Upload a file to the remote file system. If a file with the [SDLFile name] already exists, this will overwrite that file. If you do not want that to happen, check remoteFileNames before uploading, or change allowOverwrite to NO.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:progressHandler:completionHandler:":{"name":"-uploadFiles:progressHandler:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:completionHandler:":{"name":"-uploadFiles:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtwork:completionHandler:":{"name":"-uploadArtwork:completionHandler:","abstract":"<p>Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:completionHandler:":{"name":"-uploadArtworks:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:progressHandler:completionHandler:":{"name":"-uploadArtworks:progressHandler:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(cm)temporaryFileDirectory":{"name":"+temporaryFileDirectory","abstract":"<p>A URL to the directory where temporary files are stored. When an SDLFile is created with NSData, it writes to a temporary file until the file manager finishes uploading it.</p>","parent_name":"SDLFileManager"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)persistent":{"name":"persistent","abstract":"<p>Whether or not the file should persist on disk between car ignition cycles.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)overwrite":{"name":"overwrite","abstract":"<p>Whether or not the file should overwrite an existing file on the remote disk with the same name.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)name":{"name":"name","abstract":"<p>The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL":{"name":"fileURL","abstract":"<p>The url the local file is stored at while waiting to push it to the remote system. If the data has not been passed to the file URL, this will be nil.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)data":{"name":"data","abstract":"<p>The binary data of the SDLFile. If initialized with data, this will be a relatively quick call, but if initialized with a file URL, this is a rather expensive call the first time. The data will be cached in RAM after the first call.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the binary data of the SDLFile.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileType":{"name":"fileType","abstract":"<p>The system will attempt to determine the type of file that you have passed in. It will default to BINARY if it does not recognize the file type or the file type is not supported by SDL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)inputStream":{"name":"inputStream","abstract":"<p>A stream to pull binary data from a SDLFile. The stream only pulls required data from the file on disk or in memory. This reduces memory usage while uploading a large file to the remote system as each chunk of data can be released immediately after it is uploaded.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)isStaticIcon":{"name":"isStaticIcon","abstract":"<p>Describes whether or not this file is represented by static icon data. The head unit will present its representation of the static icon concept when sent this data.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithFileURL:name:persistent:":{"name":"-initWithFileURL:name:persistent:","abstract":"<p>The designated initializer for an SDL File. The only major property that is not set using this is &ldquo;overwrite&rdquo;, which defaults to NO.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileAtFileURL:name:":{"name":"+persistentFileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileAtFileURL:name:":{"name":"+fileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithData:name:fileExtension:persistent:":{"name":"-initWithData:name:fileExtension:persistent:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileWithData:name:fileExtension:":{"name":"+persistentFileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileWithData:name:fileExtension:":{"name":"+fileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(im)initWithChannelId:channelSetting:":{"name":"-initWithChannelId:channelSetting:","abstract":"<p>Convenience init</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelName":{"name":"channelName","abstract":"<p>@abstract Read-only channel / frequency name","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelSetting":{"name":"channelSetting","abstract":"<p>@abstract Reflects the setting, from 0%-100%.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelId":{"name":"channelId","abstract":"<p>@abstract id of the channel.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"<p>A set of security managers used to encrypt traffic data. Each OEM has their own proprietary security manager.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)delegate":{"name":"delegate","abstract":"<p>A delegate callback that will tell you when an acknowledgement has occurred for starting as secure service.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default encryption configuration.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(im)initWithSecurityManagers:delegate:":{"name":"-initWithSecurityManagers:delegate:","abstract":"<p>Creates a secure configuration for each of the security managers provided.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncodedSyncPData.html#/c:objc(cs)SDLEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLEncodedSyncPData"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)emergencyEventType":{"name":"emergencyEventType","abstract":"<p>References signal &ldquo;VedsEvntType_D_Ltchd&rdquo;. See EmergencyEventType.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)fuelCutoffStatus":{"name":"fuelCutoffStatus","abstract":"<p>References signal &ldquo;RCM_FuelCutoff&rdquo;. See FuelCutoffStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)rolloverEvent":{"name":"rolloverEvent","abstract":"<p>References signal &ldquo;VedsEvntRoll_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)maximumChangeVelocity":{"name":"maximumChangeVelocity","abstract":"<p>References signal &ldquo;VedsMaxDeltaV_D_Ltchd&rdquo;. Change in velocity in KPH.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)multipleEvents":{"name":"multipleEvents","abstract":"<p>References signal &ldquo;VedsMultiEvnt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallNotificationStatus":{"name":"eCallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification_4A&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)auxECallNotificationStatus":{"name":"auxECallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallConfirmationStatus":{"name":"eCallConfirmationStatus","abstract":"<p>References signal &ldquo;eCallConfirmation&rdquo;. See ECallConfirmationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(im)initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:":{"name":"-initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportedDynamicImageFieldNames":{"name":"supportedDynamicImageFieldNames","abstract":"<p>An array of ImageFieldName values for which the system supports sending OnFileUpdate notifications. If you send an Image struct for that image field with a name without having uploaded the image data using PutFile that matches that name, the system will request that you upload the data with PutFile at a later point when the HMI needs it. The HMI will then display the image in the appropriate field. If not sent, assume false.","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportsDynamicSubMenus":{"name":"supportsDynamicSubMenus","abstract":"<p>If true, the head unit supports dynamic sub-menus by sending OnUpdateSubMenu notifications. If true, you should not send AddCommands that attach to a parentID for an AddSubMenu until OnUpdateSubMenu is received with the menuID. At that point, you should send all AddCommands with a parentID that match the menuID. If not set, assume false.</p>","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(im)initWithMenuLength:subMenuDepth:":{"name":"-initWithMenuLength:subMenuDepth:","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)menuLength":{"name":"menuLength","abstract":"<p>The number of items allowed in a Choice Set or Command menu while the driver is distracted","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)subMenuDepth":{"name":"subMenuDepth","abstract":"<p>The depth of submenus allowed when the driver is distracted. e.g. 3 == top level menu -&gt; submenu -&gt; submenu; 1 == top level menu only","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:":{"name":"-initWithDisplayName:","abstract":"<p>Init with required properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:windowCapabilities:windowTypeSupported:":{"name":"-initWithDisplayName:windowCapabilities:windowTypeSupported:","abstract":"<p>Init with all the properities</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)displayName":{"name":"displayName","abstract":"<p>Name of the display.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowTypeSupported":{"name":"windowTypeSupported","abstract":"<p>Informs the application how many windows the app is allowed to create per type.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowCapabilities":{"name":"windowCapabilities","abstract":"<p>Contains a list of capabilities of all windows related to the app. Once the app has registered the capabilities of all windows will be provided, but GetSystemCapability still allows requesting window capabilities of all windows.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayType":{"name":"displayType","abstract":"<p>The type of display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayName":{"name":"displayName","abstract":"<p>The name of the connected display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)textFields":{"name":"textFields","abstract":"<p>An array of SDLTextField structures, each of which describes a field in the HMI which the application can write to using operations such as <em>SDLShow</em>, <em>SDLSetMediaClockTimer</em>, etc.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)imageFields":{"name":"imageFields","abstract":"<p>An array of SDLImageField elements</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)mediaClockFormats":{"name":"mediaClockFormats","abstract":"<p>An array of SDLMediaClockFormat elements, defining the valid string formats used in specifying the contents of the media clock field</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)graphicSupported":{"name":"graphicSupported","abstract":"<p>The display&rsquo;s persistent screen supports.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>An array of all predefined persistent display templates available on the head unit.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)screenParams":{"name":"screenParams","abstract":"<p>A set of all parameters related to a prescribed screen area (e.g. for video / touch input)</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-screen custom presets available (if any); otherwise omitted</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(im)initWithNumber:":{"name":"-initWithNumber:","abstract":"<p>Convenience init to initiate a dial number request</p>","parent_name":"SDLDialNumber"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(py)number":{"name":"number","abstract":"<p>Up to 40 character string representing the phone number. All characters stripped except for &lsquo;0&rsquo;-&lsquo;9&rsquo;, &lsquo;*&rsquo;, &lsquo;#&rsquo;, &lsquo;,&rsquo;, &lsquo;;&rsquo;, and &lsquo;+&rsquo;</p>","parent_name":"SDLDialNumber"},"Classes/SDLDiagnosticMessageResponse.html#/c:objc(cs)SDLDiagnosticMessageResponse(py)messageDataResult":{"name":"messageDataResult","abstract":"<p>Array of bytes comprising CAN message result.</p>","parent_name":"SDLDiagnosticMessageResponse"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(im)initWithTargetId:length:data:":{"name":"-initWithTargetId:length:data:","abstract":"<p>Convenience init</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)targetID":{"name":"targetID","abstract":"<p>Name of target ECU</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageLength":{"name":"messageLength","abstract":"<p>Length of message (in bytes)</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageData":{"name":"messageData","abstract":"<p>Array of bytes comprising CAN message.</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)voiceRecOn":{"name":"voiceRecOn","abstract":"<p>Indicates whether the voice recognition is on or off</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)btIconOn":{"name":"btIconOn","abstract":"<p>Indicates whether the bluetooth connection established</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)callActive":{"name":"callActive","abstract":"<p>Indicates whether a call is being active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)phoneRoaming":{"name":"phoneRoaming","abstract":"<p>Indicates whether the phone is in roaming mode</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)textMsgAvailable":{"name":"textMsgAvailable","abstract":"<p>Indicates whether a textmessage is available</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)battLevelStatus":{"name":"battLevelStatus","abstract":"<p>Battery level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)stereoAudioOutputMuted":{"name":"stereoAudioOutputMuted","abstract":"<p>The status of the stereo audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)monoAudioOutputMuted":{"name":"monoAudioOutputMuted","abstract":"<p>The status of the mono audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)signalLevelStatus":{"name":"signalLevelStatus","abstract":"<p>Signal level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)primaryAudioSource":{"name":"primaryAudioSource","abstract":"<p>The current primary audio source of SDL (if selected).</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)eCallEventActive":{"name":"eCallEventActive","abstract":"<p>Indicates if an emergency call is active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(cm)currentDevice":{"name":"+currentDevice","abstract":"<p>Convenience init. Object will contain all information about the connected device automatically.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)hardware":{"name":"hardware","abstract":"<p>Device model</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)firmwareRev":{"name":"firmwareRev","abstract":"<p>Device firmware version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)os":{"name":"os","abstract":"<p>Device OS</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)osVersion":{"name":"osVersion","abstract":"<p>Device OS version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)carrier":{"name":"carrier","abstract":"<p>Device mobile carrier</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)maxNumberRFCOMMPorts":{"name":"maxNumberRFCOMMPorts","abstract":"<p>Number of bluetooth RFCOMM ports available.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(im)initWithId:":{"name":"-initWithId:","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.</p>","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a submenu</p>","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(py)menuID":{"name":"menuID","abstract":"<p>the MenuID that identifies the SDLSubMenu to be delete","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a choice set</p>","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>a unique ID that identifies the Choice Set","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteFileResponse.html#/c:objc(cs)SDLDeleteFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>The remaining available space for your application to store data on the remote system.</p>","parent_name":"SDLDeleteFileResponse"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to delete a file</p>","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(py)syncFileName":{"name":"syncFileName","abstract":"<p>a file reference name","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to remove a command from the menu</p>","parent_name":"SDLDeleteCommand"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(py)cmdID":{"name":"cmdID","abstract":"<p>the Command ID that identifies the Command to be deleted from Command Menu","parent_name":"SDLDeleteCommand"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:":{"name":"-initWithHour:minute:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:":{"name":"-initWithHour:minute:second:millisecond:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:","abstract":"<p>Convenience init for creating a date with all properties</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)millisecond":{"name":"millisecond","abstract":"<p>Milliseconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)second":{"name":"second","abstract":"<p>Seconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)minute":{"name":"minute","abstract":"<p>Minutes part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)hour":{"name":"hour","abstract":"<p>Hour part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)day":{"name":"day","abstract":"<p>Day of the month</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)month":{"name":"month","abstract":"<p>Month of the year</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)year":{"name":"year","abstract":"<p>The year in YYYY format</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneMinuteOffset":{"name":"timezoneMinuteOffset","abstract":"<p>Time zone offset in Min with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneHourOffset":{"name":"timezoneHourOffset","abstract":"<p>Time zone offset in Hours with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)resultCode":{"name":"resultCode","abstract":"<p>Individual DID result code.</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)didLocation":{"name":"didLocation","abstract":"<p>Location of raw data from vehicle data DID</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)data":{"name":"data","abstract":"<p>Raw DID-based data returned for requested element.</p>","parent_name":"SDLDIDResult"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:":{"name":"-initWithId:windowName:windowType:","abstract":"<p>Constructor with the required parameters</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:":{"name":"-initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:","abstract":"<p>Convinience constructor with all the parameters.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowName":{"name":"windowName","abstract":"<p>The window name to be used by the HMI.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)type":{"name":"type","abstract":"<p>The type of the window to be created. Main window or widget.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)associatedServiceType":{"name":"associatedServiceType","abstract":"<p>Allows an app to create a widget related to a specific service type.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)duplicateUpdatesFromWindowID":{"name":"duplicateUpdatesFromWindowID","abstract":"<p>Optional parameter. Specify whether the content sent to an existing window should be duplicated to the created window. If there isn&rsquo;t a window with the ID, the request will be rejected with <code>INVALID_DATA</code>.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(im)initWithId:choiceSet:":{"name":"-initWithId:choiceSet:","abstract":"<p>Convenience init for creating a choice set RPC</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>A unique ID that identifies the Choice Set</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)choiceSet":{"name":"choiceSet","abstract":"<p>Array of choices, which the user can select by menu or voice recognition</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lifecycleConfig":{"name":"lifecycleConfig","abstract":"<p>The lifecycle configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lockScreenConfig":{"name":"lockScreenConfig","abstract":"<p>The lock screen configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)loggingConfig":{"name":"loggingConfig","abstract":"<p>The log configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig":{"name":"streamingMediaConfig","abstract":"<p>The streaming media configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig":{"name":"fileManagerConfig","abstract":"<p>The file manager configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)encryptionConfig":{"name":"encryptionConfig","abstract":"<p>The encryption configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeActive":{"name":"powerModeActive","abstract":"<p>References signal &ldquo;PowerMode_UB&rdquo;.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeQualificationStatus":{"name":"powerModeQualificationStatus","abstract":"<p>References signal &ldquo;PowerModeQF&rdquo;. See PowerModeQualificationStatus.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)carModeStatus":{"name":"carModeStatus","abstract":"<p>References signal &ldquo;CarMode&rdquo;. See CarMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeStatus":{"name":"powerModeStatus","abstract":"<p>References signal &ldquo;PowerMode&rdquo;. See PowerMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:":{"name":"-initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)nicknames":{"name":"nicknames","abstract":"<p>An array of app names a cloud app is allowed to register with. If included in a <code>SetCloudAppProperties</code> request, this value will overwrite the existing &ldquo;nicknames&rdquo; field in the app policies section of the policy table.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)enabled":{"name":"enabled","abstract":"<p>If true, the cloud app will appear in the HMI&rsquo;s app list; if false, the cloud app will not appear in the HMI&rsquo;s app list.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)authToken":{"name":"authToken","abstract":"<p>Used to authenticate websocket connection on app activation.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)cloudTransportType":{"name":"cloudTransportType","abstract":"<p>Specifies the connection type Core should use. Currently the ones that work in SDL Core are <code>WS</code> or <code>WSS</code>, but an OEM can implement their own transport adapter to handle different values.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)hybridAppPreference":{"name":"hybridAppPreference","abstract":"<p>Specifies the user preference to use the cloud app version or mobile app version when both are available.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)endpoint":{"name":"endpoint","abstract":"<p>The websocket endpoint.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:","abstract":"<p>Convenience init for climate control data with all properties.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)fanSpeed":{"name":"fanSpeed","abstract":"<p>Speed of Fan in integer</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The Current Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)desiredTemperature":{"name":"desiredTemperature","abstract":"<p>Desired Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acEnable":{"name":"acEnable","abstract":"<p>Represents if AC is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)circulateAirEnable":{"name":"circulateAirEnable","abstract":"<p>Represents if circulation of air is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)autoModeEnable":{"name":"autoModeEnable","abstract":"<p>Represents if auto mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)defrostZone":{"name":"defrostZone","abstract":"<p>Represents the kind of defrost zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)dualModeEnable":{"name":"dualModeEnable","abstract":"<p>Represents if dual mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acMaxEnable":{"name":"acMaxEnable","abstract":"<p>Represents if ac max is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>Represents the kind of Ventilation zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedSteeringWheelEnable":{"name":"heatedSteeringWheelEnable","abstract":"<p>@abstract value false means disabled/turn off, value true means enabled/turn on.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedWindshieldEnable":{"name":"heatedWindshieldEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedRearWindowEnable":{"name":"heatedRearWindowEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedMirrorsEnable":{"name":"heatedMirrorsEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)climateEnable":{"name":"climateEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:":{"name":"-initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities with all properities.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleName":{"name":"moduleName","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)fanSpeedAvailable":{"name":"fanSpeedAvailable","abstract":"<p>Availability of the control of fan speed.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)desiredTemperatureAvailable":{"name":"desiredTemperatureAvailable","abstract":"<p>Availability of the control of desired temperature.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acEnableAvailable":{"name":"acEnableAvailable","abstract":"<p>Availability of the control of turn on/off AC.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acMaxEnableAvailable":{"name":"acMaxEnableAvailable","abstract":"<p>Availability of the control of enable/disable air conditioning is ON on the maximum level.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)circulateAirEnableAvailable":{"name":"circulateAirEnableAvailable","abstract":"<p>Availability of the control of enable/disable circulate Air mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)autoModeEnableAvailable":{"name":"autoModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable auto mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)dualModeEnableAvailable":{"name":"dualModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable dual mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZoneAvailable":{"name":"defrostZoneAvailable","abstract":"<p>Availability of the control of defrost zones.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZone":{"name":"defrostZone","abstract":"<p>A set of all defrost zones that are controllable.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationModeAvailable":{"name":"ventilationModeAvailable","abstract":"<p>Availability of the control of air ventilation mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>A set of all ventilation modes that are controllable.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedSteeringWheelAvailable":{"name":"heatedSteeringWheelAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Steering Wheel.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedWindshieldAvailable":{"name":"heatedWindshieldAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Windshield.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedRearWindowAvailable":{"name":"heatedRearWindowAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Rear Window.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedMirrorsAvailable":{"name":"heatedMirrorsAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Mirrors.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)climateEnableAvailable":{"name":"climateEnableAvailable","abstract":"<p>@abstract Availability of the control of enable/disable climate control.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 10 seconds.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultLayout":{"name":"defaultLayout","abstract":"<p>Set this to change the default layout for all choice sets. If a layout is not set on an individual choice set object, then it will use this layout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout\">layout</a></code> for more details. If this is not set by you, it will default to <code>SDLChoiceSetLayoutList</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)title":{"name":"title","abstract":"<p>Maps to PerformInteraction.initialText. The title of the choice set, and/or the initial text on a keyboard prompt.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>Maps to PerformInteraction.initialPrompt. The initial prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout":{"name":"layout","abstract":"<p>Maps to PerformInteraction.interactionLayout. Whether the presented choices are arranged as a set of tiles or a list.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout":{"name":"timeout","abstract":"<p>Maps to PerformInteraction.timeout. This applies only to a manual selection (not a voice selection, which has its timeout handled by the system). Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout\">defaultTimeout</a></code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Maps to PerformInteraction.timeoutPrompt. This text is spoken when a VR interaction times out. If this set is presented in a manual (non-voice) only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Maps to PerformInteraction.helpPrompt. This is the spoken string when a user speaks &ldquo;help&rdquo; when the interaction is occurring.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpList":{"name":"helpList","abstract":"<p>Maps to PerformInteraction.vrHelp. This is a list of help text presented to the user when they are in a voice recognition interaction from your choice set of options. If this set is presented in a touch only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)delegate":{"name":"delegate","abstract":"<p>The delegate of this choice set, called when the user interacts with it.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)choices":{"name":"choices","abstract":"<p>The choices to be displayed to the user within this choice set. These choices could match those already preloaded via <code>SDLScreenManager preloadChoices:withCompletionHandler:</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:choices:":{"name":"-initWithTitle:delegate:choices:","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the choice set. If the choice set has not yet been sent to Core, it will not be sent. If the choice set is already presented on Core, the choice set will be immediately dismissed. Canceling an already presented choice set will only work if connected to Core versions 6.0+. On older versions of Core, the choice set will not be dismissed.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text":{"name":"text","abstract":"<p>Maps to Choice.menuName. The primary text of the cell. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are not permitted and will result in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> failing to initialize.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>Maps to Choice.secondaryText. Optional secondary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Maps to Choice.tertiaryText. Optional tertitary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>Maps to Choice.vrCommands. Optional voice commands the user can speak to activate the cell. If not set and the head unit requires it, this will be set to the number in the list that this item appears. However, this would be a very poor experience for a user if the choice set is presented as a voice only interaction or both interaction mode. Therefore, consider not setting this only when you know the choice set will be presented as a touch only interaction.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)artwork":{"name":"artwork","abstract":"<p>Maps to Choice.image. Optional image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>Maps to Choice.secondaryImage. Optional secondary image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)init":{"name":"-init","abstract":"<p>Initialize the cell with nothing. This is unavailable</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:":{"name":"-initWithText:","abstract":"<p>Initialize the cell with text and nothing else.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:artwork:voiceCommands:":{"name":"-initWithText:artwork:voiceCommands:","abstract":"<p>Initialize the cell with text, optional artwork, and optional voice commands</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:":{"name":"-initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:","abstract":"<p>Initialize the cell with all optional items</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:":{"name":"-initWithId:menuName:vrCommands:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with the required parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:":{"name":"-initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)choiceID":{"name":"choiceID","abstract":"<p>The application-scoped identifier that uniquely identifies this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)menuName":{"name":"menuName","abstract":"<p>Text which appears in menu, representing this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)vrCommands":{"name":"vrCommands","abstract":"<p>VR synonyms for this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)image":{"name":"image","abstract":"<p>The image of the choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryText":{"name":"secondaryText","abstract":"<p>Secondary text to display; e.g. address of POI in a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Tertiary text to display; e.g. distance to POI for a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Secondary image for choice</p>","parent_name":"SDLChoice"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:":{"name":"-initWithLanguage:hmiDisplayLanguage:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with required parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:":{"name":"-initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)language":{"name":"language","abstract":"<p>The language the app wants to change to</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>HMI display language</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)appName":{"name":"appName","abstract":"<p>Request a new app name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ttsName":{"name":"ttsName","abstract":"<p>Request a new TTSName registration.</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Request a new app short name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Request a new VR synonyms registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLCarWindowViewController.html#/c:objc(cs)SDLCarWindowViewController(py)supportedOrientation":{"name":"supportedOrientation","abstract":"<p>The supported interface orientation you wish to use. Defaults to MaskPortrait.</p>","parent_name":"SDLCarWindowViewController"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:":{"name":"-initWithFunctionID:","abstract":"<p>Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interation).</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:cancelID:":{"name":"-initWithFunctionID:cancelID:","abstract":"<p>Convenience init for dismissing a specific view.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithAlertCancelID:":{"name":"-initWithAlertCancelID:","abstract":"<p>Convenience init for dismissing an alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSliderCancelID:":{"name":"-initWithSliderCancelID:","abstract":"<p>Convenience init for dismissing a slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithScrollableMessageCancelID:":{"name":"-initWithScrollableMessageCancelID:","abstract":"<p>Convenience init for dismissing a scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithPerformInteractionCancelID:":{"name":"-initWithPerformInteractionCancelID:","abstract":"<p>Convenience init for dismissing a perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSubtleAlertCancelID:":{"name":"-initWithSubtleAlertCancelID:","abstract":"<p>Convenience init for dismissing a subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)alert":{"name":"+alert","abstract":"<p>Convenience init for dismissing the currently presented alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)slider":{"name":"+slider","abstract":"<p>Convenience init for dismissing the currently presented slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)scrollableMessage":{"name":"+scrollableMessage","abstract":"<p>Convenience init for dismissing the currently presented scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)performInteraction":{"name":"+performInteraction","abstract":"<p>Convenience init for dismissing the currently presented perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)subtleAlert":{"name":"+subtleAlert","abstract":"<p>Convenience init for dismissing the currently presented subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>The ID of the specific interaction to dismiss. If not set, the most recent of the RPC type set in functionID will be dismissed.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)functionID":{"name":"functionID","abstract":"<p>The ID of the type of interaction to dismiss.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:moduleId:buttonPressMode:":{"name":"-initWithButtonName:moduleType:moduleId:buttonPressMode:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleType":{"name":"moduleType","abstract":"<p>The module where the button should be pressed.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The name of supported RC climate or radio button.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)name":{"name":"name","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a SHORT press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a LONG press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>A NSNumber value indicates whether the button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)parkBrakeActive":{"name":"parkBrakeActive","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStableStatus":{"name":"ignitionStableStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStatus":{"name":"ignitionStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)driverDoorAjar":{"name":"driverDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)passengerDoorAjar":{"name":"passengerDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearLeftDoorAjar":{"name":"rearLeftDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearRightDoorAjar":{"name":"rearRightDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBeltDeployed":{"name":"driverBeltDeployed","abstract":"<p>References signal &ldquo;VedsDrvBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBeltDeployed":{"name":"passengerBeltDeployed","abstract":"<p>References signal &ldquo;VedsPasBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBuckleBelted":{"name":"passengerBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1PasBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBuckleBelted":{"name":"driverBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1DrvBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow2BuckleBelted":{"name":"leftRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerChildDetected":{"name":"passengerChildDetected","abstract":"<p>References signal &ldquo;VedsRw1PasChld_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow2BuckleBelted":{"name":"rightRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow2BuckleBelted":{"name":"middleRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow3BuckleBelted":{"name":"middleRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow3BuckleBelted":{"name":"leftRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow3BuckleBelted":{"name":"rightRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRearInflatableBelted":{"name":"leftRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2lRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRearInflatableBelted":{"name":"rightRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2rRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BeltDeployed":{"name":"middleRow1BeltDeployed","abstract":"<p>References signal &ldquo;VedsRw1mBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BuckleBelted":{"name":"middleRow1BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)delegate":{"name":"delegate","abstract":"<p>The delegate describing when files are done playing or any errors that occur</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)playing":{"name":"playing","abstract":"<p>Whether or not we are currently playing audio</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)queue":{"name":"queue","abstract":"<p>The queue of audio files that will be played in sequence</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)init":{"name":"-init","abstract":"<p>Init should only occur with dependencies. use <code>initWithManager:</code></p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)initWithManager:":{"name":"-initWithManager:","abstract":"<p>Create an audio stream manager with a reference to the parent stream manager.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithFileURL:":{"name":"-pushWithFileURL:","abstract":"<p>Push a new file URL onto the queue after converting it into the correct PCM format for streaming binary data. Call <code>playNextWhenReady</code> to start playing the next completed pushed file.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithData:":{"name":"-pushWithData:","abstract":"<p>Push a new audio buffer onto the queue. Call <code>playNextWhenReady</code> to start playing the pushed audio buffer.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)playNextWhenReady":{"name":"-playNextWhenReady","abstract":"<p>Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)stop":{"name":"-stop","abstract":"<p>Stop playing the queue after the current item completes and clear the queue. If nothing is playing, the queue will be cleared.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)samplingRate":{"name":"samplingRate","abstract":"<p>The sampling rate for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>The sample depth in bit for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)audioType":{"name":"audioType","abstract":"<p>The audiotype for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)inputFileURL":{"name":"inputFileURL","abstract":"<p>If initialized with a file URL, the file URL it came from</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)outputFileURL":{"name":"outputFileURL","abstract":"<p>If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)estimatedDuration":{"name":"estimatedDuration","abstract":"<p>In seconds. UINT32_MAX if unknown.</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)data":{"name":"data","abstract":"<p>The PCM audio data to be transferred and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the PCM audio data in bytes</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithInputFileURL:outputFileURL:estimatedDuration:":{"name":"-initWithInputFileURL:outputFileURL:estimatedDuration:","abstract":"<p>Initialize an audio file to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithData:":{"name":"-initWithData:","abstract":"<p>Initialize a buffer of PCM audio data to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(im)initWithSource:keepContext:volume:equalizerSettings:":{"name":"-initWithSource:keepContext:volume:equalizerSettings:","abstract":"<p>Constructs a newly allocated SDLAudioControlData object with given parameters</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)source":{"name":"source","abstract":"<p>@abstract In a getter response or a notification,","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)keepContext":{"name":"keepContext","abstract":"<p>@abstract This parameter shall not be present in any getter responses or notifications.","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)volume":{"name":"volume","abstract":"<p>@abstract Reflects the volume of audio, from 0%-100%.</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)equalizerSettings":{"name":"equalizerSettings","abstract":"<p>@abstract Defines the list of supported channels (band) and their current/desired settings on HMI</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with audio control module name (max 100 chars)</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with given parameters</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the audio control module.","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)sourceAvailable":{"name":"sourceAvailable","abstract":"<p>@abstract Availability of the control of audio source.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)keepContextAvailable":{"name":"keepContextAvailable","abstract":"<p>Availability of the keepContext parameter.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)volumeAvailable":{"name":"volumeAvailable","abstract":"<p>@abstract Availability of the control of audio volume.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerAvailable":{"name":"equalizerAvailable","abstract":"<p>@abstract Availability of the control of Equalizer Settings.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerMaxChannelId":{"name":"equalizerMaxChannelId","abstract":"<p>@abstract Must be included if equalizerAvailable=true,","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)isTemplate":{"name":"isTemplate","abstract":"<p>Describes whether or not the image is a template that can be (re)colored by the SDL HMI. To make the artwork a template, set the <code>UIImage</code>s rendering mode to <code>UIImageRenderingModeAlwaysTemplate</code>. In order for templates to work successfully, the icon must be one solid color with a clear background. The artwork should be created using the PNG image format.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)imageRPC":{"name":"imageRPC","abstract":"<p>The Image RPC representing this artwork. Generally for use internally, you should instead pass an artwork to a Screen Manager method.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:name:asImageFormat:":{"name":"+artworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:asImageFormat:":{"name":"+artworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithStaticIcon:":{"name":"+artworkWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:name:asImageFormat:":{"name":"+persistentArtworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:asImageFormat:":{"name":"+persistentArtworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:name:persistent:asImageFormat:":{"name":"-initWithImage:name:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:persistent:asImageFormat:":{"name":"-initWithImage:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithStaticIcon:":{"name":"-initWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(im)initWithAppServices:":{"name":"-initWithAppServices:","abstract":"<p>Convenience init.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(py)appServices":{"name":"appServices","abstract":"<p>An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(im)initWithServiceID:serviceManifest:servicePublished:serviceActive:":{"name":"-initWithServiceID:serviceManifest:servicePublished:serviceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceID":{"name":"serviceID","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceManifest":{"name":"serviceManifest","abstract":"<p>Manifest for the service that this record is for.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)servicePublished":{"name":"servicePublished","abstract":"<p>If true, the service is published and available. If false, the service has likely just been unpublished, and should be considered unavailable.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceActive":{"name":"serviceActive","abstract":"<p>If true, the service is the active primary service of the supplied service type. It will receive all potential RPCs that are passed through to that service type. If false, it is not the primary service of the supplied type. See servicePublished for its availability.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for serviceType.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"<p>Convenience init for a media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"<p>Convenience init for a weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"<p>Convenience init for a navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceName":{"name":"serviceName","abstract":"<p>Unique name of this service.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceIcon":{"name":"serviceIcon","abstract":"<p>The file name of the icon to be associated with this service. Most likely the same as the appIcon.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)allowAppConsumers":{"name":"allowAppConsumers","abstract":"<p>If true, app service consumers beyond the IVI system will be able to access this service. If false, only the IVI system will be able consume the service. If not provided, it is assumed to be false.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)maxRPCSpecVersion":{"name":"maxRPCSpecVersion","abstract":"<p>This is the max RPC Spec version the app service understands. This is important during the RPC passthrough functionality. If not included, it is assumed the max version of the module is acceptable.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)handledRPCs":{"name":"handledRPCs","abstract":"<p>This field contains the Function IDs for the RPCs that this service intends to handle correctly. This means the service will provide meaningful responses. See FunctionID for enum equivalent values. This parameter is an integer to allow for new function IDs to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)mediaServiceManifest":{"name":"mediaServiceManifest","abstract":"<p>A media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)weatherServiceManifest":{"name":"weatherServiceManifest","abstract":"<p>A weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)navigationServiceManifest":{"name":"navigationServiceManifest","abstract":"<p>A navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:":{"name":"-initWithAppServiceType:serviceId:","abstract":"<p>Convenience init for service type and service id.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithMediaServiceData:serviceId:":{"name":"-initWithMediaServiceData:serviceId:","abstract":"<p>Convenience init for media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithWeatherServiceData:serviceId:":{"name":"-initWithWeatherServiceData:serviceId:","abstract":"<p>Convenience init for weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithNavigationServiceData:serviceId:":{"name":"-initWithNavigationServiceData:serviceId:","abstract":"<p>Convenience init for navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:":{"name":"-initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceId":{"name":"serviceId","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)mediaServiceData":{"name":"mediaServiceData","abstract":"<p>The media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)weatherServiceData":{"name":"weatherServiceData","abstract":"<p>The weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)navigationServiceData":{"name":"navigationServiceData","abstract":"<p>The navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdatedAppServiceRecord:":{"name":"-initWithUpdatedAppServiceRecord:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdateReason:updatedAppServiceRecord:":{"name":"-initWithUpdateReason:updatedAppServiceRecord:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updateReason":{"name":"updateReason","abstract":"<p>Only included in <code>OnSystemCapbilityUpdated</code>. Update reason for this service record.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updatedAppServiceRecord":{"name":"updatedAppServiceRecord","abstract":"<p>Service record for a specific app service provider.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(cm)currentAppInfo":{"name":"+currentAppInfo","abstract":"<p>Convenience init with no parameters</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appDisplayName":{"name":"appDisplayName","abstract":"<p>The name displayed for the mobile application on the mobile device (can differ from the app name set in the initial RAI request).</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appBundleID":{"name":"appBundleID","abstract":"<p>The AppBundleID of an iOS application or package name of the Android application. This supports App Launch strategies for each platform.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appVersion":{"name":"appVersion","abstract":"<p>Represents the build version number of this particular mobile app.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAlertResponse.html#/c:objc(cs)SDLAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in seconds) that an app must wait before resending an alert.</p>","parent_name":"SDLAlertResponse"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTS:softButtons:":{"name":"-initWithTTS:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with required parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTSChunks:softButtons:":{"name":"-initWithTTSChunks:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with all parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)softButtons":{"name":"softButtons","abstract":"<p>An arry of soft buttons. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton shall be displayed.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:":{"name":"-initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:","abstract":"<p>Convenience init for creating a modal view with text, buttons, and optional sound cues.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:playTone:":{"name":"-initWithTTSChunks:playTone:","abstract":"<p>Convenience init for creating a sound-only alert.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:":{"name":"-initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:","abstract":"<p>Convenience init for setting all alert parameters.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText3":{"name":"alertText3","abstract":"<p>The optional third line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks to be spoken or a prerecorded sound file.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)duration":{"name":"duration","abstract":"<p>The duration of the displayed portion of the alert, in milliseconds. Typical timeouts are 3 - 5 seconds. If omitted, the timeout is set to a default of 5 seconds.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the TTS (if any) is spoken. If omitted or set to false, no tone is played.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)progressIndicator":{"name":"progressIndicator","abstract":"<p>If supported on the given platform, the alert GUI will include some sort of animation indicating that loading of a feature is progressing (e.g. a spinning wheel or hourglass, etc.).</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed alert. If omitted on supported displays, the displayed alert shall not have any buttons.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed in the alert. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLAlert"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverAirbagDeployed":{"name":"driverAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverSideAirbagDeployed":{"name":"driverSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverCurtainAirbagDeployed":{"name":"driverCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerAirbagDeployed":{"name":"passengerAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerCurtainAirbagDeployed":{"name":"passengerCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverKneeAirbagDeployed":{"name":"driverKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneeDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerSideAirbagDeployed":{"name":"passengerSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerKneeAirbagDeployed":{"name":"passengerKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneePasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:":{"name":"-initWithMenuID:menuName:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuID":{"name":"menuID","abstract":"<p>a Menu ID that identifies a sub menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)position":{"name":"position","abstract":"<p>a position of menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuName":{"name":"menuName","abstract":"<p>a menuName which is displayed representing this submenu item","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuIcon":{"name":"menuIcon","abstract":"<p>An image that is displayed alongside this submenu item</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuLayout":{"name":"menuLayout","abstract":"<p>The sub-menu layout. See available menu layouts on SDLWindowCapability.menuLayoutsAvailable. Defaults to LIST.</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)parentID":{"name":"parentID","abstract":"<p>Unique ID of the sub menu the command will be added to. If not provided or 0, it will be provided to the top level of the in application menu.","parent_name":"SDLAddSubMenu"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Constructs a SDLAddCommand with a handler callback when an event occurs.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:handler:":{"name":"-initWithId:vrCommands:handler:","abstract":"<p>Convenience init for creating a voice command menu item.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:handler:":{"name":"-initWithId:vrCommands:menuName:handler:","abstract":"<p>Convenience init for creating a menu item with text.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:icon:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:icon:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you created is subscribed.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdID":{"name":"cmdID","abstract":"<p>A unique id that identifies the command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)menuParams":{"name":"menuParams","abstract":"<p>A <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuParams.html\">SDLMenuParams</a></code> pointer which defines the command and how it is added to the command menu.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)vrCommands":{"name":"vrCommands","abstract":"<p>An array of strings to be used as VR synonyms for this command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdIcon":{"name":"cmdIcon","abstract":"<p>Image struct containing a static or dynamic icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html":{"name":"SDLAddCommand","abstract":"<p>This class will add a command to the application&rsquo;s Command Menu</p>"},"Classes.html#/c:objc(cs)SDLAddCommandResponse":{"name":"SDLAddCommandResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddCommand.html\">SDLAddCommand</a></code></p>"},"Classes/SDLAddSubMenu.html":{"name":"SDLAddSubMenu","abstract":"<p>Add a SDLSubMenu to the Command Menu"},"Classes.html#/c:objc(cs)SDLAddSubMenuResponse":{"name":"SDLAddSubMenuResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddSubMenu.html\">SDLAddSubMenu</a></code></p>"},"Classes/SDLAirbagStatus.html":{"name":"SDLAirbagStatus","abstract":"<p>A vehicle data status struct for airbags</p>"},"Classes/SDLAlert.html":{"name":"SDLAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. Either <code>alertText1</code>, <code>alertText2</code> or <code>TTSChunks</code> needs to be set or the request will be rejected.</p>"},"Classes/SDLAlertManeuver.html":{"name":"SDLAlertManeuver","abstract":"<p>Shows a SDLShowConstantTBT message with an optional voice command. This message is shown as an overlay over the display&rsquo;s base screen.</p>"},"Classes.html#/c:objc(cs)SDLAlertManeuverResponse":{"name":"SDLAlertManeuverResponse","abstract":"<p>Response to SDLAlertManeuver</p>"},"Classes/SDLAlertResponse.html":{"name":"SDLAlertResponse","abstract":"<p>Response to SDLAlert</p>"},"Classes/SDLAppInfo.html":{"name":"SDLAppInfo","abstract":"<p>A struct used in register app interface. Contains detailed information about the registered application.</p>"},"Classes/SDLAppServiceCapability.html":{"name":"SDLAppServiceCapability","abstract":"<p>A currently available service.</p>"},"Classes/SDLAppServiceData.html":{"name":"SDLAppServiceData","abstract":"<p>Contains all the current data of the app service. The serviceType will link to which of the service data objects are included in this object (e.g. if the service type is MEDIA, the mediaServiceData param should be included).</p>"},"Classes/SDLAppServiceManifest.html":{"name":"SDLAppServiceManifest","abstract":"<p>This manifest contains all the information necessary for the service to be published, activated, and allow consumers to interact with it</p>"},"Classes/SDLAppServiceRecord.html":{"name":"SDLAppServiceRecord","abstract":"<p>This is the record of an app service publisher that the module has. It should contain the most up to date information including the service&rsquo;s active state.</p>"},"Classes/SDLAppServicesCapabilities.html":{"name":"SDLAppServicesCapabilities","abstract":"<p>Capabilities of app services including what service types are supported and the current state of services.</p>"},"Classes/SDLArtwork.html":{"name":"SDLArtwork","abstract":"<p>An SDLFile subclass specifically designed for images</p>"},"Classes/SDLAudioControlCapabilities.html":{"name":"SDLAudioControlCapabilities","abstract":"<p>Describes a head unit&rsquo;s audio control capabilities.</p>"},"Classes/SDLAudioControlData.html":{"name":"SDLAudioControlData","abstract":"<p>The audio control data information.</p>"},"Classes/SDLAudioFile.html":{"name":"SDLAudioFile","abstract":"<p>Includes inforamtion about a given audio file</p>"},"Classes/SDLAudioPassThruCapabilities.html":{"name":"SDLAudioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}</p>"},"Classes/SDLAudioStreamManager.html":{"name":"SDLAudioStreamManager","abstract":"<p>The manager to control the audio stream</p>"},"Classes/SDLBeltStatus.html":{"name":"SDLBeltStatus","abstract":"<p>Vehicle data struct for the seat belt status</p>"},"Classes/SDLBodyInformation.html":{"name":"SDLBodyInformation","abstract":"<p>The body information including power modes.</p>"},"Classes/SDLButtonCapabilities.html":{"name":"SDLButtonCapabilities","abstract":"<p>Provides information about the capabilities of a SDL HMI button.</p>"},"Classes/SDLButtonPress.html":{"name":"SDLButtonPress","abstract":"<p>This RPC allows a remote control type mobile application to simulate a hardware button press event.</p>"},"Classes.html#/c:objc(cs)SDLButtonPressResponse":{"name":"SDLButtonPressResponse","abstract":"<p>Response to SDLButtonPress</p>"},"Classes/SDLCancelInteraction.html":{"name":"SDLCancelInteraction","abstract":"<p>Used to dismiss a modal view programmatically without needing to wait for the timeout to complete. Can be used to dismiss alerts, scrollable messages, sliders, and perform interactions (i.e. pop-up menus).</p>"},"Classes.html#/c:objc(cs)SDLCancelInteractionResponse":{"name":"SDLCancelInteractionResponse","abstract":"<p>Response to the request to dismiss a modal view. If no applicable request can be dismissed, the <code>resultCode</code> will be <code>IGNORED</code>.</p>"},"Classes/SDLCarWindowViewController.html":{"name":"SDLCarWindowViewController","abstract":"<p>Note that if this is embedded in a UINavigationController and UITabBarController, it will not lock orientation. You must lock your container controller to a specific orientation.</p>"},"Classes/SDLChangeRegistration.html":{"name":"SDLChangeRegistration","abstract":"<p>If the app recognizes during the app registration that the SDL HMI language (voice/TTS and/or display) does not match the app language, the app will be able (but does not need) to change this registration with changeRegistration prior to app being brought into focus.</p>"},"Classes.html#/c:objc(cs)SDLChangeRegistrationResponse":{"name":"SDLChangeRegistrationResponse","abstract":"<p>Response to SDLChangeRegistrations</p>"},"Classes/SDLChoice.html":{"name":"SDLChoice","abstract":"<p>A choice is an option which a user can select either via the menu or via voice recognition (VR) during an application initiated interaction.</p>"},"Classes/SDLChoiceCell.html":{"name":"SDLChoiceCell","abstract":"<p>A selectable item within an SDLChoiceSet</p>"},"Classes/SDLChoiceSet.html":{"name":"SDLChoiceSet","abstract":"<p>The choice set to be displayed to the user. Contains a list of selectable options.</p>"},"Classes/SDLClimateControlCapabilities.html":{"name":"SDLClimateControlCapabilities","abstract":"<p>Contains information about a climate control module&rsquo;s capabilities.</p>"},"Classes/SDLClimateControlData.html":{"name":"SDLClimateControlData","abstract":"<p>The current information for the Climate Remote Control Module</p>"},"Classes.html#/c:objc(cs)SDLCloseApplication":{"name":"SDLCloseApplication","abstract":"<p>Used by an app to set itself to a <code>HMILevel</code> of <code>NONE</code>. The app will close but will still be registered. If the app is a navigation app it will no longer be used as the preferred mobile-navigation application by the module.</p>"},"Classes.html#/c:objc(cs)SDLCloseApplicationResponse":{"name":"SDLCloseApplicationResponse","abstract":"<p>Response to the request to close this app on the module.</p>"},"Classes/SDLCloudAppProperties.html":{"name":"SDLCloudAppProperties","abstract":"<p>The cloud application properties.</p>"},"Classes/SDLClusterModeStatus.html":{"name":"SDLClusterModeStatus","abstract":"<p>A vehicle data struct for the cluster mode and power status</p>"},"Classes/SDLConfiguration.html":{"name":"SDLConfiguration","abstract":"<p>Contains information about the app&rsquo;s configurtion, such as lifecycle, lockscreen, encryption, etc.</p>"},"Classes/SDLCreateInteractionChoiceSet.html":{"name":"SDLCreateInteractionChoiceSet","abstract":"<p>Creates a Choice Set which can be used in subsequent <em>SDLPerformInteraction</em> Operations.</p>"},"Classes.html#/c:objc(cs)SDLCreateInteractionChoiceSetResponse":{"name":"SDLCreateInteractionChoiceSetResponse","abstract":"<p>Response to SDLCreateInteractionChoiceSet has been called</p>"},"Classes/SDLCreateWindow.html":{"name":"SDLCreateWindow","abstract":"<p>Create a new window on the display with the specified window type."},"Classes.html#/c:objc(cs)SDLCreateWindowResponse":{"name":"SDLCreateWindowResponse","abstract":"<p>Response to SDLCreateWindow</p>"},"Classes/SDLDIDResult.html":{"name":"SDLDIDResult","abstract":"<p>A vehicle data struct</p>"},"Classes/SDLDateTime.html":{"name":"SDLDateTime","abstract":"<p>A struct referenced in SendLocation for an absolute date</p>"},"Classes/SDLDeleteCommand.html":{"name":"SDLDeleteCommand","abstract":"<p>Removes a command from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteCommandResponse":{"name":"SDLDeleteCommandResponse","abstract":"<p>Response to SDLDeleteCommand</p>"},"Classes/SDLDeleteFile.html":{"name":"SDLDeleteFile","abstract":"<p>Used to delete a file resident on the SDL module in the app&rsquo;s local cache."},"Classes/SDLDeleteFileResponse.html":{"name":"SDLDeleteFileResponse","abstract":"<p>Response to SDLDeleteFile</p>"},"Classes/SDLDeleteInteractionChoiceSet.html":{"name":"SDLDeleteInteractionChoiceSet","abstract":"<p>Deletes an existing Choice Set identified by the parameter"},"Classes.html#/c:objc(cs)SDLDeleteInteractionChoiceSetResponse":{"name":"SDLDeleteInteractionChoiceSetResponse","abstract":"<p>SDLDeleteInteractionChoiceSetResponse is sent, when SDLDeleteInteractionChoiceSet has been called</p>"},"Classes/SDLDeleteSubMenu.html":{"name":"SDLDeleteSubMenu","abstract":"<p>Deletes a submenu from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteSubMenuResponse":{"name":"SDLDeleteSubMenuResponse","abstract":"<p>Response to SDLDeleteSubMenu</p>"},"Classes/SDLDeleteWindow.html":{"name":"SDLDeleteWindow","abstract":"<p>Deletes previously created window of the SDL application.</p>"},"Classes.html#/c:objc(cs)SDLDeleteWindowResponse":{"name":"SDLDeleteWindowResponse","abstract":"<p>Response to DeleteWindow</p>"},"Classes/SDLDeviceInfo.html":{"name":"SDLDeviceInfo","abstract":"<p>Various information about connecting device. Referenced in RegisterAppInterface</p>"},"Classes/SDLDeviceStatus.html":{"name":"SDLDeviceStatus","abstract":"<p>Describes the status related to a connected mobile device or SDL and if or how it is represented in the vehicle.</p>"},"Classes/SDLDiagnosticMessage.html":{"name":"SDLDiagnosticMessage","abstract":"<p>Non periodic vehicle diagnostic request</p>"},"Classes/SDLDiagnosticMessageResponse.html":{"name":"SDLDiagnosticMessageResponse","abstract":"<p>Response to SDLDiagnosticMessage</p>"},"Classes/SDLDialNumber.html":{"name":"SDLDialNumber","abstract":"<p>This RPC is used to tell the head unit to use bluetooth to dial a phone number using the phone.</p>"},"Classes.html#/c:objc(cs)SDLDialNumberResponse":{"name":"SDLDialNumberResponse","abstract":"<p>The response to SDLDialNumber</p>"},"Classes/SDLDisplayCapabilities.html":{"name":"SDLDisplayCapabilities","abstract":"<p>Contains information about the display for the SDL system to which the application is currently connected.</p>"},"Classes/SDLDisplayCapability.html":{"name":"SDLDisplayCapability","abstract":"<p>Contain the display related information and all windows related to that display.</p>"},"Classes/SDLDriverDistractionCapability.html":{"name":"SDLDriverDistractionCapability","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLDynamicUpdateCapabilities.html":{"name":"SDLDynamicUpdateCapabilities","abstract":"<p>@since SDL 7.0</p>"},"Classes/SDLECallInfo.html":{"name":"SDLECallInfo","abstract":"<p>A vehicle data struct for emergency call information</p>"},"Classes/SDLEmergencyEvent.html":{"name":"SDLEmergencyEvent","abstract":"<p>A vehicle data struct for an emergency event</p>"},"Classes/SDLEncodedSyncPData.html":{"name":"SDLEncodedSyncPData","abstract":"<p>Allows encoded data in the form of SyncP packets to be sent to the SYNC module. Legacy / v1 Protocol implementation; use SyncPData instead.</p>"},"Classes.html#/c:objc(cs)SDLEncodedSyncPDataResponse":{"name":"SDLEncodedSyncPDataResponse","abstract":"<p>The response to SDLEncodedSyncPData</p>"},"Classes/SDLEncryptionConfiguration.html":{"name":"SDLEncryptionConfiguration","abstract":"<p>The encryption configuration data</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThru":{"name":"SDLEndAudioPassThru","abstract":"<p>When this request is invoked, the audio capture stops</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThruResponse":{"name":"SDLEndAudioPassThruResponse","abstract":"<p>Response to SDLEndAudioPassThru</p>"},"Classes/SDLEqualizerSettings.html":{"name":"SDLEqualizerSettings","abstract":"<p>Defines the each Equalizer channel settings.</p>"},"Classes/SDLFile.html":{"name":"SDLFile","abstract":"<p>Crates an SDLFile from a file</p>"},"Classes/SDLFileManager.html":{"name":"SDLFileManager","abstract":"<p>The SDLFileManager is an RPC manager for the remote file system. After it starts, it will attempt to communicate with the remote file system to get the names of all files. Deleting and Uploading will them queue these changes as transactions. If a delete succeeds, the local list of remote files will remove that file name, and likewise, if an upload succeeds, the local list of remote files will now include that file name.</p>"},"Classes/SDLFileManagerConfiguration.html":{"name":"SDLFileManagerConfiguration","abstract":"<p>File manager configuration information</p>"},"Classes/SDLFuelRange.html":{"name":"SDLFuelRange","abstract":"<p>Describes the distance a vehicle can travel with the current level of fuel.</p>"},"Classes/SDLFunctionID.html":{"name":"SDLFunctionID","abstract":"<p>A function ID for an SDL RPC</p>"},"Classes/SDLGPSData.html":{"name":"SDLGPSData","abstract":"<p>Describes the GPS data. Not all data will be available on all carlines.</p>"},"Classes/SDLGearStatus.html":{"name":"SDLGearStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLGenericResponse":{"name":"SDLGenericResponse","abstract":"<p>Generic Response is sent when the name of a received request is unknown. It is only used in case of an error. It will have an INVALID_DATA result code.</p>"},"Classes/SDLGetAppServiceData.html":{"name":"SDLGetAppServiceData","abstract":"<p>This request asks the module for current data related to the specific service. It also includes an option to subscribe to that service for future updates.</p>"},"Classes/SDLGetAppServiceDataResponse.html":{"name":"SDLGetAppServiceDataResponse","abstract":"<p>This response includes the data that was requested from the specific service.</p>"},"Classes/SDLGetCloudAppProperties.html":{"name":"SDLGetCloudAppProperties","abstract":"<p>RPC used to get the current properties of a cloud application.</p>"},"Classes/SDLGetCloudAppPropertiesResponse.html":{"name":"SDLGetCloudAppPropertiesResponse","abstract":"<p>The response to GetCloudAppProperties</p>"},"Classes/SDLGetDTCs.html":{"name":"SDLGetDTCs","abstract":"<p>This RPC allows to request diagnostic module trouble codes from a certain"},"Classes/SDLGetDTCsResponse.html":{"name":"SDLGetDTCsResponse","abstract":"<p>Response to SDLGetDTCs</p>"},"Classes/SDLGetFile.html":{"name":"SDLGetFile","abstract":"<p>This request is sent to the module to retrieve a file.</p>"},"Classes/SDLGetFileResponse.html":{"name":"SDLGetFileResponse","abstract":"<p>Response to GetFiles</p>"},"Classes/SDLGetInteriorVehicleData.html":{"name":"SDLGetInteriorVehicleData","abstract":"<p>Reads the current status value of specified remote control module (type)."},"Classes/SDLGetInteriorVehicleDataConsent.html":{"name":"SDLGetInteriorVehicleDataConsent","abstract":"<p>This RPC allows you to get consent to control a certian module</p>"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html":{"name":"SDLGetInteriorVehicleDataConsentResponse","abstract":"<p>Response to GetInteriorVehicleDataConsent</p>"},"Classes/SDLGetInteriorVehicleDataResponse.html":{"name":"SDLGetInteriorVehicleDataResponse","abstract":"<p>A response to SDLGetInteriorVehicleData</p>"},"Classes/SDLGetSystemCapability.html":{"name":"SDLGetSystemCapability","abstract":"<p>SDL RPC Request for expanded information about a supported system/HMI capability</p>"},"Classes/SDLGetSystemCapabilityResponse.html":{"name":"SDLGetSystemCapabilityResponse","abstract":"<p>Response to SDLGetSystemCapability</p>"},"Classes/SDLGetVehicleData.html":{"name":"SDLGetVehicleData","abstract":"<p>Requests current values of specific published vehicle data items.</p>"},"Classes/SDLGetVehicleDataResponse.html":{"name":"SDLGetVehicleDataResponse","abstract":"<p>Response to SDLGetVehicleData</p>"},"Classes/SDLGetWayPoints.html":{"name":"SDLGetWayPoints","abstract":"<p>This RPC allows you to get navigation waypoint data</p>"},"Classes/SDLGetWayPointsResponse.html":{"name":"SDLGetWayPointsResponse","abstract":"<p>Response to SDLGetWayPoints</p>"},"Classes/SDLGrid.html":{"name":"SDLGrid","abstract":"<p>Describes a location (origin coordinates and span) of a vehicle component.</p>"},"Classes/SDLHMICapabilities.html":{"name":"SDLHMICapabilities","abstract":"<p>Contains information about the HMI capabilities.</p>"},"Classes/SDLHMIPermissions.html":{"name":"SDLHMIPermissions","abstract":"<p>Defining sets of HMI levels, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLHMISettingsControlCapabilities.html":{"name":"SDLHMISettingsControlCapabilities","abstract":"<p>HMI data struct for HMI control settings</p>"},"Classes/SDLHMISettingsControlData.html":{"name":"SDLHMISettingsControlData","abstract":"<p>Corresponds to &ldquo;HMI_SETTINGS&rdquo; ModuleType</p>"},"Classes/SDLHapticRect.html":{"name":"SDLHapticRect","abstract":"<p>Defines spatial for each user control object for video streaming application</p>"},"Classes/SDLHeadLampStatus.html":{"name":"SDLHeadLampStatus","abstract":"<p>Vehicle data struct for status of head lamps</p>"},"Classes/SDLImage.html":{"name":"SDLImage","abstract":"<p>Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.</p>"},"Classes/SDLImageField.html":{"name":"SDLImageField","abstract":"<p>A struct used in DisplayCapabilities describing the capability of an image field</p>"},"Classes/SDLImageResolution.html":{"name":"SDLImageResolution","abstract":"<p>The resolution of an image</p>"},"Classes/SDLKeyboardProperties.html":{"name":"SDLKeyboardProperties","abstract":"<p>Configuration of on-screen keyboard (if available)</p>"},"Classes/SDLLifecycleConfiguration.html":{"name":"SDLLifecycleConfiguration","abstract":"<p>Configuration options for SDLManager</p>"},"Classes/SDLLifecycleConfigurationUpdate.html":{"name":"SDLLifecycleConfigurationUpdate","abstract":"<p>Configuration update options for SDLManager. This class can be used to update the lifecycle configuration in"},"Classes/SDLLightCapabilities.html":{"name":"SDLLightCapabilities","abstract":"<p>Current Light capabilities.</p>"},"Classes/SDLLightControlCapabilities.html":{"name":"SDLLightControlCapabilities","abstract":"<p>Current light control capabilities.</p>"},"Classes/SDLLightControlData.html":{"name":"SDLLightControlData","abstract":"<p>Data about the current light controls</p>"},"Classes/SDLLightState.html":{"name":"SDLLightState","abstract":"<p>Current light control state</p>"},"Classes.html#/c:objc(cs)SDLListFiles":{"name":"SDLListFiles","abstract":"<p>Requests the current list of resident filenames for the registered app. Not"},"Classes/SDLListFilesResponse.html":{"name":"SDLListFilesResponse","abstract":"<p>Response to SDLListFiles</p>"},"Classes/SDLLocationCoordinate.html":{"name":"SDLLocationCoordinate","abstract":"<p>Describes a coordinate on earth</p>"},"Classes/SDLLocationDetails.html":{"name":"SDLLocationDetails","abstract":"<p>Describes a location, including its coordinate, name, etc. Used in WayPoints.</p>"},"Classes/SDLLockScreenConfiguration.html":{"name":"SDLLockScreenConfiguration","abstract":"<p>A configuration describing how the lock screen should be used by the internal SDL system for your application. This configuration is provided before SDL starts and will govern the entire SDL lifecycle of your application.</p>"},"Classes/SDLLockScreenViewController.html":{"name":"SDLLockScreenViewController","abstract":"<p>The view controller for the lockscreen.</p>"},"Classes/SDLLogConfiguration.html":{"name":"SDLLogConfiguration","abstract":"<p>Information about the current logging configuration</p>"},"Classes/SDLLogFileModule.html":{"name":"SDLLogFileModule","abstract":"<p>A log file module is a collection of source code files that form a cohesive unit and that logs can all use to describe themselves. E.g. a &ldquo;transport&rdquo; module, or a &ldquo;Screen Manager&rdquo; module.</p>"},"Classes/SDLLogFilter.html":{"name":"SDLLogFilter","abstract":"<p>Represents a filter over which SDL logs should be logged</p>"},"Classes/SDLLogManager.html":{"name":"SDLLogManager","abstract":"<p>This is the central manager of logging. A developer should not have to interact with this class, it is exclusively used internally.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetAppleSystemLog":{"name":"SDLLogTargetAppleSystemLog","abstract":"<p>The Apple System Log target is an iOS 2.0+ compatible log target that logs to both the Console and to the System Log.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetFile":{"name":"SDLLogTargetFile","abstract":"<p>The File log will log to a text file on the iPhone in Documents/smartdevicelink/log/#appName##datetime##.log. It will log up to 3 logs which will rollover.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetOSLog":{"name":"SDLLogTargetOSLog","abstract":"<p>OS_LOG is an iOS 10+ only logging system that logs to the Console and the Apple system console. This is an improved replacement for Apple SysLog (SDLLogTargetAppleSystemLog). </p>"},"Classes/SDLManager.html":{"name":"SDLManager","abstract":"<p>The top level manager object for all of SDL&rsquo;s interactions with the app and the head unit</p>"},"Classes/SDLMassageCushionFirmness.html":{"name":"SDLMassageCushionFirmness","abstract":"<p>The intensity or firmness of a cushion.</p>"},"Classes/SDLMassageModeData.html":{"name":"SDLMassageModeData","abstract":"<p>Specify the mode of a massage zone.</p>"},"Classes/SDLMediaServiceData.html":{"name":"SDLMediaServiceData","abstract":"<p>This data is related to what a media service should provide.</p>"},"Classes.html#/c:objc(cs)SDLMediaServiceManifest":{"name":"SDLMediaServiceManifest","abstract":"<p>A media service manifest.</p>"},"Classes/SDLMenuCell.html":{"name":"SDLMenuCell","abstract":"<p>A menu cell item for the main menu or sub-menu.</p>"},"Classes/SDLMenuConfiguration.html":{"name":"SDLMenuConfiguration","abstract":"<p>Defines how the menu is configured</p>"},"Classes/SDLMenuParams.html":{"name":"SDLMenuParams","abstract":"<p>Used when adding a sub menu to an application menu or existing sub menu.</p>"},"Classes/SDLMetadataTags.html":{"name":"SDLMetadataTags","abstract":"<p>Metadata for Show fields</p>"},"Classes/SDLModuleData.html":{"name":"SDLModuleData","abstract":"<p>Describes a remote control module&rsquo;s data</p>"},"Classes/SDLModuleInfo.html":{"name":"SDLModuleInfo","abstract":"<p>Contains information about a RC module.</p>"},"Classes/SDLMsgVersion.html":{"name":"SDLMsgVersion","abstract":"<p>Specifies the version number of the SDL V4 interface. This is used by both the application and SDL to declare what interface version each is using.</p>"},"Classes/SDLMyKey.html":{"name":"SDLMyKey","abstract":"<p>Vehicle Data struct</p>"},"Classes/SDLNavigationCapability.html":{"name":"SDLNavigationCapability","abstract":"<p>Extended capabilities for an onboard navigation system</p>"},"Classes/SDLNavigationInstruction.html":{"name":"SDLNavigationInstruction","abstract":"<p>A navigation instruction.</p>"},"Classes/SDLNavigationServiceData.html":{"name":"SDLNavigationServiceData","abstract":"<p>This data is related to what a navigation service would provide.</p>"},"Classes/SDLNavigationServiceManifest.html":{"name":"SDLNavigationServiceManifest","abstract":"<p>A navigation service manifest.</p>"},"Classes/SDLNotificationConstants.html":{"name":"SDLNotificationConstants","abstract":"<p>This class defines methods for getting groups of notifications</p>"},"Classes/SDLOasisAddress.html":{"name":"SDLOasisAddress","abstract":"<p>Struct used in SendLocation describing an address</p>"},"Classes/SDLOnAppInterfaceUnregistered.html":{"name":"SDLOnAppInterfaceUnregistered","abstract":"<p>Notifies an application that its interface registration has been terminated. This means that all SDL resources associated with the application are discarded, including the Command Menu, Choice Sets, button subscriptions, etc.</p>"},"Classes/SDLOnAppServiceData.html":{"name":"SDLOnAppServiceData","abstract":"<p>This notification includes the data that is updated from the specific service.</p>"},"Classes.html#/c:objc(cs)SDLOnAudioPassThru":{"name":"SDLOnAudioPassThru","abstract":"<p>Binary data is in binary part of hybrid msg.</p>"},"Classes/SDLOnButtonEvent.html":{"name":"SDLOnButtonEvent","abstract":"<p>Notifies application that user has depressed or released a button to which"},"Classes/SDLOnButtonPress.html":{"name":"SDLOnButtonPress","abstract":"<p>Notifies application of button press events for buttons to which the application is subscribed. SDL supports two button press events defined as follows:</p>"},"Classes/SDLOnCommand.html":{"name":"SDLOnCommand","abstract":"<p>This is called when a command was selected via VR after pressing the PTT button, or selected from the menu after pressing the MENU button.</p>"},"Classes/SDLOnDriverDistraction.html":{"name":"SDLOnDriverDistraction","abstract":"<p>Notifies the application of the current driver distraction state (whether driver distraction rules are in effect, or not).</p>"},"Classes/SDLOnEncodedSyncPData.html":{"name":"SDLOnEncodedSyncPData","abstract":"<p>Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED ***</p>"},"Classes/SDLOnHMIStatus.html":{"name":"SDLOnHMIStatus"},"Classes/SDLOnHashChange.html":{"name":"SDLOnHashChange","abstract":"<p>Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of all persisted app data.</p>"},"Classes/SDLOnInteriorVehicleData.html":{"name":"SDLOnInteriorVehicleData","abstract":"<p>Notifications when subscribed vehicle data changes.</p>"},"Classes/SDLOnKeyboardInput.html":{"name":"SDLOnKeyboardInput","abstract":"<p>Sent when a keyboard presented by a PerformInteraction has a keyboard input.</p>"},"Classes/SDLOnLanguageChange.html":{"name":"SDLOnLanguageChange","abstract":"<p>Provides information to what language the SDL HMI language was changed</p>"},"Classes/SDLOnPermissionsChange.html":{"name":"SDLOnPermissionsChange","abstract":"<p>Provides update to app of which sets of functions are available</p>"},"Classes/SDLOnRCStatus.html":{"name":"SDLOnRCStatus","abstract":"<p>OnRCStatus notifications to all registered mobile applications and the HMI whenever"},"Classes.html#/c:objc(cs)SDLOnSubtleAlertPressed":{"name":"SDLOnSubtleAlertPressed","abstract":"<p>Sent when the alert itself is touched (outside of a soft button). Touching (or otherwise selecting) the alert should open the app before sending this notification.</p>"},"Classes/SDLOnSyncPData.html":{"name":"SDLOnSyncPData","abstract":"<p>DEPRECATED</p>"},"Classes/SDLOnSystemCapabilityUpdated.html":{"name":"SDLOnSystemCapabilityUpdated","abstract":"<p>A notification to inform the connected device that a specific system capability has changed.</p>"},"Classes/SDLOnSystemRequest.html":{"name":"SDLOnSystemRequest","abstract":"<p>An asynchronous request from the system for specific data from the device or the cloud or response to a request from the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication request responses)</p>"},"Classes/SDLOnTBTClientState.html":{"name":"SDLOnTBTClientState","abstract":"<p>Provides applications with notifications specific to the current TBT client status on the module</p>"},"Classes/SDLOnTouchEvent.html":{"name":"SDLOnTouchEvent","abstract":"<p>Notifies about touch events on the screen&rsquo;s prescribed area during video streaming</p>"},"Classes/SDLOnUpdateFile.html":{"name":"SDLOnUpdateFile","abstract":"<p>This notification tells an app to upload and update a file with a given name.</p>"},"Classes/SDLOnUpdateSubMenu.html":{"name":"SDLOnUpdateSubMenu","abstract":"<p>This notification tells an app to update the AddSubMenu or its &lsquo;sub&rsquo; AddCommand and AddSubMenus with the requested data</p>"},"Classes/SDLOnVehicleData.html":{"name":"SDLOnVehicleData","abstract":"<p>Callback for the periodic and non periodic vehicle data read function.</p>"},"Classes/SDLOnWayPointChange.html":{"name":"SDLOnWayPointChange","abstract":"<p>Notification which provides the entire LocationDetails when there is a change to any waypoints or destination.</p>"},"Classes/SDLParameterPermissions.html":{"name":"SDLParameterPermissions","abstract":"<p>Defining sets of parameters, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLPerformAppServiceInteraction.html":{"name":"SDLPerformAppServiceInteraction","abstract":"<p>App service providers will likely have different actions exposed to the module and app service consumers. It will be difficult to standardize these actions by RPC versions and can easily become stale. Therefore, we introduce a best-effort attempt to take actions on a service.</p>"},"Classes/SDLPerformAppServiceInteractionResponse.html":{"name":"SDLPerformAppServiceInteractionResponse","abstract":"<p>Response to the request to request an app service.</p>"},"Classes/SDLPerformAudioPassThru.html":{"name":"SDLPerformAudioPassThru","abstract":"<p>This will open an audio pass thru session. By doing so the app can receive"},"Classes.html#/c:objc(cs)SDLPerformAudioPassThruResponse":{"name":"SDLPerformAudioPassThruResponse","abstract":"<p>Response to SDLPerformAudioPassThru</p>"},"Classes/SDLPerformInteraction.html":{"name":"SDLPerformInteraction","abstract":"<p>Performs an application-initiated interaction in which the user can select a choice from the passed choice set.</p>"},"Classes/SDLPerformInteractionResponse.html":{"name":"SDLPerformInteractionResponse","abstract":"<p>PerformInteraction Response is sent, when SDLPerformInteraction has been called</p>"},"Classes/SDLPermissionElement.html":{"name":"SDLPermissionElement","abstract":"<p>An object containing the RPC name and its parameter names that should be checked when checking permissions</p>"},"Classes/SDLPermissionItem.html":{"name":"SDLPermissionItem","abstract":"<p>Permissions for a given set of RPCs</p>"},"Classes/SDLPermissionManager.html":{"name":"SDLPermissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>"},"Classes/SDLPhoneCapability.html":{"name":"SDLPhoneCapability","abstract":"<p>Extended capabilities of the module&rsquo;s phone feature</p>"},"Classes/SDLPinchGesture.html":{"name":"SDLPinchGesture","abstract":"<p>Pinch Gesture information</p>"},"Classes/SDLPresetBankCapabilities.html":{"name":"SDLPresetBankCapabilities","abstract":"<p>Contains information about on-screen preset capabilities.</p>"},"Classes/SDLPublishAppService.html":{"name":"SDLPublishAppService","abstract":"<p>Registers a service offered by this app on the module."},"Classes/SDLPublishAppServiceResponse.html":{"name":"SDLPublishAppServiceResponse","abstract":"<p>Response to the request to register a service offered by this app on the module.</p>"},"Classes/SDLPutFile.html":{"name":"SDLPutFile","abstract":"<p>Used to push a binary data onto the SDL module from a mobile device, such as icons and album art.</p>"},"Classes/SDLPutFileResponse.html":{"name":"SDLPutFileResponse","abstract":"<p>Response to SDLPutFile</p>"},"Classes/SDLRDSData.html":{"name":"SDLRDSData","abstract":"<p>Include the data defined in Radio Data System, which is a communications protocol standard for embedding small amounts of digital information in conventional FM radio broadcasts.</p>"},"Classes/SDLRGBColor.html":{"name":"SDLRGBColor","abstract":"<p>Represents an RGB color</p>"},"Classes/SDLRPCMessage.html":{"name":"SDLRPCMessage","abstract":"<p>Parent class of all RPC messages.</p>"},"Classes.html#/c:objc(cs)SDLRPCNotification":{"name":"SDLRPCNotification","abstract":"<p>An RPC sent from the head unit to the app about some data change, such as a button was pressed</p>"},"Classes/SDLRPCNotificationNotification.html":{"name":"SDLRPCNotificationNotification","abstract":"<p>An NSNotification object that makes retrieving internal SDLRPCNotification data easier</p>"},"Classes/SDLRPCPermissionStatus.html":{"name":"SDLRPCPermissionStatus","abstract":"<p>An object containing the result status of a permission element request</p>"},"Classes/SDLRPCRequest.html":{"name":"SDLRPCRequest","abstract":"<p>Superclass of RPC requests</p>"},"Classes/SDLRPCRequestNotification.html":{"name":"SDLRPCRequestNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCRequest data easier</p>"},"Classes/SDLRPCResponse.html":{"name":"SDLRPCResponse","abstract":"<p>Superclass of RPC responses</p>"},"Classes/SDLRPCResponseNotification.html":{"name":"SDLRPCResponseNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCResponse data easier</p>"},"Classes/SDLRPCStruct.html":{"name":"SDLRPCStruct","abstract":"<p>Superclass of all RPC-related structs and messages</p>"},"Classes/SDLRadioControlCapabilities.html":{"name":"SDLRadioControlCapabilities","abstract":"<p>Contains information about a radio control module&rsquo;s capabilities.</p>"},"Classes/SDLRadioControlData.html":{"name":"SDLRadioControlData","abstract":"<p>Include information (both read-only and changeable data) about a remote control radio module.</p>"},"Classes/SDLReadDID.html":{"name":"SDLReadDID","abstract":"<p>Non periodic vehicle data read request. This is an RPC to get diagnostics"},"Classes/SDLReadDIDResponse.html":{"name":"SDLReadDIDResponse","abstract":"<p>A response to ReadDID</p>"},"Classes/SDLRectangle.html":{"name":"SDLRectangle","abstract":"<p>A struct describing a rectangle</p>"},"Classes/SDLRegisterAppInterface.html":{"name":"SDLRegisterAppInterface","abstract":"<p>Registers the application&rsquo;s interface with SDL. The <code>RegisterAppInterface</code> RPC declares the properties of the app, including the messaging interface version, the app name, etc. The mobile application must establish its interface registration with SDL before any other interaction with SDL can take place. The registration lasts until it is terminated either by the application calling the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses.html#/c:objc(cs)SDLUnregisterAppInterface\">SDLUnregisterAppInterface</a></code> method, or by SDL sending an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnAppInterfaceUnregistered.html\">SDLOnAppInterfaceUnregistered</a></code> notification, or by loss of the underlying transport connection, or closing of the underlying message transmission protocol RPC session.</p>"},"Classes/SDLRegisterAppInterfaceResponse.html":{"name":"SDLRegisterAppInterfaceResponse","abstract":"<p>Response to SDLRegisterAppInterface</p>"},"Classes/SDLReleaseInteriorVehicleDataModule.html":{"name":"SDLReleaseInteriorVehicleDataModule","abstract":"<p>Releases a controlled remote control module so others can take control</p>"},"Classes.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModuleResponse":{"name":"SDLReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Response to ReleaseInteriorVehicleDataModule</p>"},"Classes/SDLRemoteControlCapabilities.html":{"name":"SDLRemoteControlCapabilities","abstract":"<p>Capabilities of the remote control feature</p>"},"Classes/SDLResetGlobalProperties.html":{"name":"SDLResetGlobalProperties","abstract":"<p>Resets the passed global properties to their default values as defined by"},"Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse":{"name":"SDLResetGlobalPropertiesResponse","abstract":"<p>Response to ResetGlobalProperties</p>"},"Classes/SDLSISData.html":{"name":"SDLSISData","abstract":"<p>HD radio Station Information Service (SIS) data.</p>"},"Classes/SDLScreenManager.html":{"name":"SDLScreenManager","abstract":"<p>The SDLScreenManager is a manager to control SDL UI features. Use the screen manager for setting up the UI of the template, creating a menu for your users, creating softbuttons, setting textfields, etc..</p>"},"Classes/SDLScreenParams.html":{"name":"SDLScreenParams","abstract":"<p>A struct in DisplayCapabilities describing parameters related to a video / touch input area</p>"},"Classes/SDLScrollableMessage.html":{"name":"SDLScrollableMessage","abstract":"<p>Creates a full screen overlay containing a large block of formatted text that can be scrolled with buttons available.</p>"},"Classes.html#/c:objc(cs)SDLScrollableMessageResponse":{"name":"SDLScrollableMessageResponse","abstract":"<p>Response to SDLScrollableMessage</p>"},"Classes/SDLSeatControlCapabilities.html":{"name":"SDLSeatControlCapabilities","abstract":"<p>Include information about a seat control capabilities.</p>"},"Classes/SDLSeatControlData.html":{"name":"SDLSeatControlData","abstract":"<p>Seat control data corresponds to &ldquo;SEAT&rdquo; ModuleType.</p>"},"Classes/SDLSeatLocation.html":{"name":"SDLSeatLocation","abstract":"<p>Describes the location of a seat</p>"},"Classes/SDLSeatLocationCapability.html":{"name":"SDLSeatLocationCapability","abstract":"<p>Contains information about the locations of each seat.</p>"},"Classes/SDLSeatMemoryAction.html":{"name":"SDLSeatMemoryAction","abstract":"<p>Specify the action to be performed.</p>"},"Classes/SDLSendHapticData.html":{"name":"SDLSendHapticData","abstract":"<p>Sends the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by the HMI to determine how and when haptic events should occur.</p>"},"Classes.html#/c:objc(cs)SDLSendHapticDataResponse":{"name":"SDLSendHapticDataResponse","abstract":"<p>Response to SDLSendHapticData</p>"},"Classes/SDLSendLocation.html":{"name":"SDLSendLocation","abstract":"<p>SendLocation is used to send a location to the navigation system for navigation</p>"},"Classes.html#/c:objc(cs)SDLSendLocationResponse":{"name":"SDLSendLocationResponse","abstract":"<p>Response to SDLSendLocation</p>"},"Classes/SDLSetAppIcon.html":{"name":"SDLSetAppIcon","abstract":"<p>Used to set existing local file on SDL as the app&rsquo;s icon. Not supported on"},"Classes.html#/c:objc(cs)SDLSetAppIconResponse":{"name":"SDLSetAppIconResponse","abstract":"<p>Response to SDLSetAppIcon</p>"},"Classes/SDLSetCloudAppProperties.html":{"name":"SDLSetCloudAppProperties","abstract":"<p>RPC used to enable/disable a cloud application and set authentication data</p>"},"Classes.html#/c:objc(cs)SDLSetCloudAppPropertiesResponse":{"name":"SDLSetCloudAppPropertiesResponse","abstract":"<p>The response to SetCloudAppProperties</p>"},"Classes/SDLSetDisplayLayout.html":{"name":"SDLSetDisplayLayout","abstract":"<p>Used to set an alternate display layout. If not sent, default screen for"},"Classes/SDLSetDisplayLayoutResponse.html":{"name":"SDLSetDisplayLayoutResponse","abstract":"<p>Response to SDLSetDisplayLayout</p>"},"Classes/SDLSetGlobalProperties.html":{"name":"SDLSetGlobalProperties","abstract":"<p>Sets global property values</p>"},"Classes.html#/c:objc(cs)SDLSetGlobalPropertiesResponse":{"name":"SDLSetGlobalPropertiesResponse","abstract":"<p>Response to SDLSetGlobalProperties</p>"},"Classes/SDLSetInteriorVehicleData.html":{"name":"SDLSetInteriorVehicleData","abstract":"<p>This RPC allows a remote control type mobile application to"},"Classes/SDLSetInteriorVehicleDataResponse.html":{"name":"SDLSetInteriorVehicleDataResponse","abstract":"<p>Response to SDLSetInteriorVehicleData</p>"},"Classes/SDLSetMediaClockTimer.html":{"name":"SDLSetMediaClockTimer","abstract":"<p>Sets the media clock/timer value and the update method (e.g.count-up,"},"Classes.html#/c:objc(cs)SDLSetMediaClockTimerResponse":{"name":"SDLSetMediaClockTimerResponse","abstract":"<p>Response to SDLSetMediaClockTimer</p>"},"Classes/SDLShow.html":{"name":"SDLShow","abstract":"<p>Updates the application&rsquo;s display text area, regardless of whether or not"},"Classes/SDLShowAppMenu.html":{"name":"SDLShowAppMenu","abstract":"<p>Used by an app to show the app&rsquo;s menu, typically this is used by a navigation app if the menu button is hidden.</p>"},"Classes.html#/c:objc(cs)SDLShowAppMenuResponse":{"name":"SDLShowAppMenuResponse","abstract":"<p>Response to the request to show the app menu.</p>"},"Classes/SDLShowConstantTBT.html":{"name":"SDLShowConstantTBT","abstract":"<p>This RPC is used to update the user with navigation information for the constantly shown screen (base screen), but also for the alert maneuver screen.</p>"},"Classes.html#/c:objc(cs)SDLShowConstantTBTResponse":{"name":"SDLShowConstantTBTResponse","abstract":"<p>Response to SDLShowConstantTBT</p>"},"Classes.html#/c:objc(cs)SDLShowResponse":{"name":"SDLShowResponse","abstract":"<p>Response to SDLShow</p>"},"Classes/SDLSingleTireStatus.html":{"name":"SDLSingleTireStatus","abstract":"<p>Tire pressure status of a single tire.</p>"},"Classes/SDLSlider.html":{"name":"SDLSlider","abstract":"<p>Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider.</p>"},"Classes/SDLSliderResponse.html":{"name":"SDLSliderResponse","abstract":"<p>Response to SDLSlider</p>"},"Classes/SDLSoftButton.html":{"name":"SDLSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>"},"Classes/SDLSoftButtonCapabilities.html":{"name":"SDLSoftButtonCapabilities","abstract":"<p>Contains information about a SoftButton&rsquo;s capabilities.</p>"},"Classes/SDLSoftButtonObject.html":{"name":"SDLSoftButtonObject","abstract":"<p>A soft button wrapper object that is capable of storing and switching between states</p>"},"Classes/SDLSoftButtonState.html":{"name":"SDLSoftButtonState","abstract":"<p>A soft button state including data such as text, name and artwork</p>"},"Classes/SDLSpeak.html":{"name":"SDLSpeak","abstract":"<p>Speaks a phrase over the vehicle audio system using SDL&rsquo;s TTS (text-to-speech) engine. The provided text to be spoken can be simply a text phrase, or it can consist of phoneme specifications to direct SDL&rsquo;s TTS engine to speak a &ldquo;speech-sculpted&rdquo; phrase.</p>"},"Classes.html#/c:objc(cs)SDLSpeakResponse":{"name":"SDLSpeakResponse","abstract":"<p>Response to SDLSpeak</p>"},"Classes/SDLStabilityControlsStatus.html":{"name":"SDLStabilityControlsStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLStartTime.html":{"name":"SDLStartTime","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStationIDNumber.html":{"name":"SDLStationIDNumber","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStreamingMediaConfiguration.html":{"name":"SDLStreamingMediaConfiguration","abstract":"<p>The streaming media configuration. Use this class to configure streaming media information.</p>"},"Classes/SDLStreamingMediaManager.html":{"name":"SDLStreamingMediaManager","abstract":"<p>Manager to help control streaming (video and audio) media services.</p>"},"Classes/SDLStreamingVideoScaleManager.html":{"name":"SDLStreamingVideoScaleManager","abstract":"<p>This class consolidates the logic of scaling between the view controller&rsquo;s coordinate system and the display&rsquo;s coordinate system.</p>"},"Classes/SDLSubscribeButton.html":{"name":"SDLSubscribeButton","abstract":"<p>Establishes a subscription to button notifications for HMI buttons. Buttons"},"Classes.html#/c:objc(cs)SDLSubscribeButtonResponse":{"name":"SDLSubscribeButtonResponse","abstract":"<p>Response to SDLSubscribeButton</p>"},"Classes/SDLSubscribeVehicleData.html":{"name":"SDLSubscribeVehicleData","abstract":"<p>Subscribes to specific published vehicle data items. The data will be only sent if it has changed. The application will be notified by the <code>onVehicleData</code> notification whenever new data is available. The update rate is dependent on sensors, vehicle architecture and vehicle type.</p>"},"Classes/SDLSubscribeVehicleDataResponse.html":{"name":"SDLSubscribeVehicleDataResponse","abstract":"<p>Response to SDLSubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLSubscribeWayPoints":{"name":"SDLSubscribeWayPoints","abstract":"<p>A SDLSubscribeWaypoints can be sent to subscribe"},"Classes.html#/c:objc(cs)SDLSubscribeWayPointsResponse":{"name":"SDLSubscribeWayPointsResponse","abstract":"<p>Response to SubscribeWayPoints</p>"},"Classes/SDLSubtleAlert.html":{"name":"SDLSubtleAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. At least either alertText1, alertText2 or TTSChunks need to be provided.</p>"},"Classes/SDLSubtleAlertResponse.html":{"name":"SDLSubtleAlertResponse","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLSyncPData":{"name":"SDLSyncPData","abstract":"<p>Allows binary data in the form of SyncP packets to be sent to the SYNC module. Binary data is in binary part of hybrid msg.</p>"},"Classes.html#/c:objc(cs)SDLSyncPDataResponse":{"name":"SDLSyncPDataResponse","abstract":"<p>Response to SyncPData</p>"},"Classes/SDLSystemCapability.html":{"name":"SDLSystemCapability","abstract":"<p>The systemCapabilityType indicates which type of data should be changed and identifies which data object exists in this struct. For example, if the SystemCapability Type is NAVIGATION then a &ldquo;navigationCapability&rdquo; should exist.</p>"},"Classes/SDLSystemCapabilityManager.html":{"name":"SDLSystemCapabilityManager","abstract":"<p>A manager that handles updating and subscribing to SDL capabilities.</p>"},"Classes/SDLSystemRequest.html":{"name":"SDLSystemRequest","abstract":"<p>An asynchronous request from the device; binary data can be included in hybrid part of message for some requests (such as HTTP, Proprietary, or Authentication requests)</p>"},"Classes.html#/c:objc(cs)SDLSystemRequestResponse":{"name":"SDLSystemRequestResponse","abstract":"<p>Response to SystemRequest</p>"},"Classes/SDLTTSChunk.html":{"name":"SDLTTSChunk","abstract":"<p>Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).</p>"},"Classes/SDLTemperature.html":{"name":"SDLTemperature","abstract":"<p>Struct representing a temperature.</p>"},"Classes/SDLTemplateColorScheme.html":{"name":"SDLTemplateColorScheme","abstract":"<p>A color scheme for all display layout templates.</p>"},"Classes/SDLTemplateConfiguration.html":{"name":"SDLTemplateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>"},"Classes/SDLTextField.html":{"name":"SDLTextField","abstract":"<p>Struct defining the characteristics of a displayed field on the HMI.</p>"},"Classes/SDLTireStatus.html":{"name":"SDLTireStatus","abstract":"<p>Struct used in Vehicle Data; the status and pressure of the tires.</p>"},"Classes/SDLTouch.html":{"name":"SDLTouch","abstract":"<p>Describes a touch location</p>"},"Classes/SDLTouchCoord.html":{"name":"SDLTouchCoord","abstract":"<p>The coordinate of a touch, used in a touch event</p>"},"Classes/SDLTouchEvent.html":{"name":"SDLTouchEvent","abstract":"<p>A touch which occurred on the IVI system during projection</p>"},"Classes/SDLTouchEventCapabilities.html":{"name":"SDLTouchEventCapabilities","abstract":"<p>The capabilities of touches during projection applications</p>"},"Classes/SDLTouchManager.html":{"name":"SDLTouchManager","abstract":"<p>Touch Manager responsible for processing touch event notifications.</p>"},"Classes/SDLTurn.html":{"name":"SDLTurn","abstract":"<p>A struct used in UpdateTurnList for Turn-by-Turn navigation applications</p>"},"Classes/SDLUnpublishAppService.html":{"name":"SDLUnpublishAppService","abstract":"<p>Unpublish an existing service published by this application.</p>"},"Classes.html#/c:objc(cs)SDLUnpublishAppServiceResponse":{"name":"SDLUnpublishAppServiceResponse","abstract":"<p>The response to UnpublishAppService</p>"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterface":{"name":"SDLUnregisterAppInterface","abstract":"<p>Terminates an application&rsquo;s interface registration. This causes SDL&reg; to"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterfaceResponse":{"name":"SDLUnregisterAppInterfaceResponse","abstract":"<p>Response to UnregisterAppInterface</p>"},"Classes/SDLUnsubscribeButton.html":{"name":"SDLUnsubscribeButton","abstract":"<p>Deletes a subscription to button notifications for the specified button. For"},"Classes.html#/c:objc(cs)SDLUnsubscribeButtonResponse":{"name":"SDLUnsubscribeButtonResponse","abstract":"<p>Response to UnsubscribeButton</p>"},"Classes/SDLUnsubscribeVehicleData.html":{"name":"SDLUnsubscribeVehicleData","abstract":"<p>This function is used to unsubscribe the notifications from the"},"Classes/SDLUnsubscribeVehicleDataResponse.html":{"name":"SDLUnsubscribeVehicleDataResponse","abstract":"<p>Response to UnsubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPoints":{"name":"SDLUnsubscribeWayPoints","abstract":"<p>Request to unsubscribe from navigation WayPoints and Destination</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPointsResponse":{"name":"SDLUnsubscribeWayPointsResponse","abstract":"<p>Response to UnsubscribeWayPoints</p>"},"Classes/SDLUpdateTurnList.html":{"name":"SDLUpdateTurnList","abstract":"<p>Updates the list of next maneuvers, which can be requested by the user pressing the softbutton<br></p>"},"Classes.html#/c:objc(cs)SDLUpdateTurnListResponse":{"name":"SDLUpdateTurnListResponse","abstract":"<p>Response to UpdateTurnList</p>"},"Classes/SDLVehicleDataResult.html":{"name":"SDLVehicleDataResult","abstract":"<p>Individual published data request result</p>"},"Classes/SDLVehicleType.html":{"name":"SDLVehicleType","abstract":"<p>Describes the type of vehicle the mobile phone is connected with.</p>"},"Classes/SDLVersion.html":{"name":"SDLVersion","abstract":"<p>Specifies a major / minor / patch version number for semantic versioning purposes and comparisons</p>"},"Classes/SDLVideoStreamingCapability.html":{"name":"SDLVideoStreamingCapability","abstract":"<p>Contains information about this system&rsquo;s video streaming capabilities</p>"},"Classes/SDLVideoStreamingFormat.html":{"name":"SDLVideoStreamingFormat","abstract":"<p>An available format for video streaming in projection applications</p>"},"Classes/SDLVoiceCommand.html":{"name":"SDLVoiceCommand","abstract":"<p>Voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>"},"Classes/SDLVRHelpItem.html":{"name":"SDLVRHelpItem","abstract":"<p>A help item for voice commands, used locally in interaction lists and globally</p>"},"Classes/SDLWeatherAlert.html":{"name":"SDLWeatherAlert","abstract":"<p>Contains information about a weather alert</p>"},"Classes/SDLWeatherData.html":{"name":"SDLWeatherData","abstract":"<p>Contains information about the current weather</p>"},"Classes/SDLWeatherServiceData.html":{"name":"SDLWeatherServiceData","abstract":"<p>This data is related to what a weather service would provide.</p>"},"Classes/SDLWeatherServiceManifest.html":{"name":"SDLWeatherServiceManifest","abstract":"<p>A weather service manifest.</p>"},"Classes/SDLWindowCapability.html":{"name":"SDLWindowCapability","abstract":"<p>Reflects content of DisplayCapabilities, ButtonCapabilities and SoftButtonCapabilities</p>"},"Classes/SDLWindowState.html":{"name":"SDLWindowState","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLWindowStatus.html":{"name":"SDLWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Classes/SDLWindowTypeCapabilities.html":{"name":"SDLWindowTypeCapabilities","abstract":"<p>Used to inform an app how many window instances per type that can be created.</p>"},"Categories/NSString%28SDLEnum%29.html#/c:objc(cs)NSString(im)isEqualToEnum:":{"name":"-isEqualToEnum:","abstract":"<p>Returns whether or not two enums are equal.</p>","parent_name":"NSString(SDLEnum)"},"Categories/NSString%28SDLEnum%29.html":{"name":"NSString(SDLEnum)","abstract":"<p>Extensions to NSString specifically for SDL string enums</p>"},"Categories.html":{"name":"Categories","abstract":"<p>The following categories are available globally.</p>"},"Classes.html":{"name":"Classes","abstract":"<p>The following classes are available globally.</p>"},"Constants.html":{"name":"Constants","abstract":"<p>The following constants are available globally.</p>"},"Enums.html":{"name":"Enumerations","abstract":"<p>The following enumerations are available globally.</p>"},"Protocols.html":{"name":"Protocols","abstract":"<p>The following protocols are available globally.</p>"},"Type%20Definitions.html":{"name":"Type Definitions","abstract":"<p>The following type definitions are available globally.</p>"}} \ No newline at end of file
+{"Type%20Definitions.html#/c:SDLAlertView.h@T@SDLAlertCanceledHandler":{"name":"SDLAlertCanceledHandler","abstract":"<p>Notifies the subscriber that the alert should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus":{"name":"SDLAmbientLightStatus","abstract":"<p>Reflects the status of the ambient light sensor for headlamps</p>"},"Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType":{"name":"SDLAppCapabilityType","abstract":"<p>Enumerations of all available app capability types</p>"},"Type%20Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType":{"name":"SDLAppHMIType","abstract":"<p>Enumeration listing possible app hmi types.</p>"},"Type%20Definitions.html#/c:SDLAppInterfaceUnregisteredReason.h@T@SDLAppInterfaceUnregisteredReason":{"name":"SDLAppInterfaceUnregisteredReason","abstract":"<p>Indicates reason why app interface was unregistered. The application is being disconnected by SDL.</p>"},"Type%20Definitions.html#/c:SDLAppServiceType.h@T@SDLAppServiceType":{"name":"SDLAppServiceType","abstract":"<p>Enumeration listing possible app service types.</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator":{"name":"SDLAudioStreamingIndicator","abstract":"<p>Enumeration listing possible indicators of audio streaming changes</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingState.h@T@SDLAudioStreamingState":{"name":"SDLAudioStreamingState","abstract":"<p>Describes whether or not streaming audio is currently audible to the user. Though provided in every OnHMIStatus notification, this information is only relevant for applications that declare themselves as media apps in RegisterAppInterface</p>"},"Type%20Definitions.html#/c:SDLAudioType.h@T@SDLAudioType":{"name":"SDLAudioType","abstract":"<p>Describes different audio type options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLBitsPerSample.h@T@SDLBitsPerSample":{"name":"SDLBitsPerSample","abstract":"<p>Describes different bit depth options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLButtonEventMode.h@T@SDLButtonEventMode":{"name":"SDLButtonEventMode","abstract":"<p>Indicates whether the button was depressed or released. A BUTTONUP event will always be preceded by a BUTTONDOWN event.</p>"},"Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName":{"name":"SDLButtonName","abstract":"<p>Defines logical buttons which, on a given SDL unit, would correspond to either physical or soft (touchscreen) buttons. These logical buttons present a standard functional abstraction which the developer can rely upon, independent of the SDL unit. For example, the developer can rely upon the OK button having the same meaning to the user across SDL platforms.</p>"},"Type%20Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode":{"name":"SDLButtonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press</p>"},"Type%20Definitions.html#/c:SDLCapacityUnit.h@T@SDLCapacityUnit":{"name":"SDLCapacityUnit","abstract":"<p>@since SDL 7.0.0</p>"},"Type%20Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus":{"name":"SDLCarModeStatus","abstract":"<p>Describes the carmode the vehicle is in. Used in ClusterModeStatus</p>"},"Type%20Definitions.html#/c:SDLCharacterSet.h@T@SDLCharacterSet":{"name":"SDLCharacterSet","abstract":"<p>The list of potential character sets</p>"},"Type%20Definitions.html#/c:SDLChoiceSet.h@T@SDLChoiceSetCanceledHandler":{"name":"SDLChoiceSetCanceledHandler","abstract":"<p>Notifies the subscriber that the choice set should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLCompassDirection.h@T@SDLCompassDirection":{"name":"SDLCompassDirection","abstract":"<p>The list of potential compass directions. Used in GPS data</p>"},"Type%20Definitions.html#/c:SDLComponentVolumeStatus.h@T@SDLComponentVolumeStatus":{"name":"SDLComponentVolumeStatus","abstract":"<p>The volume status of a vehicle component. Used in SingleTireStatus and VehicleData Fuel Level</p>"},"Type%20Definitions.html#/c:SDLDefrostZone.h@T@SDLDefrostZone":{"name":"SDLDefrostZone","abstract":"<p>Enumeration listing possible defrost zones. Used in ClimateControlCapabilities and Data.</p>"},"Type%20Definitions.html#/c:SDLDeliveryMode.h@T@SDLDeliveryMode":{"name":"SDLDeliveryMode","abstract":"<p>Specifies the mode in which the sendLocation request is sent. Used in SendLocation.</p>"},"Type%20Definitions.html#/c:SDLDeviceLevelStatus.h@T@SDLDeviceLevelStatus":{"name":"SDLDeviceLevelStatus","abstract":"<p>Reflects the reported battery status of the connected device, if reported. Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLDimension.h@T@SDLDimension":{"name":"SDLDimension","abstract":"<p>The supported dimensions of the GPS. Used in GPSData</p>"},"Type%20Definitions.html#/c:SDLDirection.h@T@SDLDirection":{"name":"SDLDirection","abstract":"<p>A navigation direction.</p>"},"Type%20Definitions.html#/c:SDLDisplayMode.h@T@SDLDisplayMode":{"name":"SDLDisplayMode","abstract":"<p>Identifies the various display types used by SDL.</p>"},"Type%20Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType":{"name":"SDLDisplayType","abstract":"<p>Identifies the various display types used by SDL. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit":{"name":"SDLDistanceUnit","abstract":"<p>Wiper Status</p>"},"Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType":{"name":"SDLDoorStatusType","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Type%20Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState":{"name":"SDLDriverDistractionState","abstract":"<p>Enumeration that describes possible states of driver distraction. Used in OnDriverDistraction.</p>"},"Type%20Definitions.html#/c:SDLECallConfirmationStatus.h@T@SDLECallConfirmationStatus":{"name":"SDLECallConfirmationStatus","abstract":"<p>Reflects the status of the eCall Notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus":{"name":"SDLElectronicParkBrakeStatus","abstract":"<p>Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.</p>"},"Type%20Definitions.html#/c:SDLEmergencyEventType.h@T@SDLEmergencyEventType":{"name":"SDLEmergencyEventType","abstract":"<p>Reflects the emergency event status of the vehicle. Used in EmergencyEvent</p>"},"Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum":{"name":"SDLEnum","abstract":"<p>NSString SDLEnum typedef</p>"},"Type%20Definitions.html#/c:SDLErrorConstants.h@T@SDLErrorDomain":{"name":"SDLErrorDomain","abstract":"<p>A typedef declaration of the SDL error domain</p>"},"Type%20Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler":{"name":"SDLFileManagerStartupCompletionHandler","abstract":"<p>The handler that is called when the manager is set up or failed to set up with an error."},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileName":{"name":"SDLFileName","abstract":"<p>Typedef SDLFileName</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler":{"name":"SDLFileManagerUploadCompletionHandler","abstract":"<p>A completion handler called after a response from Core to an upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler":{"name":"SDLFileManagerMultiUploadCompletionHandler","abstract":"<p>A completion handler called after a set of upload requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler":{"name":"SDLFileManagerMultiUploadProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to a upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler":{"name":"SDLFileManagerDeleteCompletionHandler","abstract":"<p>A completion handler called after a response from Core to a delete request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler":{"name":"SDLFileManagerMultiDeleteCompletionHandler","abstract":"<p>A completion handler called after a set of delete requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler":{"name":"SDLFileManagerListFilesCompletionHandler","abstract":"<p>A completion handler called after response from Core to a list files request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler":{"name":"SDLFileManagerUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler":{"name":"SDLFileManagerMultiUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a set of upload artwork requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler":{"name":"SDLFileManagerMultiUploadArtworkProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileType.h@T@SDLFileType":{"name":"SDLFileType","abstract":"<p>Enumeration listing possible file types. Used in SDLFile, PutFile, ImageField, OnSystemRequest</p>"},"Type%20Definitions.html#/c:SDLFuelCutoffStatus.h@T@SDLFuelCutoffStatus":{"name":"SDLFuelCutoffStatus","abstract":"<p>Reflects the status of the Restraints Control Module fuel pump cutoff. The fuel pump is cut off typically after the vehicle has had a collision. Used in EmergencyEvent.</p>"},"Type%20Definitions.html#/c:SDLFuelType.h@T@SDLFuelType":{"name":"SDLFuelType","abstract":"<p>Enumeration listing possible fuel types.</p>"},"Type%20Definitions.html#/c:SDLGlobalProperty.h@T@SDLGlobalProperty":{"name":"SDLGlobalProperty","abstract":"<p>Properties of a user-initiated VR interaction (i.e. interactions started by the user pressing the PTT button). Used in RPCs related to ResetGlobalProperties</p>"},"Type%20Definitions.html#/c:SDLHMILevel.h@T@SDLHMILevel":{"name":"SDLHMILevel","abstract":"<p>Specifies current level of the HMI. An HMI level indicates the degree of user interaction possible through the HMI (e.g. TTS only, display only, VR, etc.). The HMI level varies for an application based on the type of display (i.e. Nav or non-Nav) and the user directing &ldquo;focus&rdquo; to other applications (e.g. phone, other mobile applications, etc.). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLHMIZoneCapabilities.h@T@SDLHMIZoneCapabilities":{"name":"SDLHMIZoneCapabilities","abstract":"<p>Specifies HMI Zones in the vehicle. Used in RegisterAppInterfaceResponse</p>"},"Type%20Definitions.html#/c:SDLHybridAppPreference.h@T@SDLHybridAppPreference":{"name":"SDLHybridAppPreference","abstract":"<p>Enumeration for the user&rsquo;s preference of which app type to use when both are available.</p>"},"Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus":{"name":"SDLIgnitionStableStatus","abstract":"<p>Reflects the ignition switch stability. Used in BodyInformation</p>"},"Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus":{"name":"SDLIgnitionStatus","abstract":"<p>Reflects the status of ignition. Used in BodyInformation.</p>"},"Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName":{"name":"SDLImageFieldName","abstract":"<p>The name that identifies the field. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLImageType.h@T@SDLImageType":{"name":"SDLImageType","abstract":"<p>Contains information about the type of image. Used in Image.</p>"},"Type%20Definitions.html#/c:SDLInteractionMode.h@T@SDLInteractionMode":{"name":"SDLInteractionMode","abstract":"<p>For application-initiated interactions (SDLPerformInteraction), this specifies the mode by which the user is prompted and by which the user&rsquo;s selection is indicated. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutocompleteCompletionHandler":{"name":"SDLKeyboardAutocompleteCompletionHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutoCompleteResultsHandler":{"name":"SDLKeyboardAutoCompleteResultsHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler":{"name":"SDLKeyboardCharacterSetCompletionHandler","abstract":"<p>This handler is called when you wish to update your keyboard&rsquo;s limitedCharacterSet in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent":{"name":"SDLKeyboardEvent","abstract":"<p>Enumeration listing possible keyboard events. Used in OnKeyboardInput.</p>"},"Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask":{"name":"SDLKeyboardInputMask","abstract":"<p>Enumeration listing possible input character masking.</p>"},"Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout":{"name":"SDLKeyboardLayout","abstract":"<p>Enumeration listing possible keyboard layouts. Used in KeyboardProperties.</p>"},"Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode":{"name":"SDLKeypressMode","abstract":"<p>Enumeration listing possible keyboard events.</p>"},"Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage":{"name":"SDLLanguage","abstract":"<p>Specifies the language to be used for TTS, VR, displayed messages/menus. Used in ChangeRegistration and RegisterAppInterface.</p>"},"Type%20Definitions.html#/c:SDLLayoutMode.h@T@SDLLayoutMode":{"name":"SDLLayoutMode","abstract":"<p>For touchscreen interactions, the mode of how the choices are presented. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLLightName.h@T@SDLLightName":{"name":"SDLLightName","abstract":"<p>The name that identifies the Light</p>"},"Type%20Definitions.html#/c:SDLLightStatus.h@T@SDLLightStatus":{"name":"SDLLightStatus","abstract":"<p>Reflects the status of Light.</p>"},"Type%20Definitions.html#/c:SDLLockScreenViewController.h@T@SwipeGestureCallbackBlock":{"name":"SwipeGestureCallbackBlock","abstract":"<p>A block that can be used to close the lockscreen when the user swipes on the lockscreen. Override this in your own custom view controllers if you build a custom lock screen.</p>"},"Type%20Definitions.html#/c:SDLLogConstants.h@T@SDLLogFilterBlock":{"name":"SDLLogFilterBlock","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>"},"Type%20Definitions.html#/c:SDLMaintenanceModeStatus.h@T@SDLMaintenanceModeStatus":{"name":"SDLMaintenanceModeStatus","abstract":"<p>Describes the maintenance mode. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock":{"name":"SDLManagerReadyBlock","abstract":"<p>The block called when the manager is ready to be used or an error occurs while attempting to become ready.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock":{"name":"SDLRPCUpdatedBlock","abstract":"<p>The block that will be called every time an RPC is received when subscribed to an RPC.</p>"},"Type%20Definitions.html#/c:SDLMassageCushion.h@T@SDLMassageCushion":{"name":"SDLMassageCushion","abstract":"<p>The List possible cushions of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMassageMode.h@T@SDLMassageMode":{"name":"SDLMassageMode","abstract":"<p>The List possible modes of a massage zone.</p>"},"Type%20Definitions.html#/c:SDLMassageZone.h@T@SDLMassageZone":{"name":"SDLMassageZone","abstract":"<p>List possible zones of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMediaClockFormat.h@T@SDLMediaClockFormat":{"name":"SDLMediaClockFormat","abstract":"<p>Indicates the format of the time displayed on the connected SDL unit.</p>"},"Type%20Definitions.html#/c:SDLMediaType.h@T@SDLMediaType":{"name":"SDLMediaType","abstract":"<p>Enumeration listing possible media types.</p>"},"Type%20Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler":{"name":"SDLMenuCellSelectionHandler","abstract":"<p>The handler to run when a menu item is selected.</p>"},"Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout":{"name":"SDLMenuLayout","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLMetadataType.h@T@SDLMetadataType":{"name":"SDLMetadataType","abstract":"<p>Text Field metadata types. Used in Show.</p>"},"Type%20Definitions.html#/c:SDLModuleType.h@T@SDLModuleType":{"name":"SDLModuleType","abstract":"<p>The type of remote control data. Used in ButtonPress, GetInteriorVehicleData, and ModuleData</p>"},"Type%20Definitions.html#/c:SDLNavigationAction.h@T@SDLNavigationAction":{"name":"SDLNavigationAction","abstract":"<p>A navigation action.</p>"},"Type%20Definitions.html#/c:SDLNavigationJunction.h@T@SDLNavigationJunction":{"name":"SDLNavigationJunction","abstract":"<p>A navigation junction type.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName":{"name":"SDLNotificationName","abstract":"<p>NSNotification names specific to incoming SDL RPC</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey":{"name":"SDLNotificationUserInfoKey","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userInfo dictionary.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLAudioPassThruHandler":{"name":"SDLAudioPassThruHandler","abstract":"<p>A handler used on SDLPerformAudioPassThru.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler":{"name":"SDLResponseHandler","abstract":"<p>A handler used on all RPC requests which fires when the response is received.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler":{"name":"SDLMultipleRequestCompletionHandler","abstract":"<p>A completion handler called after a sequential or simultaneous set of requests have completed sending.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler":{"name":"SDLMultipleSequentialRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler":{"name":"SDLMultipleAsyncRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCButtonNotificationHandler":{"name":"SDLRPCButtonNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLSubscribeButton or SDLSoftButton has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler":{"name":"SDLRPCCommandNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLAddCommand has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLPRNDL.h@T@SDLPRNDL":{"name":"SDLPRNDL","abstract":"<p>The selected gear the car is in. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName":{"name":"SDLPermissionRPCName","abstract":"<p>NSString typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier":{"name":"SDLPermissionObserverIdentifier","abstract":"<p>NSUUID typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler":{"name":"SDLPermissionsChangedHandler","abstract":"<p>This is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler":{"name":"SDLRPCPermissionStatusChangedHandler","abstract":"<p>A block that will be called when specified permissions change. It will return whether each RPC and its parameters are allowed as well as the permission group status of all the RPCs.</p>"},"Type%20Definitions.html#/c:SDLPermissionStatus.h@T@SDLPermissionStatus":{"name":"SDLPermissionStatus","abstract":"<p>Enumeration that describes possible permission states of a policy table entry. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLPowerModeQualificationStatus.h@T@SDLPowerModeQualificationStatus":{"name":"SDLPowerModeQualificationStatus","abstract":"<p>Describes the power mode qualification status. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPowerModeStatus.h@T@SDLPowerModeStatus":{"name":"SDLPowerModeStatus","abstract":"<p>The status of the car&rsquo;s power. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPredefinedLayout.h@T@SDLPredefinedLayout":{"name":"SDLPredefinedLayout","abstract":"<p>A template layout an app uses to display information. The broad details of the layout are defined, but the details depend on the IVI system. Used in SetDisplayLayout.</p>"},"Type%20Definitions.html#/c:SDLPrerecordedSpeech.h@T@SDLPrerecordedSpeech":{"name":"SDLPrerecordedSpeech","abstract":"<p>Contains information about the speech capabilities on the SDL platform. Used in RegisterAppInterfaceResponse to indicate capability.</p>"},"Type%20Definitions.html#/c:SDLPrimaryAudioSource.h@T@SDLPrimaryAudioSource":{"name":"SDLPrimaryAudioSource","abstract":"<p>Reflects the current primary audio source of SDL (if selected). Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName":{"name":"SDLRPCFunctionName","abstract":"<p>All RPC request / response / notification names</p>"},"Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName":{"name":"SDLRPCMessageTypeName","abstract":"<p>A type of RPC message</p>"},"Type%20Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand":{"name":"SDLRadioBand","abstract":"<p>Radio bands, such as AM and FM, used in RadioControlData</p>"},"Type%20Definitions.html#/c:SDLRadioState.h@T@SDLRadioState":{"name":"SDLRadioState","abstract":"<p>List possible states of a remote control radio module. Used in RadioControlData.</p>"},"Type%20Definitions.html#/c:SDLRequestType.h@T@SDLRequestType":{"name":"SDLRequestType","abstract":"<p>A type of system request. Used in SystemRequest.</p>"},"Type%20Definitions.html#/c:SDLResult.h@T@SDLResult":{"name":"SDLResult","abstract":"<p>Defines the possible result codes returned by SDL to the application in a response to a requested operation. Used in RPC responses</p>"},"Type%20Definitions.html#/c:SDLSamplingRate.h@T@SDLSamplingRate":{"name":"SDLSamplingRate","abstract":"<p>Describes different sampling rates for PerformAudioPassThru and AudioPassThruCapabilities</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler":{"name":"SDLScreenManagerUpdateCompletionHandler","abstract":"<p>The handler run when the update has completed</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler":{"name":"SDLPreloadChoiceCompletionHandler","abstract":"<p>Return an error with userinfo [key: SDLChoiceCell, value: NSError] if choices failed to upload</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler":{"name":"SDLSubscribeButtonHandler","abstract":"<p>A handler run when the subscribe button has been selected</p>"},"Type%20Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType":{"name":"SDLSeatMemoryActionType","abstract":"<p>List of possible actions on Seat Meomry</p>"},"Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType":{"name":"SDLSeekIndicatorType","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Type%20Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason":{"name":"SDLServiceUpdateReason","abstract":"<p>Enumeration listing possible service update reasons.</p>"},"Type%20Definitions.html#/c:SDLSoftButtonType.h@T@SDLSoftButtonType":{"name":"SDLSoftButtonType","abstract":"<p>SoftButtonType (TEXT / IMAGE / BOTH). Used by SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities":{"name":"SDLSpeechCapabilities","abstract":"<p>Contains information about TTS capabilities on the SDL platform. Used in RegisterAppInterfaceResponse, and TTSChunk.</p>"},"Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName":{"name":"SDLStaticIconName","abstract":"<p>Static icon names</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLVideoStreamManagerState":{"name":"SDLVideoStreamManagerState","abstract":"<p>The current state of the video stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAudioStreamManagerState":{"name":"SDLAudioStreamManagerState","abstract":"<p>The current state of the audio stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAppState":{"name":"SDLAppState","abstract":"<p>Typedef SDLAppState</p>"},"Type%20Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat":{"name":"SDLSupportedSeat","abstract":"<p>List possible seats that is a remote controllable seat.</p>"},"Type%20Definitions.html#/c:SDLSystemAction.h@T@SDLSystemAction":{"name":"SDLSystemAction","abstract":"<p>Enumeration that describes system actions that can be triggered. Used in SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler":{"name":"SDLUpdateCapabilityHandler","abstract":"<p>A completion handler called after a request for the capability type is returned from the remote system.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateHandler":{"name":"SDLCapabilityUpdateHandler","abstract":"<p>An observer block for whenever a subscription is called.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateWithErrorHandler":{"name":"SDLCapabilityUpdateWithErrorHandler","abstract":"<p>An observer block for whenever a subscription or value is retrieved.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType":{"name":"SDLSystemCapabilityType","abstract":"<p>The type of system capability to get more information on. Used in GetSystemCapability.</p>"},"Type%20Definitions.html#/c:SDLSystemContext.h@T@SDLSystemContext":{"name":"SDLSystemContext","abstract":"<p>Indicates whether or not a user-initiated interaction is in progress, and if so, in what mode (i.e. MENU or VR). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLTBTState.h@T@SDLTBTState":{"name":"SDLTBTState","abstract":"<p>The turn-by-turn state, used in OnTBTClientState.</p>"},"Type%20Definitions.html#/c:SDLTPMS.h@T@SDLTPMS":{"name":"SDLTPMS","abstract":"<p>An enum representing values of the tire pressure monitoring system</p>"},"Type%20Definitions.html#/c:SDLTemperatureUnit.h@T@SDLTemperatureUnit":{"name":"SDLTemperatureUnit","abstract":"<p>The unit of temperature to display. Used in Temperature.</p>"},"Type%20Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment":{"name":"SDLTextAlignment","abstract":"<p>The list of possible alignments of text in a field. May only work on some display types. used in Show.</p>"},"Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName":{"name":"SDLTextFieldName","abstract":"<p>Names of the text fields that can appear on a SDL display. Used in TextFieldName.</p>"},"Type%20Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode":{"name":"SDLTimerMode","abstract":"<p>The direction of a timer. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler":{"name":"SDLTouchEventHandler","abstract":"<p>Handler for touch events</p>"},"Type%20Definitions.html#/c:SDLTouchType.h@T@SDLTouchType":{"name":"SDLTouchType","abstract":"<p>The type of a touch in a projection application. Used in OnTouchEvent.</p>"},"Type%20Definitions.html#/c:SDLTransmissionType.h@T@SDLTransmissionType":{"name":"SDLTransmissionType","abstract":"<p>Type of transmission used in the vehicle.</p>"},"Type%20Definitions.html#/c:SDLTriggerSource.h@T@SDLTriggerSource":{"name":"SDLTriggerSource","abstract":"<p>Indicates whether choice/command was selected via VR or via a menu selection (using SEEKRIGHT/SEEKLEFT, TUNEUP, TUNEDOWN, OK buttons). Used in PerformInteractionResponse and OnCommand.</p>"},"Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal":{"name":"SDLTurnSignal","abstract":"<p>Enumeration that describes the status of the turn light indicator.</p>"},"Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode":{"name":"SDLUpdateMode","abstract":"<p>Specifies what function should be performed on the media clock/counter. Used in SetMediaClockTimer.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataActiveStatus.h@T@SDLVehicleDataActiveStatus":{"name":"SDLVehicleDataActiveStatus","abstract":"<p>Vehicle Data Activity Status. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus":{"name":"SDLVehicleDataEventStatus","abstract":"<p>Reflects the status of a vehicle data event; e.g. a seat belt event status. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataNotificationStatus.h@T@SDLVehicleDataNotificationStatus":{"name":"SDLVehicleDataNotificationStatus","abstract":"<p>Reflects the status of a vehicle data notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLVehicleDataResultCode.h@T@SDLVehicleDataResultCode":{"name":"SDLVehicleDataResultCode","abstract":"<p>Vehicle Data Result Code. Used in DIDResult.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataStatus.h@T@SDLVehicleDataStatus":{"name":"SDLVehicleDataStatus","abstract":"<p>Reflects the status of a binary vehicle data item. Used in MyKey.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType":{"name":"SDLVehicleDataType","abstract":"<p>Defines the vehicle data types that can be published and/or subscribed to using SDLSubscribeVehicleData. Used in VehicleDataResult</p>"},"Type%20Definitions.html#/c:SDLVentilationMode.h@T@SDLVentilationMode":{"name":"SDLVentilationMode","abstract":"<p>The ventilation mode. Used in ClimateControlCapabilities</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingCodec.h@T@SDLVideoStreamingCodec":{"name":"SDLVideoStreamingCodec","abstract":"<p>Enum for each type of video streaming codec. Used in VideoStreamingFormat.</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingProtocol.h@T@SDLVideoStreamingProtocol":{"name":"SDLVideoStreamingProtocol","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingState.h@T@SDLVideoStreamingState":{"name":"SDLVideoStreamingState","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVoiceCommand.h@T@SDLVoiceCommandSelectionHandler":{"name":"SDLVoiceCommandSelectionHandler","abstract":"<p>The handler that will be called when the command is activated</p>"},"Type%20Definitions.html#/c:SDLVrCapabilities.h@T@SDLVRCapabilities":{"name":"SDLVRCapabilities","abstract":"<p>The VR capabilities of the connected SDL platform. Used in RegisterAppInterfaceResponse.</p>"},"Type%20Definitions.html#/c:SDLWarningLightStatus.h@T@SDLWarningLightStatus":{"name":"SDLWarningLightStatus","abstract":"<p>Reflects the status of a cluster instrument warning light. Used in TireStatus</p>"},"Type%20Definitions.html#/c:SDLWayPointType.h@T@SDLWayPointType":{"name":"SDLWayPointType","abstract":"<p>The type of a navigation waypoint. Used in GetWayPoints.</p>"},"Type%20Definitions.html#/c:SDLWindowType.h@T@SDLWindowType":{"name":"SDLWindowType","abstract":"<p>The type of the window to be created. Main window or widget.</p>"},"Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus":{"name":"SDLWiperStatus","abstract":"<p>The status of the windshield wipers. Used in retrieving vehicle data.</p>"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveSingleTapForView:atPoint:":{"name":"-touchManager:didReceiveSingleTapForView:atPoint:","abstract":"<p>A single tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveDoubleTapForView:atPoint:":{"name":"-touchManager:didReceiveDoubleTapForView:atPoint:","abstract":"<p>A double tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidStartInView:atPoint:":{"name":"-touchManager:panningDidStartInView:atPoint:","abstract":"<p>Panning started</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePanningFromPoint:toPoint:":{"name":"-touchManager:didReceivePanningFromPoint:toPoint:","abstract":"<p>Panning moved between points</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidEndInView:atPoint:":{"name":"-touchManager:panningDidEndInView:atPoint:","abstract":"<p>Panning ended</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningCanceledAtPoint:":{"name":"-touchManager:panningCanceledAtPoint:","abstract":"<p>Panning canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidStartInView:atCenterPoint:":{"name":"-touchManager:pinchDidStartInView:atCenterPoint:","abstract":"<p>Pinch did start</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchAtCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchAtCenterPoint:withScale:","abstract":"<p>@abstract","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchInView:atCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchInView:atCenterPoint:withScale:","abstract":"<p>Pinch moved and changed scale</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidEndInView:atCenterPoint:":{"name":"-touchManager:pinchDidEndInView:atCenterPoint:","abstract":"<p>Pinch did end</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchCanceledAtCenterPoint:":{"name":"-touchManager:pinchCanceledAtCenterPoint:","abstract":"<p>Pinch canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLStreamingVideoDelegate.html#/c:objc(pl)SDLStreamingVideoDelegate(im)videoStreamingSizeDidUpdate:":{"name":"-videoStreamingSizeDidUpdate:","abstract":"<p>Undocumented</p>","parent_name":"SDLStreamingVideoDelegate"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)preferredVideoFormatOrderFromHeadUnitPreferredOrder:":{"name":"-preferredVideoFormatOrderFromHeadUnitPreferredOrder:","abstract":"<p>Implement to return a different preferred order of attempted format usage than the head unit&rsquo;s preferred order. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing).</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)resolutionFromHeadUnitPreferredResolution:":{"name":"-resolutionFromHeadUnitPreferredResolution:","abstract":"<p>Implement to return a different resolution to use for video streaming than the head unit&rsquo;s requested resolution. If you return a resolution that the head unit does not like, the manager will fail to start up. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing), and adapt your UI to the head unit&rsquo;s preferred resolution instead.</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio byte stream is currently connected</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>Send audio data bytes over the audio byte stream</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLServiceEncryptionDelegate.html#/c:objc(pl)SDLServiceEncryptionDelegate(im)serviceEncryptionUpdatedOnService:encrypted:error:":{"name":"-serviceEncryptionUpdatedOnService:encrypted:error:","abstract":"<p>Called when the encryption service has been.</p>","parent_name":"SDLServiceEncryptionDelegate"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(py)appId":{"name":"appId","abstract":"<p>The app id of the app</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)initializeWithAppId:completionHandler:":{"name":"-initializeWithAppId:completionHandler:","abstract":"<p>Initialize the SDL security library with the app&rsquo;s id and a completion handler</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)stop":{"name":"-stop","abstract":"<p>Stop the security library</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)runHandshakeWithClientData:error:":{"name":"-runHandshakeWithClientData:error:","abstract":"<p>Run the SSL/TLS handshake</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)encryptData:withError:":{"name":"-encryptData:withError:","abstract":"<p>Encrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)decryptData:withError:":{"name":"-decryptData:withError:","abstract":"<p>Decrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(cm)availableMakes":{"name":"+availableMakes","abstract":"<p>The vehicle makes this security library covers</p>","parent_name":"SDLSecurityType"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerDidDisconnect":{"name":"-managerDidDisconnect","abstract":"<p>Called upon a disconnection from the remote system.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)hmiLevel:didChangeToLevel:":{"name":"-hmiLevel:didChangeToLevel:","abstract":"<p>Called when the HMI level state of this application changes on the remote system. This is equivalent to the application&rsquo;s state changes in iOS such as foreground, background, or closed.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)audioStreamingState:didChangeToState:":{"name":"-audioStreamingState:didChangeToState:","abstract":"<p>Called when the audio streaming state of this application changes on the remote system. This refers to when streaming audio is audible to the user.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)videoStreamingState:didChangetoState:":{"name":"-videoStreamingState:didChangetoState:","abstract":"<p>Called when the video streaming state of this application changes. This refers to streaming video for navigation purposes. If you are &ldquo;autostreaming&rdquo; via CarWindow, you should not do anything with this method. Everything should be handled for you automatically.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)systemContext:didChangeToContext:":{"name":"-systemContext:didChangeToContext:","abstract":"<p>Called when the system context of this application changes on the remote system. This refers to whether or not a user-initiated interaction is in progress, and if so, what it is.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerShouldUpdateLifecycleToLanguage:hmiLanguage:":{"name":"-managerShouldUpdateLifecycleToLanguage:hmiLanguage:","abstract":"<p>Called when the lifecycle manager detected a language mismatch. In case of a language mismatch the manager should change the apps registration by updating the lifecycle configuration to the specified language. If the app can support the specified language it should return an Object of SDLLifecycleConfigurationUpdate, otherwise it should return nil to indicate that the language is not supported.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)didReceiveSystemInfo:":{"name":"-didReceiveSystemInfo:","abstract":"<p>A way to determine if this SDL session should continue to be active while connected to the determined system information of the vehicle.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(cm)logger":{"name":"+logger","abstract":"<p>A simple convenience initializer to create the object. This <em>should not</em> start up the logger.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)setupLogger":{"name":"-setupLogger","abstract":"<p>A call to setup the logger in whatever manner it needs to do so.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)logWithLog:formattedLog:":{"name":"-logWithLog:formattedLog:","abstract":"<p>Log a particular log using the model and the formatted log message to the target.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)teardownLogger":{"name":"-teardownLogger","abstract":"<p>The log target should be torn down. e.g. file handles should be closed</p>","parent_name":"SDLLogTarget"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)userDidSubmitInput:withEvent:":{"name":"-userDidSubmitInput:withEvent:","abstract":"<p>The keyboard session completed with some input.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidAbortWithReason:":{"name":"-keyboardDidAbortWithReason:","abstract":"<p>The keyboard session aborted.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)customKeyboardConfiguration":{"name":"-customKeyboardConfiguration","abstract":"<p>Implement this in order to provide a custom keyboard configuration to just this keyboard. To apply default settings to all keyboards, see SDLScreenManager.keyboardConfiguration</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateAutocompleteWithInput:autoCompleteResultsHandler:":{"name":"-updateAutocompleteWithInput:autoCompleteResultsHandler:","abstract":"<p>Implement this if you wish to updated the KeyboardProperties.autoCompleteList as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateCharacterSetWithInput:completionHandler:":{"name":"-updateCharacterSetWithInput:completionHandler:","abstract":"<p>Implement this if you wish to update the limitedCharacterSet as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidSendEvent:text:":{"name":"-keyboardDidSendEvent:text:","abstract":"<p>Implement this to be notified of all events occurring on the keyboard</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidUpdateInputMask:":{"name":"-keyboardDidUpdateInputMask:","abstract":"<p>Implement this to be notified of input key mask update (whether or not the user has changed the input to be hidden, like passwords)</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didSelectChoice:withSource:atRowIndex:":{"name":"-choiceSet:didSelectChoice:withSource:atRowIndex:","abstract":"<p>Delegate method called after a choice set item is selected</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didReceiveError:":{"name":"-choiceSet:didReceiveError:","abstract":"<p>Delegate method called on an error</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:fileDidFinishPlaying:successfully:":{"name":"-audioStreamManager:fileDidFinishPlaying:successfully:","abstract":"<p>Called when a file from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForFile:error:":{"name":"-audioStreamManager:errorDidOccurForFile:error:","abstract":"<p>Called when a file from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:dataBufferDidFinishPlayingSuccessfully:":{"name":"-audioStreamManager:dataBufferDidFinishPlayingSuccessfully:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForDataBuffer:":{"name":"-audioStreamManager:errorDidOccurForDataBuffer:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols.html#/c:objc(pl)SDLInt":{"name":"SDLInt","abstract":"<p>A declaration that this NSNumber contains an NSInteger.</p>"},"Protocols.html#/c:objc(pl)SDLUInt":{"name":"SDLUInt","abstract":"<p>A declaration that this NSNumber contains an NSUInteger.</p>"},"Protocols.html#/c:objc(pl)SDLBool":{"name":"SDLBool","abstract":"<p>A declaration that this NSNumber contains a BOOL.</p>"},"Protocols.html#/c:objc(pl)SDLFloat":{"name":"SDLFloat","abstract":"<p>A declaration that this NSNumber contains a float.</p>"},"Protocols/SDLAudioStreamManagerDelegate.html":{"name":"SDLAudioStreamManagerDelegate","abstract":"<p>Delegate for the AudioStreamManager</p>"},"Protocols/SDLChoiceSetDelegate.html":{"name":"SDLChoiceSetDelegate","abstract":"<p>Delegate for the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>"},"Protocols/SDLKeyboardDelegate.html":{"name":"SDLKeyboardDelegate","abstract":"<p>They delegate of a keyboard popup allowing customization at runtime of the keyboard.</p>"},"Protocols/SDLLogTarget.html":{"name":"SDLLogTarget","abstract":"<p>A protocol describing a place logs from SDLLogManager are logged to</p>"},"Protocols/SDLManagerDelegate.html":{"name":"SDLManagerDelegate","abstract":"<p>The manager&rsquo;s delegate</p>"},"Protocols/SDLSecurityType.html":{"name":"SDLSecurityType","abstract":"<p>A protocol used by SDL Security libraries.</p>"},"Protocols/SDLServiceEncryptionDelegate.html":{"name":"SDLServiceEncryptionDelegate","abstract":"<p>Delegate for the encryption service.</p>"},"Protocols/SDLStreamingAudioManagerType.html":{"name":"SDLStreamingAudioManagerType","abstract":"<p>Streaming audio manager</p>"},"Protocols/SDLStreamingMediaManagerDataSource.html":{"name":"SDLStreamingMediaManagerDataSource","abstract":"<p>A data source for the streaming manager&rsquo;s preferred resolutions and preferred formats.</p>"},"Protocols/SDLStreamingVideoDelegate.html":{"name":"SDLStreamingVideoDelegate","abstract":"<p>Undocumented</p>"},"Protocols/SDLTouchManagerDelegate.html":{"name":"SDLTouchManagerDelegate","abstract":"<p>The delegate to be notified of processed touches such as pinches, pans, and taps</p>"},"Enums/SDLTouchIdentifier.html#/c:@E@SDLTouchIdentifier@SDLTouchIdentifierFirstFinger":{"name":"SDLTouchIdentifierFirstFinger","abstract":"<p>Touch was first finger</p>","parent_name":"SDLTouchIdentifier"},"Enums/SDLTouchIdentifier.html#/c:@E@SDLTouchIdentifier@SDLTouchIdentifierSecondFinger":{"name":"SDLTouchIdentifierSecondFinger","abstract":"<p>Touch was second finger</p>","parent_name":"SDLTouchIdentifier"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagNone":{"name":"SDLStreamingEncryptionFlagNone","abstract":"<p>It should not be encrypted at all</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateOnly":{"name":"SDLStreamingEncryptionFlagAuthenticateOnly","abstract":"<p>It should use SSL/TLS only to authenticate</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateAndEncrypt":{"name":"SDLStreamingEncryptionFlagAuthenticateAndEncrypt","abstract":"<p>All data on these services should be encrypted using SSL/TLS</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeLayer":{"name":"SDLCarWindowRenderingTypeLayer","abstract":"<p>Instead of rendering your UIViewController&rsquo;s view, this will render the layer using renderInContext</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewAfterScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewAfterScreenUpdates","abstract":"<p>Renders your UIViewController&rsquo;s view using drawViewHierarchyInRect:bounds afterScreenUpdates:YES</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewBeforeScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewBeforeScreenUpdates","abstract":"<p>Renders your UIViewController&rsquo;s view using drawViewHierarchyInRect:bounds afterScreenUpdates:NO</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeRequest":{"name":"SDLRPCMessageTypeRequest","abstract":"<p>A request that will require a response</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeResponse":{"name":"SDLRPCMessageTypeResponse","abstract":"<p>A response to a request</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeNotification":{"name":"SDLRPCMessageTypeNotification","abstract":"<p>A message that does not have a response</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoHeartbeat":{"name":"SDLFrameInfoHeartbeat","abstract":"<p>A ping packet that is sent to ensure the connection is still active and the service is still valid.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartService":{"name":"SDLFrameInfoStartService","abstract":"<p>Requests that a specific type of service is started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartServiceACK":{"name":"SDLFrameInfoStartServiceACK","abstract":"<p>Acknowledges that the specific service has been started successfully.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartServiceNACK":{"name":"SDLFrameInfoStartServiceNACK","abstract":"<p>Negatively acknowledges that the specific service was not started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndService":{"name":"SDLFrameInfoEndService","abstract":"<p>Requests that a specific type of service is ended.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndServiceACK":{"name":"SDLFrameInfoEndServiceACK","abstract":"<p>Acknowledges that the specific service has been ended successfully.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndServiceNACK":{"name":"SDLFrameInfoEndServiceNACK","abstract":"<p>Negatively acknowledges that the specific service was not ended or has not yet been started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransport":{"name":"SDLFrameInfoRegisterSecondaryTransport","abstract":"<p>Notifies that a Secondary Transport has been established.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransportACK":{"name":"SDLFrameInfoRegisterSecondaryTransportACK","abstract":"<p>Acknowledges that the Secondary Transport has been recognized.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransportNACK":{"name":"SDLFrameInfoRegisterSecondaryTransportNACK","abstract":"<p>Negatively acknowledges that the Secondary Transport has not been recognized.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoTransportEventUpdate":{"name":"SDLFrameInfoTransportEventUpdate","abstract":"<p>Indicates the status or configuration of transport(s) is/are updated.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoServiceDataAck":{"name":"SDLFrameInfoServiceDataAck","abstract":"<p>Deprecated.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoHeartbeatACK":{"name":"SDLFrameInfoHeartbeatACK","abstract":"<p>Acknowledges that a Heartbeat control packet has been received.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoSingleFrame":{"name":"SDLFrameInfoSingleFrame","abstract":"<p>Payload contains a single packet.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoFirstFrame":{"name":"SDLFrameInfoFirstFrame","abstract":"<p>First frame in a multiple frame payload.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoConsecutiveLastFrame":{"name":"SDLFrameInfoConsecutiveLastFrame","abstract":"<p>Frame in a multiple frame payload.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeControl":{"name":"SDLServiceTypeControl","abstract":"<p>The lowest level service available.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeRPC":{"name":"SDLServiceTypeRPC","abstract":"<p>Used to send requests, responses, and notifications between an application and a head unit.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeAudio":{"name":"SDLServiceTypeAudio","abstract":"<p>The application can start the audio service to send PCM audio data to the head unit. After the StartService packet is sent and the ACK received, the payload for the Audio Service is only PCM audio data.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeVideo":{"name":"SDLServiceTypeVideo","abstract":"<p>The application can start the video service to send H.264 video data to the head unit. After the StartService packet is sent and the ACK received, the payload for the Video Service is only H.264 video data.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeBulkData":{"name":"SDLServiceTypeBulkData","abstract":"<p>Similar to the RPC Service but adds a bulk data field. The payload of a message sent via the Hybrid service consists of a Binary Header, JSON Data, and Bulk Data.</p>","parent_name":"SDLServiceType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeControl":{"name":"SDLFrameTypeControl","abstract":"<p>Lowest-level type of packets. They can be sent over any of the defined services. They are used for the control of the services in which they are sent.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeSingle":{"name":"SDLFrameTypeSingle","abstract":"<p>Contains all the data for a particular packet in the payload. The majority of frames sent over the protocol utilize this frame type.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeFirst":{"name":"SDLFrameTypeFirst","abstract":"<p>The First Frame in a multiple frame payload contains information about the entire sequence of frames so that the receiving end can correctly parse all the frames and reassemble the entire payload. The payload of this frame is only eight bytes and contains information regarding the rest of the sequence.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeConsecutive":{"name":"SDLFrameTypeConsecutive","abstract":"<p>The Consecutive Frames in a multiple frame payload contain the actual raw data of the original payload. The parsed payload contained in each of the Consecutive Frames&rsquo; payloads should be buffered until the entire sequence is complete.</p>","parent_name":"SDLFrameType"},"Enums/SDLPredefinedWindows.html#/c:@E@SDLPredefinedWindows@SDLPredefinedWindowsDefaultWindow":{"name":"SDLPredefinedWindowsDefaultWindow","abstract":"<p>The default window is a main window pre-created on behalf of the app.</p>","parent_name":"SDLPredefinedWindows"},"Enums/SDLPredefinedWindows.html#/c:@E@SDLPredefinedWindows@SDLPredefinedWindowsPrimaryWidget":{"name":"SDLPredefinedWindowsPrimaryWidget","abstract":"<p>The primary widget of the app.</p>","parent_name":"SDLPredefinedWindows"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusAllowed":{"name":"SDLPermissionGroupStatusAllowed","abstract":"<p>Every RPC in the group is currently allowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusDisallowed":{"name":"SDLPermissionGroupStatusDisallowed","abstract":"<p>Every RPC in the group is currently disallowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusMixed":{"name":"SDLPermissionGroupStatusMixed","abstract":"<p>Some RPCs in the group are allowed and some disallowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusUnknown":{"name":"SDLPermissionGroupStatusUnknown","abstract":"<p>The current status of the group is unknown.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAllAllowed":{"name":"SDLPermissionGroupTypeAllAllowed","abstract":"<p>Be notified when all of the RPC in the group are allowed, or, when they all stop being allowed in some sense, that is, when they were all allowed, and now they are not.</p>","parent_name":"SDLPermissionGroupType"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAny":{"name":"SDLPermissionGroupTypeAny","abstract":"<p>Be notified when any change in availability occurs among the group.</p>","parent_name":"SDLPermissionGroupType"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateDelete":{"name":"MenuCellStateDelete","abstract":"<p>Marks the cell to be deleted</p>","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateAdd":{"name":"MenuCellStateAdd","abstract":"<p>Marks the cell to be added</p>","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateKeep":{"name":"MenuCellStateKeep","abstract":"<p>Marks the cell to be kept</p>","parent_name":"MenuCellState"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOn":{"name":"SDLDynamicMenuUpdatesModeForceOn","abstract":"<p>Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOff":{"name":"SDLDynamicMenuUpdatesModeForceOff","abstract":"<p>This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeOnWithCompatibility":{"name":"SDLDynamicMenuUpdatesModeOnWithCompatibility","abstract":"<p>This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeSimple":{"name":"SDLLogFormatTypeSimple","abstract":"<p>A bare-bones log format: <code>09:52:07:324 🔹 (SDL)Protocol – a random test i guess</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDefault":{"name":"SDLLogFormatTypeDefault","abstract":"<p>A middle detail default log format: <code>09:52:07:324 🔹 (SDL)Protocol:SDLV2ProtocolHeader:25 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDetailed":{"name":"SDLLogFormatTypeDetailed","abstract":"<p>A very detailed log format: <code>09:52:07:324 🔹 DEBUG com.apple.main-thread:(SDL)Protocol:[SDLV2ProtocolHeader parse:]:74 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDefault":{"name":"SDLLogLevelDefault","abstract":"<p>This is used to describe that a &ldquo;specific&rdquo; logging will instead use the global log level, for example, a module may use the global log level instead of its own by specifying this level.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelOff":{"name":"SDLLogLevelOff","abstract":"<p>This is used to describe a level that involves absolutely no logs being output.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelError":{"name":"SDLLogLevelError","abstract":"<p>Only error level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelWarning":{"name":"SDLLogLevelWarning","abstract":"<p>Both error and warning level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDebug":{"name":"SDLLogLevelDebug","abstract":"<p>Error, warning, and debug level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelVerbose":{"name":"SDLLogLevelVerbose","abstract":"<p>All level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagError":{"name":"SDLLogFlagError","abstract":"<p>Error level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagWarning":{"name":"SDLLogFlagWarning","abstract":"<p>Warning level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagDebug":{"name":"SDLLogFlagDebug","abstract":"<p>Debug level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagVerbose":{"name":"SDLLogFlagVerbose","abstract":"<p>Verbose level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionTransmit":{"name":"SDLLogBytesDirectionTransmit","abstract":"<p>Transmit from the app</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionReceive":{"name":"SDLLogBytesDirectionReceive","abstract":"<p>Receive from the module</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeNever":{"name":"SDLLockScreenConfigurationDisplayModeNever","abstract":"<p>The lock screen should never be shown. This should almost always mean that you will build your own lock screen.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeRequiredOnly":{"name":"SDLLockScreenConfigurationDisplayModeRequiredOnly","abstract":"<p>The lock screen should only be shown when it is required by the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeOptionalOrRequired":{"name":"SDLLockScreenConfigurationDisplayModeOptionalOrRequired","abstract":"<p>The lock screen should be shown when required by the head unit or when the head unit says that its optional, but <em>not</em> in other cases, such as before the user has interacted with your app on the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeAlways":{"name":"SDLLockScreenConfigurationDisplayModeAlways","abstract":"<p>The lock screen should always be shown after connection.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsNone":{"name":"SDLSecondaryTransportsNone","abstract":"<p>No secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsTCP":{"name":"SDLSecondaryTransportsTCP","abstract":"<p>TCP as secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNotConnected":{"name":"SDLAudioStreamManagerErrorNotConnected","abstract":"<p>The audio stream is not currently connected</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNoQueuedAudio":{"name":"SDLAudioStreamManagerErrorNoQueuedAudio","abstract":"<p>Attempted to play but there&rsquo;s no audio in the queue</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLCacheFileManagerError.html#/c:@E@SDLCacheFileManagerError@SDLCacheManagerErrorUpdateIconArchiveFileFailure":{"name":"SDLCacheManagerErrorUpdateIconArchiveFileFailure","abstract":"<p>Failed to update archive file</p>","parent_name":"SDLCacheFileManagerError"},"Enums/SDLRPCStoreError.html#/c:@E@SDLRPCStoreError@SDLRPCStoreErrorGetInvalidObject":{"name":"SDLRPCStoreErrorGetInvalidObject","abstract":"<p>In dictionary stored value with unexpected type</p>","parent_name":"SDLRPCStoreError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorUnknown":{"name":"SDLTransportErrorUnknown","abstract":"<p>Connection cannot be established due to a reason not listed here.</p>","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionRefused":{"name":"SDLTransportErrorConnectionRefused","abstract":"<p>TCP connection is refused.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionTimedOut":{"name":"SDLTransportErrorConnectionTimedOut","abstract":"<p>TCP connection cannot be established within given time.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorNetworkDown":{"name":"SDLTransportErrorNetworkDown","abstract":"<p>TCP connection cannot be established since network is down.","parent_name":"SDLTransportError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities":{"name":"SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities","abstract":"<p>The connected head unit does not support any system capabilities</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorHMINone":{"name":"SDLSystemCapabilityManagerErrorHMINone","abstract":"<p>You must be in an HMI Level other than NONE to request or subscribe to capabilities other than DISPLAYS</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays":{"name":"SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays","abstract":"<p>You may not update the system capability type DISPLAYS because it is always subscribed</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLAlertManagerError.html#/c:@E@SDLAlertManagerError@SDLAlertManagerPresentationError":{"name":"SDLAlertManagerPresentationError","abstract":"<p>There was an error presenting the alert</p>","parent_name":"SDLAlertManagerError"},"Enums/SDLAlertManagerError.html#/c:@E@SDLAlertManagerError@SDLAlertManagerInvalidDataError":{"name":"SDLAlertManagerInvalidDataError","abstract":"<p>The alert data is invalid</p>","parent_name":"SDLAlertManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorPendingPresentationDeleted":{"name":"SDLChoiceSetManagerErrorPendingPresentationDeleted","abstract":"<p>The choice set has been deleted before it was presented</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorDeletionFailed":{"name":"SDLChoiceSetManagerErrorDeletionFailed","abstract":"<p>The choice set failed to delete</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorUploadFailed":{"name":"SDLChoiceSetManagerErrorUploadFailed","abstract":"<p>The upload failed</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorFailedToCreateMenuItems":{"name":"SDLChoiceSetManagerErrorFailedToCreateMenuItems","abstract":"<p>The menu items failed to be created</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorInvalidState":{"name":"SDLChoiceSetManagerErrorInvalidState","abstract":"<p>Invalid state</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorRPCsFailed":{"name":"SDLMenuManagerErrorRPCsFailed","abstract":"<p>Sending menu-related RPCs returned an error from the remote system</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorPendingUpdateSuperseded":{"name":"SDLMenuManagerErrorPendingUpdateSuperseded","abstract":"<p>Sending menu-related RPCs returned an error from the remote system</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLSubscribeButtonManagerError.html#/c:@E@SDLSubscribeButtonManagerError@SDLSubscribeButtonManagerErrorNotSubscribed":{"name":"SDLSubscribeButtonManagerErrorNotSubscribed","abstract":"<p>Attempting to unsubscribe to a subscribe button that has not yet been subscribed to yet.</p>","parent_name":"SDLSubscribeButtonManagerError"},"Enums/SDLSoftButtonManagerError.html#/c:@E@SDLSoftButtonManagerError@SDLSoftButtonManagerErrorPendingUpdateSuperseded":{"name":"SDLSoftButtonManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending update was superseded by a newer requested update. The old update will not be sent</p>","parent_name":"SDLSoftButtonManagerError"},"Enums/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorPendingUpdateSuperseded":{"name":"SDLTextAndGraphicManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending update was superseded by a newer requested update. The old update will not be sent</p>","parent_name":"SDLTextAndGraphicManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorCannotOverwrite":{"name":"SDLFileManagerErrorCannotOverwrite","abstract":"<p>A file attempted to send, but a file with that name already exists on the remote head unit, and the file was not configured to overwrite.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorNoKnownFile":{"name":"SDLFileManagerErrorNoKnownFile","abstract":"<p>A file was attempted to be accessed but it does not exist.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToStart":{"name":"SDLFileManagerErrorUnableToStart","abstract":"<p>The file manager attempted to start but encountered an error.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToUpload":{"name":"SDLFileManagerErrorUnableToUpload","abstract":"<p>The file manager was unable to send this file.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDoesNotExist":{"name":"SDLFileManagerErrorFileDoesNotExist","abstract":"<p>The file manager could not find the local file.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerUploadCanceled":{"name":"SDLFileManagerUploadCanceled","abstract":"<p>The file upload was canceled.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileUploadTasksFailed":{"name":"SDLFileManagerMultipleFileUploadTasksFailed","abstract":"<p>One or more of multiple files being uploaded or deleted failed.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileDeleteTasksFailed":{"name":"SDLFileManagerMultipleFileDeleteTasksFailed","abstract":"<p>One or more of multiple files being uploaded or deleted failed.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDataMissing":{"name":"SDLFileManagerErrorFileDataMissing","abstract":"<p>The file data is nil or empty.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorStaticIcon":{"name":"SDLFileManagerErrorStaticIcon","abstract":"<p>The file is a static icon, which cannot be uploaded</p>","parent_name":"SDLFileManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRPCRequestFailed":{"name":"SDLManagerErrorRPCRequestFailed","abstract":"<p>An RPC request failed to send.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotConnected":{"name":"SDLManagerErrorNotConnected","abstract":"<p>Some action was attempted that requires a connection to the remote head unit.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotReady":{"name":"SDLManagerErrorNotReady","abstract":"<p>Some action was attempted before the ready state was reached.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorUnknownRemoteError":{"name":"SDLManagerErrorUnknownRemoteError","abstract":"<p>The remote system encountered an unknown error.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorManagersFailedToStart":{"name":"SDLManagerErrorManagersFailedToStart","abstract":"<p>One or more of the sub-managers failed to start.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationFailed":{"name":"SDLManagerErrorRegistrationFailed","abstract":"<p>Registering with the remote system failed.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationSuccessWithWarning":{"name":"SDLManagerErrorRegistrationSuccessWithWarning","abstract":"<p>Registering with the remote system was successful, but had a warning.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorCancelled":{"name":"SDLManagerErrorCancelled","abstract":"<p>Request operations were cancelled before they could be sent</p>","parent_name":"SDLManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorNotConnected":{"name":"SDLEncryptionLifecycleManagerErrorNotConnected","abstract":"<p>Some action was attempted that requires a connection to the remote head unit.</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorEncryptionOff":{"name":"SDLEncryptionLifecycleManagerErrorEncryptionOff","abstract":"<p>Received ACK with encryption bit set to false from the remote head unit</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorNAK":{"name":"SDLEncryptionLifecycleManagerErrorNAK","abstract":"<p>Received NAK from the remote head unit.</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutList":{"name":"SDLChoiceSetLayoutList","abstract":"<p>Menu items will be displayed in a list</p>","parent_name":"SDLChoiceSetLayout"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutTiles":{"name":"SDLChoiceSetLayoutTiles","abstract":"<p>Menu items will be displayed as a tiled list</p>","parent_name":"SDLChoiceSetLayout"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatPNG":{"name":"SDLArtworkImageFormatPNG","abstract":"<p>Image format: PNG</p>","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatJPG":{"name":"SDLArtworkImageFormatJPG","abstract":"<p>Image format: JPG</p>","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html":{"name":"SDLArtworkImageFormat","abstract":"<p>Image format of an artwork file</p>"},"Enums/SDLChoiceSetLayout.html":{"name":"SDLChoiceSetLayout","abstract":"<p>The layout to use when a choice set is displayed</p>"},"Enums/SDLEncryptionLifecycleManagerError.html":{"name":"SDLEncryptionLifecycleManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLManagerError.html":{"name":"SDLManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLFileManagerError.html":{"name":"SDLFileManagerError","abstract":"<p>Errors associated with the SDLFileManager class.</p>"},"Enums/SDLTextAndGraphicManagerError.html":{"name":"SDLTextAndGraphicManagerError","abstract":"<p>Errors associated with the ScreenManager class</p>"},"Enums/SDLSoftButtonManagerError.html":{"name":"SDLSoftButtonManagerError","abstract":"<p>Errors associated with the Soft Button Manager class</p>"},"Enums/SDLSubscribeButtonManagerError.html":{"name":"SDLSubscribeButtonManagerError","abstract":"<p>Errors associated with the Subscribe Button Manager class</p>"},"Enums/SDLMenuManagerError.html":{"name":"SDLMenuManagerError","abstract":"<p>Errors associated with the Menu Manager class</p>"},"Enums/SDLChoiceSetManagerError.html":{"name":"SDLChoiceSetManagerError","abstract":"<p>Errors associated with Choice Set Manager class</p>"},"Enums/SDLAlertManagerError.html":{"name":"SDLAlertManagerError","abstract":"<p>Errors associated with Alert Manager class</p>"},"Enums/SDLSystemCapabilityManagerError.html":{"name":"SDLSystemCapabilityManagerError","abstract":"<p>Errors associated with the system capability manager</p>"},"Enums/SDLTransportError.html":{"name":"SDLTransportError","abstract":"<p>Errors associated with transport.</p>"},"Enums/SDLRPCStoreError.html":{"name":"SDLRPCStoreError","abstract":"<p>Errors associated with store.</p>"},"Enums/SDLCacheFileManagerError.html":{"name":"SDLCacheFileManagerError","abstract":"<p>Errors related to the cache file manager</p>"},"Enums/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"<p>Errors related to the audio stream manager</p>"},"Enums/SDLSecondaryTransports.html":{"name":"SDLSecondaryTransports","abstract":"<p>List of secondary transports</p>"},"Enums/SDLLockScreenConfigurationDisplayMode.html":{"name":"SDLLockScreenConfigurationDisplayMode","abstract":"<p>Describes when the lock screen should be shown.</p>"},"Enums/SDLLogBytesDirection.html":{"name":"SDLLogBytesDirection","abstract":"<p>An enum describing log bytes direction</p>"},"Enums/SDLLogFlag.html":{"name":"SDLLogFlag","abstract":"<p>Flags used for SDLLogLevel to provide correct enum values. This is purely for internal use.</p>"},"Enums/SDLLogLevel.html":{"name":"SDLLogLevel","abstract":"<p>An enum describing a level of logging.</p>"},"Enums/SDLLogFormatType.html":{"name":"SDLLogFormatType","abstract":"<p>The output format of logs; how they will appear when printed out into a string.</p>"},"Enums/SDLDynamicMenuUpdatesMode.html":{"name":"SDLDynamicMenuUpdatesMode","abstract":"<p>Dynamic Menu Manager Mode</p>"},"Enums/MenuCellState.html":{"name":"MenuCellState","abstract":"<p>Menu cell state</p>"},"Enums/SDLPermissionGroupType.html":{"name":"SDLPermissionGroupType","abstract":"<p>A permission group type which will be used to tell the system what type of changes you want to be notified about for the group.</p>"},"Enums/SDLPermissionGroupStatus.html":{"name":"SDLPermissionGroupStatus","abstract":"<p>The status of the group of RPCs permissions.</p>"},"Enums/SDLPredefinedWindows.html":{"name":"SDLPredefinedWindows","abstract":"<p>Specifies which windows and IDs are predefined and pre-created on behalf of the app. The default window is always available and represents the app window on the main display. It&rsquo;s an equivalent to today&rsquo;s app window. For backward compatibility, this will ensure the app always has at least the default window on the main display. The app can choose to use this predefined enum element to specifically address app&rsquo;s main window or to duplicate window content. It is not possible to duplicate another window to the default window. The primary widget is a special widget, that can be associated with a service type, which is used by the HMI whenever a single widget needs to represent the whole app. The primary widget should be named as the app and can be pre-created by the HMI.</p>"},"Enums/SDLFrameType.html":{"name":"SDLFrameType","abstract":"<p>The data packet&rsquo;s header and payload combination.</p>"},"Enums/SDLServiceType.html":{"name":"SDLServiceType","abstract":"<p>The data packet&rsquo;s format and priority.</p>"},"Enums/SDLFrameInfo.html":{"name":"SDLFrameInfo","abstract":"<p>The data packet&rsquo;s available data.</p>"},"Enums/SDLRPCMessageType.html":{"name":"SDLRPCMessageType","abstract":"<p>The type of RPC message</p>"},"Enums/SDLCarWindowRenderingType.html":{"name":"SDLCarWindowRenderingType","abstract":"<p>The type of rendering that CarWindow will perform. Depending on your app, you may need to try different ones for best performance</p>"},"Enums/SDLStreamingEncryptionFlag.html":{"name":"SDLStreamingEncryptionFlag","abstract":"<p>A flag determining how video and audio streaming should be encrypted</p>"},"Enums/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"<p>Identifies finger touch</p>"},"Constants.html#/c:@SDLAmbientLightStatusNight":{"name":"SDLAmbientLightStatusNight","abstract":"<p>Represents a &ldquo;night&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight1":{"name":"SDLAmbientLightStatusTwilight1","abstract":"<p>Represents a &ldquo;twilight 1&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight2":{"name":"SDLAmbientLightStatusTwilight2","abstract":"<p>Represents a &ldquo;twilight 2&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight3":{"name":"SDLAmbientLightStatusTwilight3","abstract":"<p>Represents a &ldquo;twilight 3&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight4":{"name":"SDLAmbientLightStatusTwilight4","abstract":"<p>Represents a &ldquo;twilight 4&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusDay":{"name":"SDLAmbientLightStatusDay","abstract":"<p>Represents a &ldquo;day&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusUnknown":{"name":"SDLAmbientLightStatusUnknown","abstract":"<p>Represents an &ldquo;unknown&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusInvalid":{"name":"SDLAmbientLightStatusInvalid","abstract":"<p>Represents a &ldquo;invalid&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAppCapabilityTypeVideoStreaming":{"name":"SDLAppCapabilityTypeVideoStreaming","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLAppHMITypeDefault":{"name":"SDLAppHMITypeDefault","abstract":"<p>The App will have default rights.</p>"},"Constants.html#/c:@SDLAppHMITypeCommunication":{"name":"SDLAppHMITypeCommunication","abstract":"<p>Communication type of App</p>"},"Constants.html#/c:@SDLAppHMITypeMedia":{"name":"SDLAppHMITypeMedia","abstract":"<p>App dealing with Media</p>"},"Constants.html#/c:@SDLAppHMITypeMessaging":{"name":"SDLAppHMITypeMessaging","abstract":"<p>Messaging App</p>"},"Constants.html#/c:@SDLAppHMITypeNavigation":{"name":"SDLAppHMITypeNavigation","abstract":"<p>Navigation App</p>"},"Constants.html#/c:@SDLAppHMITypeInformation":{"name":"SDLAppHMITypeInformation","abstract":"<p>Information App</p>"},"Constants.html#/c:@SDLAppHMITypeSocial":{"name":"SDLAppHMITypeSocial","abstract":"<p>App dealing with social media</p>"},"Constants.html#/c:@SDLAppHMITypeProjection":{"name":"SDLAppHMITypeProjection","abstract":"<p>App dealing with Mobile Projection applications</p>"},"Constants.html#/c:@SDLAppHMITypeBackgroundProcess":{"name":"SDLAppHMITypeBackgroundProcess","abstract":"<p>App designed for use in the background</p>"},"Constants.html#/c:@SDLAppHMITypeTesting":{"name":"SDLAppHMITypeTesting","abstract":"<p>App only for Testing purposes</p>"},"Constants.html#/c:@SDLAppHMITypeSystem":{"name":"SDLAppHMITypeSystem","abstract":"<p>System App</p>"},"Constants.html#/c:@SDLAppHMITypeRemoteControl":{"name":"SDLAppHMITypeRemoteControl","abstract":"<p>Remote control</p>"},"Constants.html#/c:@SDLAppHMITypeWebView":{"name":"SDLAppHMITypeWebView","abstract":"<p>WebEngine Projection mode</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonIgnitionOff":{"name":"SDLAppInterfaceUnregisteredReasonIgnitionOff","abstract":"<p>Vehicle ignition turned off.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonBluetoothOff":{"name":"SDLAppInterfaceUnregisteredReasonBluetoothOff","abstract":"<p>Bluetooth was turned off, causing termination of a necessary Bluetooth connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUSBDisconnected":{"name":"SDLAppInterfaceUnregisteredReasonUSBDisconnected","abstract":"<p>USB was disconnected, causing termination of a necessary iAP connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel":{"name":"SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel","abstract":"<p>Application attempted SmartDeviceLink RPC request while HMILevel = NONE. App must have HMILevel other than NONE to issue RPC requests or get notifications or RPC responses.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonTooManyRequests":{"name":"SDLAppInterfaceUnregisteredReasonTooManyRequests","abstract":"<p>Either too many &ndash; or too many per unit of time &ndash; requests were made by the application.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonDriverDistractionViolation":{"name":"SDLAppInterfaceUnregisteredReasonDriverDistractionViolation","abstract":"<p>The application has issued requests which cause driver distraction rules to be violated.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonLanguageChange":{"name":"SDLAppInterfaceUnregisteredReasonLanguageChange","abstract":"<p>The user performed a language change on the SDL platform, causing the application to need to be reregistered for the new language.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonMasterReset":{"name":"SDLAppInterfaceUnregisteredReasonMasterReset","abstract":"<p>The user performed a MASTER RESET on the SDL platform, causing removal of a necessary Bluetooth pairing.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonFactoryDefaults":{"name":"SDLAppInterfaceUnregisteredReasonFactoryDefaults","abstract":"<p>The user restored settings to FACTORY DEFAULTS on the SDL platform.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonAppUnauthorized":{"name":"SDLAppInterfaceUnregisteredReasonAppUnauthorized","abstract":"<p>The app is not being authorized to be connected to SDL.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonProtocolViolation":{"name":"SDLAppInterfaceUnregisteredReasonProtocolViolation","abstract":"<p>The app could not register due to a protocol violation</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource":{"name":"SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource","abstract":"<p>The HMI resource is unsupported</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonResourceConstraint":{"name":"SDLAppInterfaceUnregisteredReasonResourceConstraint","abstract":"<p>The application is unregistered due to hardware resource constraints. The system will shortly close the application to free up hardware resources.</p>"},"Constants.html#/c:@SDLAppServiceTypeMedia":{"name":"SDLAppServiceTypeMedia","abstract":"<p>The app will have a service type of media.</p>"},"Constants.html#/c:@SDLAppServiceTypeWeather":{"name":"SDLAppServiceTypeWeather","abstract":"<p>The app will have a service type of weather.</p>"},"Constants.html#/c:@SDLAppServiceTypeNavigation":{"name":"SDLAppServiceTypeNavigation","abstract":"<p>The app will have a service type of navigation.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPlayPause":{"name":"SDLAudioStreamingIndicatorPlayPause","abstract":"<p>Default playback indicator."},"Constants.html#/c:@SDLAudioStreamingIndicatorPlay":{"name":"SDLAudioStreamingIndicatorPlay","abstract":"<p>Indicates that a button press of the Play/Pause button starts the audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPause":{"name":"SDLAudioStreamingIndicatorPause","abstract":"<p>Indicates that a button press of the Play/Pause button pauses the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorStop":{"name":"SDLAudioStreamingIndicatorStop","abstract":"<p>Indicates that a button press of the Play/Pause button stops the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAudible":{"name":"SDLAudioStreamingStateAudible","abstract":"<p>Currently streaming audio, if any, is audible to user.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAttenuated":{"name":"SDLAudioStreamingStateAttenuated","abstract":"<p>Some kind of audio mixing is taking place. Currently streaming audio, if any, is audible to the user at a lowered volume.</p>"},"Constants.html#/c:@SDLAudioStreamingStateNotAudible":{"name":"SDLAudioStreamingStateNotAudible","abstract":"<p>Currently streaming audio, if any, is not audible to user. made via VR session.</p>"},"Constants.html#/c:@SDLAudioTypePCM":{"name":"SDLAudioTypePCM","abstract":"<p>PCM raw audio</p>"},"Constants.html#/c:@SDLBitsPerSample8Bit":{"name":"SDLBitsPerSample8Bit","abstract":"<p>8 bits per sample</p>"},"Constants.html#/c:@SDLBitsPerSample16Bit":{"name":"SDLBitsPerSample16Bit","abstract":"<p>16 bits per sample</p>"},"Constants.html#/c:@SDLButtonEventModeButtonUp":{"name":"SDLButtonEventModeButtonUp","abstract":"<p>The button was released</p>"},"Constants.html#/c:@SDLButtonEventModeButtonDown":{"name":"SDLButtonEventModeButtonDown","abstract":"<p>The button was depressed</p>"},"Constants.html#/c:@SDLButtonNameOk":{"name":"SDLButtonNameOk","abstract":"<p>Represents the button usually labeled &ldquo;OK&rdquo;. A typical use of this button is for the user to press it to make a selection. Prior to SDL Core 5.0 (iOS Proxy v.6.1), Ok was used for both &ldquo;OK&rdquo; buttons <em>AND</em> PlayPause. In 5.0, PlayPause was introduced to reduce confusion, and you should use the one you intend for your use case (usually PlayPause). Until the next proxy breaking change, however, subscribing to this button name will continue to subscribe you to PlayPause so that your code does not break. That means that if you subscribe to both Ok and PlayPause, you will receive duplicate notifications.</p>"},"Constants.html#/c:@SDLButtonNamePlayPause":{"name":"SDLButtonNamePlayPause","abstract":"<p>Represents the play/pause button for media apps. Replaces &ldquo;OK&rdquo; on sub-5.0 head units, compliments it on 5.0 head units and later.</p>"},"Constants.html#/c:@SDLButtonNameSeekLeft":{"name":"SDLButtonNameSeekLeft","abstract":"<p>Represents the seek-left button. A typical use of this button is for the user to scroll to the left through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameSeekRight":{"name":"SDLButtonNameSeekRight","abstract":"<p>Represents the seek-right button. A typical use of this button is for the user to scroll to the right through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameTuneUp":{"name":"SDLButtonNameTuneUp","abstract":"<p>Represents a turn of the tuner knob in the clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNameTuneDown":{"name":"SDLButtonNameTuneDown","abstract":"<p>Represents a turn of the tuner knob in the counter-clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNamePreset0":{"name":"SDLButtonNamePreset0","abstract":"<p>Represents the preset 0 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset1":{"name":"SDLButtonNamePreset1","abstract":"<p>Represents the preset 1 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset2":{"name":"SDLButtonNamePreset2","abstract":"<p>Represents the preset 2 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset3":{"name":"SDLButtonNamePreset3","abstract":"<p>Represents the preset 3 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset4":{"name":"SDLButtonNamePreset4","abstract":"<p>Represents the preset 4 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset5":{"name":"SDLButtonNamePreset5","abstract":"<p>Represents the preset 5 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset6":{"name":"SDLButtonNamePreset6","abstract":"<p>Represents the preset 6 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset7":{"name":"SDLButtonNamePreset7","abstract":"<p>Represents the preset 7 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset8":{"name":"SDLButtonNamePreset8","abstract":"<p>Represents the preset 8 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset9":{"name":"SDLButtonNamePreset9","abstract":"<p>Represents the preset 9 button.</p>"},"Constants.html#/c:@SDLButtonNameCustomButton":{"name":"SDLButtonNameCustomButton","abstract":"<p>Represents the Custom button.</p>"},"Constants.html#/c:@SDLButtonNameSearch":{"name":"SDLButtonNameSearch","abstract":"<p>Represents the SEARCH button.</p>"},"Constants.html#/c:@SDLButtonNameACMax":{"name":"SDLButtonNameACMax","abstract":"<p>Represents AC max button *</p>"},"Constants.html#/c:@SDLButtonNameAC":{"name":"SDLButtonNameAC","abstract":"<p>Represents AC button *</p>"},"Constants.html#/c:@SDLButtonNameRecirculate":{"name":"SDLButtonNameRecirculate","abstract":"<p>Represents a Recirculate button</p>"},"Constants.html#/c:@SDLButtonNameFanUp":{"name":"SDLButtonNameFanUp","abstract":"<p>Represents a Fan up button</p>"},"Constants.html#/c:@SDLButtonNameFanDown":{"name":"SDLButtonNameFanDown","abstract":"<p>Represents a fan down button</p>"},"Constants.html#/c:@SDLButtonNameTempUp":{"name":"SDLButtonNameTempUp","abstract":"<p>Represents a temperature up button</p>"},"Constants.html#/c:@SDLButtonNameTempDown":{"name":"SDLButtonNameTempDown","abstract":"<p>Represents a temperature down button</p>"},"Constants.html#/c:@SDLButtonNameDefrostMax":{"name":"SDLButtonNameDefrostMax","abstract":"<p>Represents a Defrost max button.</p>"},"Constants.html#/c:@SDLButtonNameDefrost":{"name":"SDLButtonNameDefrost","abstract":"<p>Represents a Defrost button.</p>"},"Constants.html#/c:@SDLButtonNameDefrostRear":{"name":"SDLButtonNameDefrostRear","abstract":"<p>Represents a Defrost rear button.</p>"},"Constants.html#/c:@SDLButtonNameUpperVent":{"name":"SDLButtonNameUpperVent","abstract":"<p>Represents a Upper Vent button.</p>"},"Constants.html#/c:@SDLButtonNameLowerVent":{"name":"SDLButtonNameLowerVent","abstract":"<p>Represents a Lower vent button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeUp":{"name":"SDLButtonNameVolumeUp","abstract":"<p>Represents a volume up button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeDown":{"name":"SDLButtonNameVolumeDown","abstract":"<p>Represents a volume down button.</p>"},"Constants.html#/c:@SDLButtonNameEject":{"name":"SDLButtonNameEject","abstract":"<p>Represents a Eject Button.</p>"},"Constants.html#/c:@SDLButtonNameSource":{"name":"SDLButtonNameSource","abstract":"<p>Represents a Source button.</p>"},"Constants.html#/c:@SDLButtonNameShuffle":{"name":"SDLButtonNameShuffle","abstract":"<p>Represents a SHUFFLE button.</p>"},"Constants.html#/c:@SDLButtonNameRepeat":{"name":"SDLButtonNameRepeat","abstract":"<p>Represents a Repeat button.</p>"},"Constants.html#/c:@SDLButtonNameNavCenterLocation":{"name":"SDLButtonNameNavCenterLocation","abstract":"<p>Represents a Navigate to center button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomIn":{"name":"SDLButtonNameNavZoomIn","abstract":"<p>Represents a Zoom in button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomOut":{"name":"SDLButtonNameNavZoomOut","abstract":"<p>Represents a Zoom out button.</p>"},"Constants.html#/c:@SDLButtonNameNavPanUp":{"name":"SDLButtonNameNavPanUp","abstract":"<p>Represents a Pan up button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpRight":{"name":"SDLButtonNameNavPanUpRight","abstract":"<p>Represents a Pan up/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanRight":{"name":"SDLButtonNameNavPanRight","abstract":"<p>Represents a Pan right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownRight":{"name":"SDLButtonNameNavPanDownRight","abstract":"<p>Represents a Pan down/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDown":{"name":"SDLButtonNameNavPanDown","abstract":"<p>Represents a Pan down button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownLeft":{"name":"SDLButtonNameNavPanDownLeft","abstract":"<p>Represents a Pan down left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanLeft":{"name":"SDLButtonNameNavPanLeft","abstract":"<p>Represents a Pan left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpLeft":{"name":"SDLButtonNameNavPanUpLeft","abstract":"<p>Represents a Pan up left button</p>"},"Constants.html#/c:@SDLButtonNameNavTiltToggle":{"name":"SDLButtonNameNavTiltToggle","abstract":"<p>Represents a Tilt button. If supported, this toggles between a top-down view and an angled/3D view. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonNameNavRotateClockwise":{"name":"SDLButtonNameNavRotateClockwise","abstract":"<p>Represents a Rotate clockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavRotateCounterClockwise":{"name":"SDLButtonNameNavRotateCounterClockwise","abstract":"<p>Represents a Rotate counterclockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavHeadingToggle":{"name":"SDLButtonNameNavHeadingToggle","abstract":"<p>Represents a Heading toggle button. If supported, this toggles between locking the orientation to north or to the vehicle&rsquo;s heading. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonPressModeLong":{"name":"SDLButtonPressModeLong","abstract":"<p>A button was released, after it was pressed for a long time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLButtonPressModeShort":{"name":"SDLButtonPressModeShort","abstract":"<p>A button was released, after it was pressed for a short time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLCapacityUnitKilograms":{"name":"SDLCapacityUnitKilograms","abstract":"<p>A capacity in kilogram units</p>"},"Constants.html#/c:@SDLCapacityUnitKilowatthours":{"name":"SDLCapacityUnitKilowatthours","abstract":"<p>A capacity in Kilowatt Hour units</p>"},"Constants.html#/c:@SDLCapacityUnitLiters":{"name":"SDLCapacityUnitLiters","abstract":"<p>A capacity in Liter units</p>"},"Constants.html#/c:@SDLCarModeStatusNormal":{"name":"SDLCarModeStatusNormal","abstract":"<p>Provides carmode NORMAL to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusFactory":{"name":"SDLCarModeStatusFactory","abstract":"<p>Provides carmode FACTORY to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusTransport":{"name":"SDLCarModeStatusTransport","abstract":"<p>Provides carmode TRANSPORT to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusCrash":{"name":"SDLCarModeStatusCrash","abstract":"<p>Provides carmode CRASH to each module.</p>"},"Constants.html#/c:@SDLCharacterSetType2":{"name":"SDLCharacterSetType2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetAscii":{"name":"SDLCharacterSetAscii","abstract":"<p>ASCII as defined in <a href=\"https://en.wikipedia.org/wiki/ASCII\">https://en.wikipedia.org/wiki/ASCII</a> as defined in codes 0-127. Non-printable characters such as tabs and back spaces are ignored.</p>"},"Constants.html#/c:@SDLCharacterSetIso88591":{"name":"SDLCharacterSetIso88591","abstract":"<p>Latin-1, as defined in <a href=\"https://en.wikipedia.org/wiki/ISO/IEC_8859-1\">https://en.wikipedia.org/wiki/ISO/IEC_8859-1</a></p>"},"Constants.html#/c:@SDLCharacterSetUtf8":{"name":"SDLCharacterSetUtf8","abstract":"<p>The UTF-8 character set that uses variable bytes per code point. See <a href=\"https://en.wikipedia.org/wiki/UTF-8\">https://en.wikipedia.org/wiki/UTF-8</a> for more details. This is the preferred character set.</p>"},"Constants.html#/c:@SDLCompassDirectionNorth":{"name":"SDLCompassDirectionNorth","abstract":"<p>Direction North</p>"},"Constants.html#/c:@SDLCompassDirectionNorthwest":{"name":"SDLCompassDirectionNorthwest","abstract":"<p>Direction Northwest</p>"},"Constants.html#/c:@SDLCompassDirectionWest":{"name":"SDLCompassDirectionWest","abstract":"<p>Direction West</p>"},"Constants.html#/c:@SDLCompassDirectionSouthwest":{"name":"SDLCompassDirectionSouthwest","abstract":"<p>Direction Southwest</p>"},"Constants.html#/c:@SDLCompassDirectionSouth":{"name":"SDLCompassDirectionSouth","abstract":"<p>Direction South</p>"},"Constants.html#/c:@SDLCompassDirectionSoutheast":{"name":"SDLCompassDirectionSoutheast","abstract":"<p>Direction Southeast</p>"},"Constants.html#/c:@SDLCompassDirectionEast":{"name":"SDLCompassDirectionEast","abstract":"<p>Direction East</p>"},"Constants.html#/c:@SDLCompassDirectionNortheast":{"name":"SDLCompassDirectionNortheast","abstract":"<p>Direction Northeast</p>"},"Constants.html#/c:@SDLComponentVolumeStatusUnknown":{"name":"SDLComponentVolumeStatusUnknown","abstract":"<p>Unknown SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNormal":{"name":"SDLComponentVolumeStatusNormal","abstract":"<p>Normal SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusLow":{"name":"SDLComponentVolumeStatusLow","abstract":"<p>Low SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusFault":{"name":"SDLComponentVolumeStatusFault","abstract":"<p>Fault SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusAlert":{"name":"SDLComponentVolumeStatusAlert","abstract":"<p>Alert SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNotSupported":{"name":"SDLComponentVolumeStatusNotSupported","abstract":"<p>Not supported SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLDefrostZoneFront":{"name":"SDLDefrostZoneFront","abstract":"<p>A SDLDefrostZone with the value of <em>FRONT</em></p>"},"Constants.html#/c:@SDLDefrostZoneRear":{"name":"SDLDefrostZoneRear","abstract":"<p>A SDLDefrostZone with the value of <em>REAR</em></p>"},"Constants.html#/c:@SDLDefrostZoneAll":{"name":"SDLDefrostZoneAll","abstract":"<p>A SDLDefrostZone with the value of <em>All</em></p>"},"Constants.html#/c:@SDLDefrostZoneNone":{"name":"SDLDefrostZoneNone","abstract":"<p>A SDLDefrostZone with the value of <em>None</em></p>"},"Constants.html#/c:@SDLDeliveryModePrompt":{"name":"SDLDeliveryModePrompt","abstract":"<p>User is prompted on HMI</p>"},"Constants.html#/c:@SDLDeliveryModeDestination":{"name":"SDLDeliveryModeDestination","abstract":"<p>Set the location as destination without prompting the user</p>"},"Constants.html#/c:@SDLDeliveryModeQueue":{"name":"SDLDeliveryModeQueue","abstract":"<p>Adds the current location to navigation queue</p>"},"Constants.html#/c:@SDLDeviceLevelStatusZeroBars":{"name":"SDLDeviceLevelStatusZeroBars","abstract":"<p>Device battery level is zero bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusOneBar":{"name":"SDLDeviceLevelStatusOneBar","abstract":"<p>Device battery level is one bar</p>"},"Constants.html#/c:@SDLDeviceLevelStatusTwoBars":{"name":"SDLDeviceLevelStatusTwoBars","abstract":"<p>Device battery level is two bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusThreeBars":{"name":"SDLDeviceLevelStatusThreeBars","abstract":"<p>Device battery level is three bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusFourBars":{"name":"SDLDeviceLevelStatusFourBars","abstract":"<p>Device battery level is four bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusNotProvided":{"name":"SDLDeviceLevelStatusNotProvided","abstract":"<p>Device battery level is unknown</p>"},"Constants.html#/c:@SDLDimensionNoFix":{"name":"SDLDimensionNoFix","abstract":"<p>No GPS at all</p>"},"Constants.html#/c:@SDLDimension2D":{"name":"SDLDimension2D","abstract":"<p>Longitude and latitude of the GPS</p>"},"Constants.html#/c:@SDLDimension3D":{"name":"SDLDimension3D","abstract":"<p>Longitude and latitude and altitude of the GPS</p>"},"Constants.html#/c:@SDLDirectionLeft":{"name":"SDLDirectionLeft","abstract":"<p>Direction left</p>"},"Constants.html#/c:@SDLDirectionRight":{"name":"SDLDirectionRight","abstract":"<p>Direction right</p>"},"Constants.html#/c:@SDLDisplayModeDay":{"name":"SDLDisplayModeDay","abstract":"<p>@abstract Display Mode : DAY</p>"},"Constants.html#/c:@SDLDisplayModeNight":{"name":"SDLDisplayModeNight","abstract":"<p>@abstract Display Mode : NIGHT.</p>"},"Constants.html#/c:@SDLDisplayModeAuto":{"name":"SDLDisplayModeAuto","abstract":"<p>@abstract Display Mode : AUTO.</p>"},"Constants.html#/c:@SDLDisplayTypeCID":{"name":"SDLDisplayTypeCID","abstract":"<p>This display type provides a 2-line x 20 character &ldquo;dot matrix&rdquo; display.</p>"},"Constants.html#/c:@SDLDisplayTypeType2":{"name":"SDLDisplayTypeType2","abstract":"<p>Display type 2</p>"},"Constants.html#/c:@SDLDisplayTypeType5":{"name":"SDLDisplayTypeType5","abstract":"<p>Display type 5</p>"},"Constants.html#/c:@SDLDisplayTypeNGN":{"name":"SDLDisplayTypeNGN","abstract":"<p>This display type provides an 8 inch touchscreen display.</p>"},"Constants.html#/c:@SDLDisplayTypeGen28DMA":{"name":"SDLDisplayTypeGen28DMA","abstract":"<p>Display type Gen 28 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeGen26DMA":{"name":"SDLDisplayTypeGen26DMA","abstract":"<p>Display type Gen 26 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeMFD3":{"name":"SDLDisplayTypeMFD3","abstract":"<p>Display type MFD3</p>"},"Constants.html#/c:@SDLDisplayTypeMFD4":{"name":"SDLDisplayTypeMFD4","abstract":"<p>Display type MFD4</p>"},"Constants.html#/c:@SDLDisplayTypeMFD5":{"name":"SDLDisplayTypeMFD5","abstract":"<p>Display type MFD5</p>"},"Constants.html#/c:@SDLDisplayTypeGen38Inch":{"name":"SDLDisplayTypeGen38Inch","abstract":"<p>Display type Gen 3 8-inch</p>"},"Constants.html#/c:@SDLDisplayTypeGeneric":{"name":"SDLDisplayTypeGeneric","abstract":"<p>Display type Generic</p>"},"Constants.html#/c:@SDLDistanceUnitMiles":{"name":"SDLDistanceUnitMiles","abstract":"<p>@abstract SDLDistanceUnit: <em>MILES</em></p>"},"Constants.html#/c:@SDLDistanceUnitKilometers":{"name":"SDLDistanceUnitKilometers","abstract":"<p>@abstract SDLDistanceUnit: <em>KILOMETERS</em></p>"},"Constants.html#/c:@SDLDoorStatusTypeClosed":{"name":"SDLDoorStatusTypeClosed","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDoorStatusTypeLocked":{"name":"SDLDoorStatusTypeLocked","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDoorStatusTypeAjar":{"name":"SDLDoorStatusTypeAjar","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDoorStatusTypeRemoved":{"name":"SDLDoorStatusTypeRemoved","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDriverDistractionStateOn":{"name":"SDLDriverDistractionStateOn","abstract":"<p>Driver distraction rules are in effect.</p>"},"Constants.html#/c:@SDLDriverDistractionStateOff":{"name":"SDLDriverDistractionStateOff","abstract":"<p>Driver distraction rules are NOT in effect.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusNormal":{"name":"SDLECallConfirmationStatusNormal","abstract":"<p>No E-Call signal triggered.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusInProgress":{"name":"SDLECallConfirmationStatusInProgress","abstract":"<p>An E-Call is being in progress.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCancelled":{"name":"SDLECallConfirmationStatusCancelled","abstract":"<p>An E-Call was cancelled by the user.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCompleted":{"name":"SDLECallConfirmationStatusCompleted","abstract":"<p>The E-Call sequence is completed.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusUnsuccessful":{"name":"SDLECallConfirmationStatusUnsuccessful","abstract":"<p>An E-Call could not be connected.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusConfiguredOff":{"name":"SDLECallConfirmationStatusConfiguredOff","abstract":"<p>E-Call is not configured on this vehicle.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCompleteDTMFTimeout":{"name":"SDLECallConfirmationStatusCompleteDTMFTimeout","abstract":"<p>E-Call is considered to be complete without Emergency Operator contact.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusClosed":{"name":"SDLElectronicParkBrakeStatusClosed","abstract":"<p>Parking brake actuators have been fully applied.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusTransition":{"name":"SDLElectronicParkBrakeStatusTransition","abstract":"<p>Parking brake actuators are transitioning to either Apply/Closed or Release/Open state.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusOpen":{"name":"SDLElectronicParkBrakeStatusOpen","abstract":"<p>Parking brake actuators are released.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusDriveActive":{"name":"SDLElectronicParkBrakeStatusDriveActive","abstract":"<p>When driver pulls the Electronic Parking Brake switch while driving &ldquo;at speed&rdquo;.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusFault":{"name":"SDLElectronicParkBrakeStatusFault","abstract":"<p>When system has a fault or is under maintenance.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeNoEvent":{"name":"SDLEmergencyEventTypeNoEvent","abstract":"<p>No emergency event has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeFrontal":{"name":"SDLEmergencyEventTypeFrontal","abstract":"<p>Frontal collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeSide":{"name":"SDLEmergencyEventTypeSide","abstract":"<p>Side collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeRear":{"name":"SDLEmergencyEventTypeRear","abstract":"<p>Rear collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeRollover":{"name":"SDLEmergencyEventTypeRollover","abstract":"<p>A rollover event has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeNotSupported":{"name":"SDLEmergencyEventTypeNotSupported","abstract":"<p>The signal is not supported</p>"},"Constants.html#/c:@SDLEmergencyEventTypeFault":{"name":"SDLEmergencyEventTypeFault","abstract":"<p>Emergency status cannot be determined</p>"},"Constants.html#/c:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"<p>An error in the SDLAudioStreamManager</p>"},"Constants.html#/c:@SDLErrorDomainCacheFileManager":{"name":"SDLErrorDomainCacheFileManager","abstract":"<p>An error in the SDLCacheFileManager private class</p>"},"Constants.html#/c:@SDLErrorDomainChoiceSetManager":{"name":"SDLErrorDomainChoiceSetManager","abstract":"<p>An error in the SDLChoiceSetManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainAlertManager":{"name":"SDLErrorDomainAlertManager","abstract":"<p>An error in the SDLAlertManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainEncryptionLifecycleManager":{"name":"SDLErrorDomainEncryptionLifecycleManager","abstract":"<p>An error in the SDLEncryptionLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainFileManager":{"name":"SDLErrorDomainFileManager","abstract":"<p>An error in the SDLFileManager</p>"},"Constants.html#/c:@SDLErrorDomainLifecycleManager":{"name":"SDLErrorDomainLifecycleManager","abstract":"<p>An error in the SDLLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainMenuManager":{"name":"SDLErrorDomainMenuManager","abstract":"<p>An error in the SDLMenuManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainRPCStore":{"name":"SDLErrorDomainRPCStore","abstract":"<p>An error in an SDL RPC class</p>"},"Constants.html#/c:@SDLErrorDomainSoftButtonManager":{"name":"SDLErrorDomainSoftButtonManager","abstract":"<p>An error in the SDLSoftButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSubscribeButtonManager":{"name":"SDLErrorDomainSubscribeButtonManager","abstract":"<p>An error in the SDLSubscribeButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSystemCapabilityManager":{"name":"SDLErrorDomainSystemCapabilityManager","abstract":"<p>An error in the SDLSystemCapabilityManager</p>"},"Constants.html#/c:@SDLErrorDomainTextAndGraphicManager":{"name":"SDLErrorDomainTextAndGraphicManager","abstract":"<p>An error in the SDLTextAndGraphicManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainTransport":{"name":"SDLErrorDomainTransport","abstract":"<p>An error in a SDL transport private class</p>"},"Constants.html#/c:@SDLFileTypeBMP":{"name":"SDLFileTypeBMP","abstract":"<p>file type: Bitmap (BMP)</p>"},"Constants.html#/c:@SDLFileTypeJPEG":{"name":"SDLFileTypeJPEG","abstract":"<p>file type: JPEG</p>"},"Constants.html#/c:@SDLFileTypePNG":{"name":"SDLFileTypePNG","abstract":"<p>file type: PNG</p>"},"Constants.html#/c:@SDLFileTypeWAV":{"name":"SDLFileTypeWAV","abstract":"<p>file type: WAVE (WAV)</p>"},"Constants.html#/c:@SDLFileTypeMP3":{"name":"SDLFileTypeMP3","abstract":"<p>file type: MP3</p>"},"Constants.html#/c:@SDLFileTypeAAC":{"name":"SDLFileTypeAAC","abstract":"<p>file type: AAC</p>"},"Constants.html#/c:@SDLFileTypeBinary":{"name":"SDLFileTypeBinary","abstract":"<p>file type: BINARY</p>"},"Constants.html#/c:@SDLFileTypeJSON":{"name":"SDLFileTypeJSON","abstract":"<p>file type: JSON</p>"},"Constants.html#/c:@SDLFuelCutoffStatusTerminateFuel":{"name":"SDLFuelCutoffStatusTerminateFuel","abstract":"<p>Fuel is cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusNormalOperation":{"name":"SDLFuelCutoffStatusNormalOperation","abstract":"<p>Fuel is not cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusFault":{"name":"SDLFuelCutoffStatusFault","abstract":"<p>Status of the fuel pump cannot be determined</p>"},"Constants.html#/c:@SDLFuelTypeGasoline":{"name":"SDLFuelTypeGasoline","abstract":"<p>Fuel type: Gasoline</p>"},"Constants.html#/c:@SDLFuelTypeDiesel":{"name":"SDLFuelTypeDiesel","abstract":"<p>Fuel type: Diesel</p>"},"Constants.html#/c:@SDLFuelTypeCNG":{"name":"SDLFuelTypeCNG","abstract":"<p>Fuel type: CNG</p>"},"Constants.html#/c:@SDLFuelTypeLPG":{"name":"SDLFuelTypeLPG","abstract":"<p>Fuel type: LPG</p>"},"Constants.html#/c:@SDLFuelTypeHydrogen":{"name":"SDLFuelTypeHydrogen","abstract":"<p>Fuel type: Hydrogen</p>"},"Constants.html#/c:@SDLFuelTypeBattery":{"name":"SDLFuelTypeBattery","abstract":"<p>Fuel type: Battery</p>"},"Constants.html#/c:@SDLGlobalPropertyHelpPrompt":{"name":"SDLGlobalPropertyHelpPrompt","abstract":"<p>The help prompt to be spoken if the user needs assistance during a user-initiated interaction.</p>"},"Constants.html#/c:@SDLGlobalPropertyTimeoutPrompt":{"name":"SDLGlobalPropertyTimeoutPrompt","abstract":"<p>The prompt to be spoken if the user-initiated interaction times out waiting for the user&rsquo;s verbal input.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpTitle":{"name":"SDLGlobalPropertyVoiceRecognitionHelpTitle","abstract":"<p>The title of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpItems":{"name":"SDLGlobalPropertyVoiceRecognitionHelpItems","abstract":"<p>Items of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuName":{"name":"SDLGlobalPropertyMenuName","abstract":"<p>The name of the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuIcon":{"name":"SDLGlobalPropertyMenuIcon","abstract":"<p>An icon on the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyKeyboard":{"name":"SDLGlobalPropertyKeyboard","abstract":"<p>Property related to the keyboard</p>"},"Constants.html#/c:@SDLGlobalPropertyUserLocation":{"name":"SDLGlobalPropertyUserLocation","abstract":"<p>Location of the user&rsquo;s seat of setGlobalProperties</p>"},"Constants.html#/c:@SDLHMILevelFull":{"name":"SDLHMILevelFull","abstract":"<p>The application has full use of the SDL HMI. The app may output via TTS, display, or streaming audio and may gather input via VR, Menu, and button presses</p>"},"Constants.html#/c:@SDLHMILevelLimited":{"name":"SDLHMILevelLimited","abstract":"<p>This HMI Level is only defined for a media application using an HMI with an 8 inch touchscreen (Nav) system. The application&rsquo;s Show text is displayed and it receives button presses from media-oriented buttons (SEEKRIGHT, SEEKLEFT, TUNEUP, TUNEDOWN, PRESET_0-9)</p>"},"Constants.html#/c:@SDLHMILevelBackground":{"name":"SDLHMILevelBackground","abstract":"<p>App cannot interact with user via TTS, VR, Display or Button Presses. App can perform the following operations:</p>"},"Constants.html#/c:@SDLHMILevelNone":{"name":"SDLHMILevelNone","abstract":"<p>Application has been discovered by SDL, but it cannot send any requests or receive any notifications</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesFront":{"name":"SDLHMIZoneCapabilitiesFront","abstract":"<p>Indicates HMI available for front seat passengers.</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesBack":{"name":"SDLHMIZoneCapabilitiesBack","abstract":"<p>Indicates HMI available for rear seat passengers.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceMobile":{"name":"SDLHybridAppPreferenceMobile","abstract":"<p>App preference of mobile.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceCloud":{"name":"SDLHybridAppPreferenceCloud","abstract":"<p>App preference of cloud.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceBoth":{"name":"SDLHybridAppPreferenceBoth","abstract":"<p>App preference of both. Allows both the mobile and the cloud versions of the app to attempt to connect at the same time, however the first app that is registered is the one that is allowed to stay registered.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusNotStable":{"name":"SDLIgnitionStableStatusNotStable","abstract":"<p>The current ignition switch status is considered not to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusStable":{"name":"SDLIgnitionStableStatusStable","abstract":"<p>The current ignition switch status is considered to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusMissingFromTransmitter":{"name":"SDLIgnitionStableStatusMissingFromTransmitter","abstract":"<p>The current ignition switch status is considered to be missing from the transmitter</p>"},"Constants.html#/c:@SDLIgnitionStatusUnknown":{"name":"SDLIgnitionStatusUnknown","abstract":"<p>Ignition status currently unknown</p>"},"Constants.html#/c:@SDLIgnitionStatusOff":{"name":"SDLIgnitionStatusOff","abstract":"<p>Ignition is off</p>"},"Constants.html#/c:@SDLIgnitionStatusAccessory":{"name":"SDLIgnitionStatusAccessory","abstract":"<p>Ignition is in mode accessory</p>"},"Constants.html#/c:@SDLIgnitionStatusRun":{"name":"SDLIgnitionStatusRun","abstract":"<p>Ignition is in mode run</p>"},"Constants.html#/c:@SDLIgnitionStatusStart":{"name":"SDLIgnitionStatusStart","abstract":"<p>Ignition is in mode start</p>"},"Constants.html#/c:@SDLIgnitionStatusInvalid":{"name":"SDLIgnitionStatusInvalid","abstract":"<p>Signal is invalid</p>"},"Constants.html#/c:@SDLImageFieldNameAlertIcon":{"name":"SDLImageFieldNameAlertIcon","abstract":"<p>The image field for Alert</p>"},"Constants.html#/c:@SDLImageFieldNameSoftButtonImage":{"name":"SDLImageFieldNameSoftButtonImage","abstract":"<p>The image field for SoftButton</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceImage":{"name":"SDLImageFieldNameChoiceImage","abstract":"<p>The first image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceSecondaryImage":{"name":"SDLImageFieldNameChoiceSecondaryImage","abstract":"<p>The scondary image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameVoiceRecognitionHelpItem":{"name":"SDLImageFieldNameVoiceRecognitionHelpItem","abstract":"<p>The image field for vrHelpItem.</p>"},"Constants.html#/c:@SDLImageFieldNameTurnIcon":{"name":"SDLImageFieldNameTurnIcon","abstract":"<p>The image field for Turn.</p>"},"Constants.html#/c:@SDLImageFieldNameMenuIcon":{"name":"SDLImageFieldNameMenuIcon","abstract":"<p>The image field for the menu icon in SetGlobalProperties.</p>"},"Constants.html#/c:@SDLImageFieldNameCommandIcon":{"name":"SDLImageFieldNameCommandIcon","abstract":"<p>The image field for AddCommand."},"Constants.html#/c:@SDLImageFieldNameAppIcon":{"name":"SDLImageFieldNameAppIcon","abstract":"<p>The image field for the app icon (set by setAppIcon).</p>"},"Constants.html#/c:@SDLImageFieldNameGraphic":{"name":"SDLImageFieldNameGraphic","abstract":"<p>The primary image field for Show."},"Constants.html#/c:@SDLImageFieldNameSecondaryGraphic":{"name":"SDLImageFieldNameSecondaryGraphic","abstract":"<p>The secondary image field for Show."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTIcon":{"name":"SDLImageFieldNameShowConstantTBTIcon","abstract":"<p>The primary image field for ShowConstant TBT."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTNextTurnIcon":{"name":"SDLImageFieldNameShowConstantTBTNextTurnIcon","abstract":"<p>The secondary image field for ShowConstant TBT.</p>"},"Constants.html#/c:@SDLImageFieldNameLocationImage":{"name":"SDLImageFieldNameLocationImage","abstract":"<p>The optional image of a destination / location</p>"},"Constants.html#/c:@SDLImageFieldNameSubMenuIcon":{"name":"SDLImageFieldNameSubMenuIcon","abstract":"<p>The image field for AddSubMenu.menuIcon</p>"},"Constants.html#/c:@SDLImageFieldNameSubtleAlertIcon":{"name":"SDLImageFieldNameSubtleAlertIcon","abstract":"<p>The image of the subtle alert; applies to <code>SubtleAlert</code> <code>alertImage</code></p>"},"Constants.html#/c:@SDLImageFieldNameMenuCommandSecondaryImage":{"name":"SDLImageFieldNameMenuCommandSecondaryImage","abstract":"<p>The secondary image field for AddCommand</p>"},"Constants.html#/c:@SDLImageFieldNameMenuSubMenuSecondaryImage":{"name":"SDLImageFieldNameMenuSubMenuSecondaryImage","abstract":"<p>The secondary image field for AddSubMenu</p>"},"Constants.html#/c:@SDLImageTypeStatic":{"name":"SDLImageTypeStatic","abstract":"<p>Activate an icon that shipped with the IVI system by passing a hex value.</p>"},"Constants.html#/c:@SDLImageTypeDynamic":{"name":"SDLImageTypeDynamic","abstract":"<p>An icon referencing an image uploaded by the app (identifier to be sent by SDLPutFile)</p>"},"Constants.html#/c:@SDLInteractionModeManualOnly":{"name":"SDLInteractionModeManualOnly","abstract":"<p>Interaction Mode : Manual Only</p>"},"Constants.html#/c:@SDLInteractionModeVoiceRecognitionOnly":{"name":"SDLInteractionModeVoiceRecognitionOnly","abstract":"<p>Interaction Mode : VR Only</p>"},"Constants.html#/c:@SDLInteractionModeBoth":{"name":"SDLInteractionModeBoth","abstract":"<p>Interaction Mode : Manual &amp; VR</p>"},"Constants.html#/c:@SDLKeyboardEventKeypress":{"name":"SDLKeyboardEventKeypress","abstract":"<p>The use has pressed the keyboard key (applies to both SINGLE_KEYPRESS and RESEND_CURRENT_ENTRY modes).</p>"},"Constants.html#/c:@SDLKeyboardEventSubmitted":{"name":"SDLKeyboardEventSubmitted","abstract":"<p>The User has finished entering text from the keyboard and submitted the entry.</p>"},"Constants.html#/c:@SDLKeyboardEventCancelled":{"name":"SDLKeyboardEventCancelled","abstract":"<p>The User has pressed the HMI-defined &ldquo;Cancel&rdquo; button.</p>"},"Constants.html#/c:@SDLKeyboardEventAborted":{"name":"SDLKeyboardEventAborted","abstract":"<p>The User has not finished entering text and the keyboard is aborted with the event of higher priority.</p>"},"Constants.html#/c:@SDLKeyboardEventVoice":{"name":"SDLKeyboardEventVoice","abstract":"<p>The user used voice as input for the keyboard</p>"},"Constants.html#/c:@SDLKeyboardEventInputKeyMaskEnabled":{"name":"SDLKeyboardEventInputKeyMaskEnabled","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeyboardEventInputKeyMaskDisabled":{"name":"SDLKeyboardEventInputKeyMaskDisabled","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeyboardInputMaskEnableInputKeyMask":{"name":"SDLKeyboardInputMaskEnableInputKeyMask","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLKeyboardInputMaskDisableInputKeyMask":{"name":"SDLKeyboardInputMaskDisableInputKeyMask","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLKeyboardInputMaskUserChoiceInputKeyMask":{"name":"SDLKeyboardInputMaskUserChoiceInputKeyMask","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTY":{"name":"SDLKeyboardLayoutQWERTY","abstract":"<p>QWERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTZ":{"name":"SDLKeyboardLayoutQWERTZ","abstract":"<p>QWERTZ layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutAZERTY":{"name":"SDLKeyboardLayoutAZERTY","abstract":"<p>AZERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutNumeric":{"name":"SDLKeyboardLayoutNumeric","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeypressModeSingleKeypress":{"name":"SDLKeypressModeSingleKeypress","abstract":"<p>SINGLE_KEYPRESS:<br>Each and every User`s keypress must be reported (new notification for every newly entered single symbol).</p>"},"Constants.html#/c:@SDLKeypressModeQueueKeypresses":{"name":"SDLKeypressModeQueueKeypresses","abstract":"<p>QUEUE_KEYPRESSES:<br>The whole entry is reported only after the User submits it (by ‘Search’ button click displayed on touchscreen keyboard)</p>"},"Constants.html#/c:@SDLKeypressModeResendCurrentEntry":{"name":"SDLKeypressModeResendCurrentEntry","abstract":"<p>RESEND_CURRENT_ENTRY:<br>The whole entry must be reported each and every time the User makes a new keypress<br> (new notification with all previously entered symbols and a newly entered one appended).</p>"},"Constants.html#/c:@SDLLanguageEnSa":{"name":"SDLLanguageEnSa","abstract":"<p>English_SA</p>"},"Constants.html#/c:@SDLLanguageHeIl":{"name":"SDLLanguageHeIl","abstract":"<p>Hebrew_IL</p>"},"Constants.html#/c:@SDLLanguageRoRo":{"name":"SDLLanguageRoRo","abstract":"<p>Romainian_RO</p>"},"Constants.html#/c:@SDLLanguageUkUa":{"name":"SDLLanguageUkUa","abstract":"<p>Ukrainian_UA</p>"},"Constants.html#/c:@SDLLanguageIdId":{"name":"SDLLanguageIdId","abstract":"<p>Indonesian_ID</p>"},"Constants.html#/c:@SDLLanguageViVn":{"name":"SDLLanguageViVn","abstract":"<p>Vietnamese_VN</p>"},"Constants.html#/c:@SDLLanguageMsMy":{"name":"SDLLanguageMsMy","abstract":"<p>Malay_MY</p>"},"Constants.html#/c:@SDLLanguageHiIn":{"name":"SDLLanguageHiIn","abstract":"<p>Hindi_IN</p>"},"Constants.html#/c:@SDLLanguageNlBe":{"name":"SDLLanguageNlBe","abstract":"<p>Dutch(Flemish)_BE</p>"},"Constants.html#/c:@SDLLanguageElGr":{"name":"SDLLanguageElGr","abstract":"<p>Greek_GR</p>"},"Constants.html#/c:@SDLLanguageHuHu":{"name":"SDLLanguageHuHu","abstract":"<p>Hungarian_HU</p>"},"Constants.html#/c:@SDLLanguageFiFi":{"name":"SDLLanguageFiFi","abstract":"<p>Finnish_FI</p>"},"Constants.html#/c:@SDLLanguageSkSk":{"name":"SDLLanguageSkSk","abstract":"<p>Slovak_SK</p>"},"Constants.html#/c:@SDLLanguageEnUs":{"name":"SDLLanguageEnUs","abstract":"<p>English_US</p>"},"Constants.html#/c:@SDLLanguageEnIn":{"name":"SDLLanguageEnIn","abstract":"<p>English - India</p>"},"Constants.html#/c:@SDLLanguageThTh":{"name":"SDLLanguageThTh","abstract":"<p>Thai - Thailand</p>"},"Constants.html#/c:@SDLLanguageEsMx":{"name":"SDLLanguageEsMx","abstract":"<p>Spanish - Mexico</p>"},"Constants.html#/c:@SDLLanguageFrCa":{"name":"SDLLanguageFrCa","abstract":"<p>French - Canada</p>"},"Constants.html#/c:@SDLLanguageDeDe":{"name":"SDLLanguageDeDe","abstract":"<p>German - Germany</p>"},"Constants.html#/c:@SDLLanguageEsEs":{"name":"SDLLanguageEsEs","abstract":"<p>Spanish - Spain</p>"},"Constants.html#/c:@SDLLanguageEnGb":{"name":"SDLLanguageEnGb","abstract":"<p>English - Great Britain</p>"},"Constants.html#/c:@SDLLanguageRuRu":{"name":"SDLLanguageRuRu","abstract":"<p>Russian - Russia</p>"},"Constants.html#/c:@SDLLanguageTrTr":{"name":"SDLLanguageTrTr","abstract":"<p>Turkish - Turkey</p>"},"Constants.html#/c:@SDLLanguagePlPl":{"name":"SDLLanguagePlPl","abstract":"<p>Polish - Poland</p>"},"Constants.html#/c:@SDLLanguageFrFr":{"name":"SDLLanguageFrFr","abstract":"<p>French - France</p>"},"Constants.html#/c:@SDLLanguageItIt":{"name":"SDLLanguageItIt","abstract":"<p>Italian - Italy</p>"},"Constants.html#/c:@SDLLanguageSvSe":{"name":"SDLLanguageSvSe","abstract":"<p>Swedish - Sweden</p>"},"Constants.html#/c:@SDLLanguagePtPt":{"name":"SDLLanguagePtPt","abstract":"<p>Portuguese - Portugal</p>"},"Constants.html#/c:@SDLLanguageNlNl":{"name":"SDLLanguageNlNl","abstract":"<p>Dutch (Standard) - Netherlands</p>"},"Constants.html#/c:@SDLLanguageEnAu":{"name":"SDLLanguageEnAu","abstract":"<p>English - Australia</p>"},"Constants.html#/c:@SDLLanguageZhCn":{"name":"SDLLanguageZhCn","abstract":"<p>Mandarin - China</p>"},"Constants.html#/c:@SDLLanguageZhTw":{"name":"SDLLanguageZhTw","abstract":"<p>Mandarin - Taiwan</p>"},"Constants.html#/c:@SDLLanguageJaJp":{"name":"SDLLanguageJaJp","abstract":"<p>Japanese - Japan</p>"},"Constants.html#/c:@SDLLanguageArSa":{"name":"SDLLanguageArSa","abstract":"<p>Arabic - Saudi Arabia</p>"},"Constants.html#/c:@SDLLanguageKoKr":{"name":"SDLLanguageKoKr","abstract":"<p>Korean - South Korea</p>"},"Constants.html#/c:@SDLLanguagePtBr":{"name":"SDLLanguagePtBr","abstract":"<p>Portuguese - Brazil</p>"},"Constants.html#/c:@SDLLanguageCsCz":{"name":"SDLLanguageCsCz","abstract":"<p>Czech - Czech Republic</p>"},"Constants.html#/c:@SDLLanguageDaDk":{"name":"SDLLanguageDaDk","abstract":"<p>Danish - Denmark</p>"},"Constants.html#/c:@SDLLanguageNoNo":{"name":"SDLLanguageNoNo","abstract":"<p>Norwegian - Norway</p>"},"Constants.html#/c:@SDLLayoutModeIconOnly":{"name":"SDLLayoutModeIconOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons.</p>"},"Constants.html#/c:@SDLLayoutModeIconWithSearch":{"name":"SDLLayoutModeIconWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeListOnly":{"name":"SDLLayoutModeListOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list.</p>"},"Constants.html#/c:@SDLLayoutModeListWithSearch":{"name":"SDLLayoutModeListWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeKeyboard":{"name":"SDLLayoutModeKeyboard","abstract":"<p>This mode causes the interaction to immediately display a keyboard entry through the HMI.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftHighBeam":{"name":"SDLLightNameFrontLeftHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightHighBeam":{"name":"SDLLightNameFrontRightHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftLowBeam":{"name":"SDLLightNameFrontLeftLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightLowBeam":{"name":"SDLLightNameFrontRightLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftParkingLight":{"name":"SDLLightNameFrontLeftParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightParkingLight":{"name":"SDLLightNameFrontRightParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftFogLight":{"name":"SDLLightNameFrontLeftFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightFogLight":{"name":"SDLLightNameFrontRightFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftDaytimeRunningLight":{"name":"SDLLightNameFrontLeftDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightDaytimeRunningLight":{"name":"SDLLightNameFrontRightDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftTurnLight":{"name":"SDLLightNameFrontLeftTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightTurnLight":{"name":"SDLLightNameFrontRightTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_Right_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftFogLight":{"name":"SDLLightNameRearLeftFogLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_FOG_LIGHT.</p>"},"Constants.html#/c:@SDLLightNameRearRightFogLight":{"name":"SDLLightNameRearRightFogLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTailLight":{"name":"SDLLightNameRearLeftTailLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTailLight":{"name":"SDLLightNameRearRightTailLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftBrakeLight":{"name":"SDLLightNameRearLeftBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightBrakeLight":{"name":"SDLLightNameRearRightBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTurnLight":{"name":"SDLLightNameRearLeftTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTurnLight":{"name":"SDLLightNameRearRightTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRegistrationPlateLight":{"name":"SDLLightNameRearRegistrationPlateLight","abstract":"<p>@abstract Represents the Light with name REAR_REGISTRATION_PLATE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameHighBeams":{"name":"SDLLightNameHighBeams","abstract":"<p>@abstract Include all high beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameLowBeams":{"name":"SDLLightNameLowBeams","abstract":"<p>@abstract Include all low beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameFogLights":{"name":"SDLLightNameFogLights","abstract":"<p>@abstract Include all fog lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRunningLights":{"name":"SDLLightNameRunningLights","abstract":"<p>@abstract Include all daytime running lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameParkingLights":{"name":"SDLLightNameParkingLights","abstract":"<p>@abstract Include all parking lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameBrakeLights":{"name":"SDLLightNameBrakeLights","abstract":"<p>@abstract Include all brake lights: rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRearReversingLights":{"name":"SDLLightNameRearReversingLights","abstract":"<p>@abstract Represents the Light with name REAR_REVERSING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameSideMarkerLights":{"name":"SDLLightNameSideMarkerLights","abstract":"<p>@abstract Represents the Light with name SIDE_MARKER_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameLeftTurnLights":{"name":"SDLLightNameLeftTurnLights","abstract":"<p>@abstract Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameRightTurnLights":{"name":"SDLLightNameRightTurnLights","abstract":"<p>@abstract Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameHazardLights":{"name":"SDLLightNameHazardLights","abstract":"<p>@abstract Include all hazard lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameAmbientLights":{"name":"SDLLightNameAmbientLights","abstract":"<p>@abstract Represents the Light with name AMBIENT_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameOverHeadLights":{"name":"SDLLightNameOverHeadLights","abstract":"<p>@abstract Represents the Light with name OVERHEAD_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameReadingLights":{"name":"SDLLightNameReadingLights","abstract":"<p>@abstract Represents the Light with name READING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameTrunkLights":{"name":"SDLLightNameTrunkLights","abstract":"<p>@abstract Represents the Light with name TRUNK_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameExteriorFrontLights":{"name":"SDLLightNameExteriorFrontLights","abstract":"<p>@abstract Include exterior lights located in front of the vehicle. For example, fog lights and low beams.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearLights":{"name":"SDLLightNameExteriorRearLights","abstract":"<p>@abstract Include exterior lights located at the back of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorLeftLights":{"name":"SDLLightNameExteriorLeftLights","abstract":"<p>@abstract Include exterior lights located at the left side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRightLights":{"name":"SDLLightNameExteriorRightLights","abstract":"<p>@abstract Include exterior lights located at the right side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRearCargoLights":{"name":"SDLLightNameExteriorRearCargoLights","abstract":"<p>@abstract Cargo lamps illuminate the cargo area.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTruckBedLights":{"name":"SDLLightNameExteriorRearTruckBedLights","abstract":"<p>@abstract Truck bed lamps light up the bed of the truck.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTrailerLights":{"name":"SDLLightNameExteriorRearTrailerLights","abstract":"<p>@abstract Trailer lights are lamps mounted on a trailer hitch.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftSpotLights":{"name":"SDLLightNameExteriorLeftSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the left side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightSpotLights":{"name":"SDLLightNameExteriorRightSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the right side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftPuddleLights":{"name":"SDLLightNameExteriorLeftPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightPuddleLights":{"name":"SDLLightNameExteriorRightPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorAllLights":{"name":"SDLLightNameExteriorAllLights","abstract":"<p>@abstract Include all exterior lights around the vehicle.</p>"},"Constants.html#/c:@SDLLightStatusOn":{"name":"SDLLightStatusOn","abstract":"<p>@abstract Light status currently on.</p>"},"Constants.html#/c:@SDLLightStatusOFF":{"name":"SDLLightStatusOFF","abstract":"<p>@abstract Light status currently Off.</p>"},"Constants.html#/c:@SDLLightStatusRampUp":{"name":"SDLLightStatusRampUp","abstract":"<p>@abstract Light status currently RAMP_UP.</p>"},"Constants.html#/c:@SDLLightStatusRampDown":{"name":"SDLLightStatusRampDown","abstract":"<p>@abstract Light status currently RAMP_DOWN.</p>"},"Constants.html#/c:@SDLLightStatusUnknown":{"name":"SDLLightStatusUnknown","abstract":"<p>@abstract Light status currently UNKNOWN.</p>"},"Constants.html#/c:@SDLLightStatusInvalid":{"name":"SDLLightStatusInvalid","abstract":"<p>@abstract Light status currently INVALID.</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNormal":{"name":"SDLMaintenanceModeStatusNormal","abstract":"<p>Maintenance Mode Status : Normal</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNear":{"name":"SDLMaintenanceModeStatusNear","abstract":"<p>Maintenance Mode Status : Near</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusActive":{"name":"SDLMaintenanceModeStatusActive","abstract":"<p>Maintenance Mode Status : Active</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusFeatureNotPresent":{"name":"SDLMaintenanceModeStatusFeatureNotPresent","abstract":"<p>Maintenance Mode Status : Feature not present</p>"},"Constants.html#/c:@SDLMassageCushionTopLumbar":{"name":"SDLMassageCushionTopLumbar","abstract":"<p>@abstract TOP LUMBAR cushions of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionMiddleLumbar":{"name":"SDLMassageCushionMiddleLumbar","abstract":"<p>@abstract MIDDLE LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBottomLumbar":{"name":"SDLMassageCushionBottomLumbar","abstract":"<p>@abstract BOTTOM LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBackBolsters":{"name":"SDLMassageCushionBackBolsters","abstract":"<p>@abstract BACK BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionSeatBolsters":{"name":"SDLMassageCushionSeatBolsters","abstract":"<p>@abstract SEAT BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageModeOff":{"name":"SDLMassageModeOff","abstract":"<p>@abstract Massage Mode Status : OFF</p>"},"Constants.html#/c:@SDLMassageModeLow":{"name":"SDLMassageModeLow","abstract":"<p>@abstract Massage Mode Status : LOW</p>"},"Constants.html#/c:@SDLMassageModeHigh":{"name":"SDLMassageModeHigh","abstract":"<p>@abstract Massage Mode Status : HIGH</p>"},"Constants.html#/c:@SDLMassageZoneLumbar":{"name":"SDLMassageZoneLumbar","abstract":"<p>@abstract The back of a multi-contour massage seat. or SEAT_BACK</p>"},"Constants.html#/c:@SDLMassageZoneSeatCushion":{"name":"SDLMassageZoneSeatCushion","abstract":"<p>@abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM</p>"},"Constants.html#/c:@SDLMediaClockFormatClock1":{"name":"SDLMediaClockFormatClock1","abstract":"<p>Media clock format: Clock1</p>"},"Constants.html#/c:@SDLMediaClockFormatClock2":{"name":"SDLMediaClockFormatClock2","abstract":"<p>Media clock format: Clock2</p>"},"Constants.html#/c:@SDLMediaClockFormatClock3":{"name":"SDLMediaClockFormatClock3","abstract":"<p>Media clock format: Clock3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText1":{"name":"SDLMediaClockFormatClockText1","abstract":"<p>Media clock format: ClockText1</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText2":{"name":"SDLMediaClockFormatClockText2","abstract":"<p>Media clock format: ClockText2</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText3":{"name":"SDLMediaClockFormatClockText3","abstract":"<p>Media clock format: ClockText3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText4":{"name":"SDLMediaClockFormatClockText4","abstract":"<p>Media clock format: ClockText4</p>"},"Constants.html#/c:@SDLMediaTypeMusic":{"name":"SDLMediaTypeMusic","abstract":"<p>The app will have a media type of music.</p>"},"Constants.html#/c:@SDLMediaTypePodcast":{"name":"SDLMediaTypePodcast","abstract":"<p>The app will have a media type of podcast.</p>"},"Constants.html#/c:@SDLMediaTypeAudiobook":{"name":"SDLMediaTypeAudiobook","abstract":"<p>The app will have a media type of audiobook.</p>"},"Constants.html#/c:@SDLMediaTypeOther":{"name":"SDLMediaTypeOther","abstract":"<p>The app will have a media type of other.</p>"},"Constants.html#/c:@SDLMenuLayoutList":{"name":"SDLMenuLayoutList","abstract":"<p>The menu should be laid out in a scrollable list format with one menu cell below the previous, each is stretched across the view</p>"},"Constants.html#/c:@SDLMenuLayoutTiles":{"name":"SDLMenuLayoutTiles","abstract":"<p>The menu should be laid out in a scrollable tiles format with each menu cell laid out in a square-ish format next to each other horizontally</p>"},"Constants.html#/c:@SDLMetadataTypeMediaTitle":{"name":"SDLMetadataTypeMediaTitle","abstract":"<p>The song / media title name</p>"},"Constants.html#/c:@SDLMetadataTypeMediaArtist":{"name":"SDLMetadataTypeMediaArtist","abstract":"<p>The &ldquo;artist&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaAlbum":{"name":"SDLMetadataTypeMediaAlbum","abstract":"<p>The &ldquo;album&rdquo; of the media&quot;</p>"},"Constants.html#/c:@SDLMetadataTypeMediaYear":{"name":"SDLMetadataTypeMediaYear","abstract":"<p>The &ldquo;year&rdquo; that the media was created</p>"},"Constants.html#/c:@SDLMetadataTypeMediaGenre":{"name":"SDLMetadataTypeMediaGenre","abstract":"<p>The &ldquo;genre&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaStation":{"name":"SDLMetadataTypeMediaStation","abstract":"<p>The &ldquo;station&rdquo; that the media is playing on</p>"},"Constants.html#/c:@SDLMetadataTypeRating":{"name":"SDLMetadataTypeRating","abstract":"<p>The &ldquo;rating&rdquo; given to the media</p>"},"Constants.html#/c:@SDLMetadataTypeCurrentTemperature":{"name":"SDLMetadataTypeCurrentTemperature","abstract":"<p>The current temperature of the weather information</p>"},"Constants.html#/c:@SDLMetadataTypeMaximumTemperature":{"name":"SDLMetadataTypeMaximumTemperature","abstract":"<p>The high / maximum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeMinimumTemperature":{"name":"SDLMetadataTypeMinimumTemperature","abstract":"<p>The low / minimum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeWeatherTerm":{"name":"SDLMetadataTypeWeatherTerm","abstract":"<p>A description of the weather for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeHumidity":{"name":"SDLMetadataTypeHumidity","abstract":"<p>The humidity of the weather information for the current period</p>"},"Constants.html#/c:@SDLModuleTypeClimate":{"name":"SDLModuleTypeClimate","abstract":"<p>A SDLModuleType with the value of <em>CLIMATE</em></p>"},"Constants.html#/c:@SDLModuleTypeRadio":{"name":"SDLModuleTypeRadio","abstract":"<p>A SDLModuleType with the value of <em>RADIO</em></p>"},"Constants.html#/c:@SDLModuleTypeSeat":{"name":"SDLModuleTypeSeat","abstract":"<p>A SDLModuleType with the value of <em>SEAT</em></p>"},"Constants.html#/c:@SDLModuleTypeAudio":{"name":"SDLModuleTypeAudio","abstract":"<p>A SDLModuleType with the value of <em>AUDIO</em></p>"},"Constants.html#/c:@SDLModuleTypeLight":{"name":"SDLModuleTypeLight","abstract":"<p>A SDLModuleType with the value of <em>LIGHT</em></p>"},"Constants.html#/c:@SDLModuleTypeHMISettings":{"name":"SDLModuleTypeHMISettings","abstract":"<p>A SDLModuleType with the value of <em>HMI_SETTINGS</em></p>"},"Constants.html#/c:@SDLNavigationActionTurn":{"name":"SDLNavigationActionTurn","abstract":"<p>Using this action plus a supplied direction can give the type of turn.</p>"},"Constants.html#/c:@SDLNavigationActionExit":{"name":"SDLNavigationActionExit","abstract":"<p>A navigation action of exit.</p>"},"Constants.html#/c:@SDLNavigationActionStay":{"name":"SDLNavigationActionStay","abstract":"<p>A navigation action of stay.</p>"},"Constants.html#/c:@SDLNavigationActionMerge":{"name":"SDLNavigationActionMerge","abstract":"<p>A navigation action of merge.</p>"},"Constants.html#/c:@SDLNavigationActionFerry":{"name":"SDLNavigationActionFerry","abstract":"<p>A navigation action of ferry.</p>"},"Constants.html#/c:@SDLNavigationActionCarShuttleTrain":{"name":"SDLNavigationActionCarShuttleTrain","abstract":"<p>A navigation action of car shuttle train.</p>"},"Constants.html#/c:@SDLNavigationActionWaypoint":{"name":"SDLNavigationActionWaypoint","abstract":"<p>A navigation action of waypoint.</p>"},"Constants.html#/c:@SDLNavigationJunctionRegular":{"name":"SDLNavigationJunctionRegular","abstract":"<p>A junction that represents a standard intersection with a single road crossing another.</p>"},"Constants.html#/c:@SDLNavigationJunctionBifurcation":{"name":"SDLNavigationJunctionBifurcation","abstract":"<p>A junction where the road splits off into two paths; a fork in the road.</p>"},"Constants.html#/c:@SDLNavigationJunctionMultiCarriageway":{"name":"SDLNavigationJunctionMultiCarriageway","abstract":"<p>A junction that has multiple intersections and paths.</p>"},"Constants.html#/c:@SDLNavigationJunctionRoundabout":{"name":"SDLNavigationJunctionRoundabout","abstract":"<p>A junction where traffic moves in a single direction around a central, non-traversable point to reach one of the connecting roads.</p>"},"Constants.html#/c:@SDLNavigationJunctionTraversableRoundabout":{"name":"SDLNavigationJunctionTraversableRoundabout","abstract":"<p>Similar to a roundabout, however the center of the roundabout is fully traversable. Also known as a mini-roundabout.</p>"},"Constants.html#/c:@SDLNavigationJunctionJughandle":{"name":"SDLNavigationJunctionJughandle","abstract":"<p>A junction where lefts diverge to the right, then curve to the left, converting a left turn to a crossing maneuver.</p>"},"Constants.html#/c:@SDLNavigationJunctionAllWayYield":{"name":"SDLNavigationJunctionAllWayYield","abstract":"<p>Multiple way intersection that allows traffic to flow based on priority; most commonly right of way and first in, first out.</p>"},"Constants.html#/c:@SDLNavigationJunctionTurnAround":{"name":"SDLNavigationJunctionTurnAround","abstract":"<p>A junction designated for traffic turn arounds.</p>"},"Constants.html#/c:@SDLNotificationUserInfoObject":{"name":"SDLNotificationUserInfoObject","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userinfo dictionary.</p>"},"Constants.html#/c:@SDLTransportDidDisconnect":{"name":"SDLTransportDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLTransportDidConnect":{"name":"SDLTransportDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLTransportConnectError":{"name":"SDLTransportConnectError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidDisconnect":{"name":"SDLRPCServiceDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidConnect":{"name":"SDLRPCServiceDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLRPCServiceConnectionDidError":{"name":"SDLRPCServiceConnectionDidError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLDidReceiveError":{"name":"SDLDidReceiveError","abstract":"<p>Name for a general error notification</p>"},"Constants.html#/c:@SDLDidReceiveLockScreenIcon":{"name":"SDLDidReceiveLockScreenIcon","abstract":"<p>Name for an incoming lock screen icon notification</p>"},"Constants.html#/c:@SDLDidBecomeReady":{"name":"SDLDidBecomeReady","abstract":"<p>Name for an SDL became ready notification</p>"},"Constants.html#/c:@SDLDidUpdateProjectionView":{"name":"SDLDidUpdateProjectionView","abstract":"<p>Name for a notification sent by the user when their CarWindow view has been updated</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandResponse":{"name":"SDLDidReceiveAddCommandResponse","abstract":"<p>Name for an AddCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuResponse":{"name":"SDLDidReceiveAddSubMenuResponse","abstract":"<p>Name for an AddSubMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertResponse":{"name":"SDLDidReceiveAlertResponse","abstract":"<p>Name for an Alert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverResponse":{"name":"SDLDidReceiveAlertManeuverResponse","abstract":"<p>Name for an AlertManeuver response RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressResponse":{"name":"SDLDidReceiveButtonPressResponse","abstract":"<p>Name for an ButtonPress response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionResponse":{"name":"SDLDidReceiveCancelInteractionResponse","abstract":"<p>Name for aa CancelInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse":{"name":"SDLDidReceiveChangeRegistrationResponse","abstract":"<p>Name for a ChangeRegistration response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationResponse":{"name":"SDLDidReceiveCloseApplicationResponse","abstract":"<p>Name for a CloseApplication response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse":{"name":"SDLDidReceiveCreateInteractionChoiceSetResponse","abstract":"<p>Name for a CreateInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowResponse":{"name":"SDLDidReceiveCreateWindowResponse","abstract":"<p>Name for a CreateWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandResponse":{"name":"SDLDidReceiveDeleteCommandResponse","abstract":"<p>Name for a DeleteCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileResponse":{"name":"SDLDidReceiveDeleteFileResponse","abstract":"<p>Name for a DeleteFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse":{"name":"SDLDidReceiveDeleteInteractionChoiceSetResponse","abstract":"<p>Name for a DeleteInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse":{"name":"SDLDidReceiveDeleteSubmenuResponse","abstract":"<p>Name for a DeleteSubmenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowResponse":{"name":"SDLDidReceiveDeleteWindowResponse","abstract":"<p>Name for a DeleteWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse":{"name":"SDLDidReceiveDiagnosticMessageResponse","abstract":"<p>Name for a DiagnosticMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberResponse":{"name":"SDLDidReceiveDialNumberResponse","abstract":"<p>Name for a DialNumber response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse":{"name":"SDLDidReceiveEncodedSyncPDataResponse","abstract":"<p>Name for an EncodedSyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse":{"name":"SDLDidReceiveEndAudioPassThruResponse","abstract":"<p>Name for an EndAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGenericResponse":{"name":"SDLDidReceiveGenericResponse","abstract":"<p>Name for a Generic response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesResponse":{"name":"SDLDidReceiveGetCloudAppPropertiesResponse","abstract":"<p>Name for a GetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataResponse":{"name":"SDLDidReceiveGetAppServiceDataResponse","abstract":"<p>Name for a GetAppServiceData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsResponse":{"name":"SDLDidReceiveGetDTCsResponse","abstract":"<p>Name for a GetDTCs response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileResponse":{"name":"SDLDidReceiveGetFileResponse","abstract":"<p>Name for a GetFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataResponse","abstract":"<p>Name for a GetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentResponse","abstract":"<p>Name for a GetInteriorVehicleDataConsent response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilitiesResponse":{"name":"SDLDidReceiveGetSystemCapabilitiesResponse","abstract":"<p>Name for a GetSystemCapabilities response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse":{"name":"SDLDidReceiveGetVehicleDataResponse","abstract":"<p>Name for a GetVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWaypointsResponse":{"name":"SDLDidReceiveGetWaypointsResponse","abstract":"<p>Name for a GetWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesResponse":{"name":"SDLDidReceiveListFilesResponse","abstract":"<p>Name for a ListFiles response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionResponse":{"name":"SDLDidReceivePerformAppServiceInteractionResponse","abstract":"<p>Name for a PerformAppServiceInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse":{"name":"SDLDidReceivePerformAudioPassThruResponse","abstract":"<p>Name for a PerformAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionResponse":{"name":"SDLDidReceivePerformInteractionResponse","abstract":"<p>Name for a PerformInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceResponse":{"name":"SDLDidReceivePublishAppServiceResponse","abstract":"<p>Name for a PublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileResponse":{"name":"SDLDidReceivePutFileResponse","abstract":"<p>Name for a ReceivePutFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDResponse":{"name":"SDLDidReceiveReadDIDResponse","abstract":"<p>Name for a ReceiveReadDID response RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse":{"name":"SDLDidReceiveRegisterAppInterfaceResponse","abstract":"<p>Name for a RegisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleResponse":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Name for a ReleaseInteriorVehicleDataModule response RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse":{"name":"SDLDidReceiveResetGlobalPropertiesResponse","abstract":"<p>Name for a ResetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageResponse":{"name":"SDLDidReceiveScrollableMessageResponse","abstract":"<p>Name for a ScrollableMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataResponse":{"name":"SDLDidReceiveSendHapticDataResponse","abstract":"<p>Name for a SendHapticData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationResponse":{"name":"SDLDidReceiveSendLocationResponse","abstract":"<p>Name for a SendLocation response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconResponse":{"name":"SDLDidReceiveSetAppIconResponse","abstract":"<p>Name for a SetAppIcon response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesResponse":{"name":"SDLDidReceiveSetCloudAppPropertiesResponse","abstract":"<p>Name for a SetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse":{"name":"SDLDidReceiveSetDisplayLayoutResponse","abstract":"<p>Name for a SetDisplayLayout response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse":{"name":"SDLDidReceiveSetGlobalPropertiesResponse","abstract":"<p>Name for a SetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataResponse":{"name":"SDLDidReceiveSetInteriorVehicleDataResponse","abstract":"<p>Name for a SetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse":{"name":"SDLDidReceiveSetMediaClockTimerResponse","abstract":"<p>Name for a SetMediaClockTimer response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse":{"name":"SDLDidReceiveShowConstantTBTResponse","abstract":"<p>Name for a ShowConstantTBT response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowResponse":{"name":"SDLDidReceiveShowResponse","abstract":"<p>Name for a Show response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuResponse":{"name":"SDLDidReceiveShowAppMenuResponse","abstract":"<p>Name for a ShowAppMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderResponse":{"name":"SDLDidReceiveSliderResponse","abstract":"<p>Name for a Slider response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakResponse":{"name":"SDLDidReceiveSpeakResponse","abstract":"<p>Name for a Speak response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse":{"name":"SDLDidReceiveSubscribeButtonResponse","abstract":"<p>Name for a SubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse":{"name":"SDLDidReceiveSubscribeVehicleDataResponse","abstract":"<p>Name for a SubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWaypointsResponse":{"name":"SDLDidReceiveSubscribeWaypointsResponse","abstract":"<p>Name for a SubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertResponse":{"name":"SDLDidReceiveSubtleAlertResponse","abstract":"<p>Name for a SubtleAlert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"<p>Name for a SyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestResponse":{"name":"SDLDidReceiveSystemRequestResponse","abstract":"<p>Name for a SystemRequest response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse":{"name":"SDLDidReceiveUpdateTurnListResponse","abstract":"<p>Name for an UpdateTurnList response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceResponse":{"name":"SDLDidReceiveUnpublishAppServiceResponse","abstract":"<p>Name for an UnpublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse":{"name":"SDLDidReceiveUnregisterAppInterfaceResponse","abstract":"<p>Name for an UnregisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse":{"name":"SDLDidReceiveUnsubscribeButtonResponse","abstract":"<p>Name for an UnsubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse":{"name":"SDLDidReceiveUnsubscribeVehicleDataResponse","abstract":"<p>Name for an UnsubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWaypointsResponse":{"name":"SDLDidReceiveUnsubscribeWaypointsResponse","abstract":"<p>Name for an UnsubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandRequest":{"name":"SDLDidReceiveAddCommandRequest","abstract":"<p>Name for an AddCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuRequest":{"name":"SDLDidReceiveAddSubMenuRequest","abstract":"<p>Name for an AddSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertRequest":{"name":"SDLDidReceiveAlertRequest","abstract":"<p>Name for an Alert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverRequest":{"name":"SDLDidReceiveAlertManeuverRequest","abstract":"<p>Name for an AlertManeuver request RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressRequest":{"name":"SDLDidReceiveButtonPressRequest","abstract":"<p>Name for a ButtonPress request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionRequest":{"name":"SDLDidReceiveCancelInteractionRequest","abstract":"<p>Name for a CancelInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationRequest":{"name":"SDLDidReceiveChangeRegistrationRequest","abstract":"<p>Name for a ChangeRegistration request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationRequest":{"name":"SDLDidReceiveCloseApplicationRequest","abstract":"<p>Name for a CloseApplication request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetRequest":{"name":"SDLDidReceiveCreateInteractionChoiceSetRequest","abstract":"<p>Name for a CreateInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowRequest":{"name":"SDLDidReceiveCreateWindowRequest","abstract":"<p>Name for a CreateWindow request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandRequest":{"name":"SDLDidReceiveDeleteCommandRequest","abstract":"<p>Name for a DeleteCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileRequest":{"name":"SDLDidReceiveDeleteFileRequest","abstract":"<p>Name for a DeleteFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetRequest":{"name":"SDLDidReceiveDeleteInteractionChoiceSetRequest","abstract":"<p>Name for a DeleteInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubMenuRequest":{"name":"SDLDidReceiveDeleteSubMenuRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowRequest":{"name":"SDLDidReceiveDeleteWindowRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageRequest":{"name":"SDLDidReceiveDiagnosticMessageRequest","abstract":"<p>Name for a DiagnosticMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberRequest":{"name":"SDLDidReceiveDialNumberRequest","abstract":"<p>Name for a DialNumberR request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataRequest":{"name":"SDLDidReceiveEncodedSyncPDataRequest","abstract":"<p>Name for an EncodedSyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruRequest":{"name":"SDLDidReceiveEndAudioPassThruRequest","abstract":"<p>Name for a EndAudioPass request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataRequest":{"name":"SDLDidReceiveGetAppServiceDataRequest","abstract":"<p>Name for a GetAppServiceData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesRequest":{"name":"SDLDidReceiveGetCloudAppPropertiesRequest","abstract":"<p>Name for a GetCloudAppProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsRequest":{"name":"SDLDidReceiveGetDTCsRequest","abstract":"<p>Name for a ReceiveGetDTCs request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileRequest":{"name":"SDLDidReceiveGetFileRequest","abstract":"<p>Name for a GetFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataRequest","abstract":"<p>Name for a GetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentRequest","abstract":"<p>Name for a GetInteriorVehicleDataConsent request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilityRequest":{"name":"SDLDidReceiveGetSystemCapabilityRequest","abstract":"<p>Name for a GetSystemCapability request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataRequest":{"name":"SDLDidReceiveGetVehicleDataRequest","abstract":"<p>Name for a GetVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWayPointsRequest":{"name":"SDLDidReceiveGetWayPointsRequest","abstract":"<p>Name for a GetWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesRequest":{"name":"SDLDidReceiveListFilesRequest","abstract":"<p>Name for a ListFiles request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionRequest":{"name":"SDLDidReceivePerformAppServiceInteractionRequest","abstract":"<p>Name for a PerformAppServiceInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruRequest":{"name":"SDLDidReceivePerformAudioPassThruRequest","abstract":"<p>Name for a PerformAudioPassThru request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionRequest":{"name":"SDLDidReceivePerformInteractionRequest","abstract":"<p>Name for a PerformInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceRequest":{"name":"SDLDidReceivePublishAppServiceRequest","abstract":"<p>Name for a PublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileRequest":{"name":"SDLDidReceivePutFileRequest","abstract":"<p>Name for a PutFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDRequest":{"name":"SDLDidReceiveReadDIDRequest","abstract":"<p>Name for a ReadDID request RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceRequest":{"name":"SDLDidReceiveRegisterAppInterfaceRequest","abstract":"<p>Name for a RegisterAppInterfacr request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleRequest":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleRequest","abstract":"<p>Name for a ReleaseInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesRequest":{"name":"SDLDidReceiveResetGlobalPropertiesRequest","abstract":"<p>Name for a ResetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageRequest":{"name":"SDLDidReceiveScrollableMessageRequest","abstract":"<p>Name for a ScrollableMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataRequest":{"name":"SDLDidReceiveSendHapticDataRequest","abstract":"<p>Name for a SendHapticData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationRequest":{"name":"SDLDidReceiveSendLocationRequest","abstract":"<p>Name for a SendLocation request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconRequest":{"name":"SDLDidReceiveSetAppIconRequest","abstract":"<p>Name for a SetAppIcon request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesRequest":{"name":"SDLDidReceiveSetCloudAppPropertiesRequest","abstract":"<p>Name for a SetCloudProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutRequest":{"name":"SDLDidReceiveSetDisplayLayoutRequest","abstract":"<p>Name for a SetDisplayLayout request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesRequest":{"name":"SDLDidReceiveSetGlobalPropertiesRequest","abstract":"<p>Name for a SetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataRequest":{"name":"SDLDidReceiveSetInteriorVehicleDataRequest","abstract":"<p>Name for a SetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerRequest":{"name":"SDLDidReceiveSetMediaClockTimerRequest","abstract":"<p>Name for a SetMediaClockTimer request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowRequest":{"name":"SDLDidReceiveShowRequest","abstract":"<p>Name for a Show request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuRequest":{"name":"SDLDidReceiveShowAppMenuRequest","abstract":"<p>Name for a ShowAppMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTRequest":{"name":"SDLDidReceiveShowConstantTBTRequest","abstract":"<p>Name for a ShowConstantTBT request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderRequest":{"name":"SDLDidReceiveSliderRequest","abstract":"<p>Name for a Slider request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakRequest":{"name":"SDLDidReceiveSpeakRequest","abstract":"<p>Name for a Speak request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonRequest":{"name":"SDLDidReceiveSubscribeButtonRequest","abstract":"<p>Name for a SubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataRequest":{"name":"SDLDidReceiveSubscribeVehicleDataRequest","abstract":"<p>Name for a SubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWayPointsRequest":{"name":"SDLDidReceiveSubscribeWayPointsRequest","abstract":"<p>Name for a SubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertRequest":{"name":"SDLDidReceiveSubtleAlertRequest","abstract":"<p>Name for a SubtleAlert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataRequest":{"name":"SDLDidReceiveSyncPDataRequest","abstract":"<p>Name for a SyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestRequest":{"name":"SDLDidReceiveSystemRequestRequest","abstract":"<p>Name for a SystemRequest request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceRequest":{"name":"SDLDidReceiveUnpublishAppServiceRequest","abstract":"<p>Name for an UnpublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceRequest":{"name":"SDLDidReceiveUnregisterAppInterfaceRequest","abstract":"<p>Name for an UnregisterAppInterface request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonRequest":{"name":"SDLDidReceiveUnsubscribeButtonRequest","abstract":"<p>Name for an UnsubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataRequest":{"name":"SDLDidReceiveUnsubscribeVehicleDataRequest","abstract":"<p>Name for an UnsubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWayPointsRequest":{"name":"SDLDidReceiveUnsubscribeWayPointsRequest","abstract":"<p>Name for an UnsubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListRequest":{"name":"SDLDidReceiveUpdateTurnListRequest","abstract":"<p>Name for an UpdateTurnList request RPC</p>"},"Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification":{"name":"SDLDidChangeDriverDistractionStateNotification","abstract":"<p>Name for a DriverDistractionState notification RPC</p>"},"Constants.html#/c:@SDLDidChangeHMIStatusNotification":{"name":"SDLDidChangeHMIStatusNotification","abstract":"<p>Name for a HMIStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppServiceDataNotification":{"name":"SDLDidReceiveAppServiceDataNotification","abstract":"<p>Name for an AppServiceData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification":{"name":"SDLDidReceiveAppUnregisteredNotification","abstract":"<p>Name for an AppUnregistered notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAudioPassThruNotification":{"name":"SDLDidReceiveAudioPassThruNotification","abstract":"<p>Name for an AudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonEventNotification":{"name":"SDLDidReceiveButtonEventNotification","abstract":"<p>Name for a ButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressNotification":{"name":"SDLDidReceiveButtonPressNotification","abstract":"<p>Name for a ButtonPress notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveCommandNotification":{"name":"SDLDidReceiveCommandNotification","abstract":"<p>Name for a Command notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedDataNotification":{"name":"SDLDidReceiveEncodedDataNotification","abstract":"<p>Name for a EncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveInteriorVehicleDataNotification":{"name":"SDLDidReceiveInteriorVehicleDataNotification","abstract":"<p>Name for a InteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveKeyboardInputNotification":{"name":"SDLDidReceiveKeyboardInputNotification","abstract":"<p>Name for a KeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLDidChangeLanguageNotification":{"name":"SDLDidChangeLanguageNotification","abstract":"<p>Name for a Language notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveNewHashNotification":{"name":"SDLDidReceiveNewHashNotification","abstract":"<p>Name for a NewHash notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleIconNotification":{"name":"SDLDidReceiveVehicleIconNotification","abstract":"<p>Name for a VehicleIcon notification RPC</p>"},"Constants.html#/c:@SDLDidChangePermissionsNotification":{"name":"SDLDidChangePermissionsNotification","abstract":"<p>Name for a ChangePermissions notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertPressedNotification":{"name":"SDLDidReceiveSubtleAlertPressedNotification","abstract":"<p>Name for a SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveRemoteControlStatusNotification":{"name":"SDLDidReceiveRemoteControlStatusNotification","abstract":"<p>Name for a RemoteControlStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataNotification":{"name":"SDLDidReceiveSyncPDataNotification","abstract":"<p>Name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemCapabilityUpdatedNotification":{"name":"SDLDidReceiveSystemCapabilityUpdatedNotification","abstract":"<p>Name for a SystemCapability notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestNotification":{"name":"SDLDidReceiveSystemRequestNotification","abstract":"<p>Name for a SystemRequest notification RPC</p>"},"Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification":{"name":"SDLDidChangeTurnByTurnStateNotification","abstract":"<p>Name for a TurnByTurnStat notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveTouchEventNotification":{"name":"SDLDidReceiveTouchEventNotification","abstract":"<p>Name for a TouchEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateFileNotification":{"name":"SDLDidReceiveUpdateFileNotification","abstract":"<p>Name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateSubMenuNotification":{"name":"SDLDidReceiveUpdateSubMenuNotification","abstract":"<p>Name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleDataNotification":{"name":"SDLDidReceiveVehicleDataNotification","abstract":"<p>Name for a VehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveWaypointNotification":{"name":"SDLDidReceiveWaypointNotification","abstract":"<p>Name for a Waypoint notification RPC</p>"},"Constants.html#/c:@SDLPRNDLPark":{"name":"SDLPRNDLPark","abstract":"<p>Park</p>"},"Constants.html#/c:@SDLPRNDLReverse":{"name":"SDLPRNDLReverse","abstract":"<p>Reverse gear</p>"},"Constants.html#/c:@SDLPRNDLNeutral":{"name":"SDLPRNDLNeutral","abstract":"<p>No gear</p>"},"Constants.html#/c:@SDLPRNDLDrive":{"name":"SDLPRNDLDrive","abstract":"<p>@abstract: Drive gear</p>"},"Constants.html#/c:@SDLPRNDLSport":{"name":"SDLPRNDLSport","abstract":"<p>Drive Sport mode</p>"},"Constants.html#/c:@SDLPRNDLLowGear":{"name":"SDLPRNDLLowGear","abstract":"<p>1st gear hold</p>"},"Constants.html#/c:@SDLPRNDLFirst":{"name":"SDLPRNDLFirst","abstract":"<p>First gear</p>"},"Constants.html#/c:@SDLPRNDLNinth":{"name":"SDLPRNDLNinth","abstract":"<p>Ninth gear"},"Constants.html#/c:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"<p>Second gear</p>"},"Constants.html#/c:@SDLPRNDLTenth":{"name":"SDLPRNDLTenth","abstract":"<p>Tenth gear"},"Constants.html#/c:@SDLPRNDLThird":{"name":"SDLPRNDLThird","abstract":"<p>Third gear</p>"},"Constants.html#/c:@SDLPRNDLFourth":{"name":"SDLPRNDLFourth","abstract":"<p>Fourth gear</p>"},"Constants.html#/c:@SDLPRNDLFifth":{"name":"SDLPRNDLFifth","abstract":"<p>Fifth gear</p>"},"Constants.html#/c:@SDLPRNDLSixth":{"name":"SDLPRNDLSixth","abstract":"<p>Sixth gear</p>"},"Constants.html#/c:@SDLPRNDLSeventh":{"name":"SDLPRNDLSeventh","abstract":"<p>Seventh gear</p>"},"Constants.html#/c:@SDLPRNDLEighth":{"name":"SDLPRNDLEighth","abstract":"<p>Eighth gear</p>"},"Constants.html#/c:@SDLPRNDLUnknown":{"name":"SDLPRNDLUnknown","abstract":"<p>Unknown</p>"},"Constants.html#/c:@SDLPRNDLFault":{"name":"SDLPRNDLFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLPermissionStatusAllowed":{"name":"SDLPermissionStatusAllowed","abstract":"<p>permission: allowed</p>"},"Constants.html#/c:@SDLPermissionStatusDisallowed":{"name":"SDLPermissionStatusDisallowed","abstract":"<p>permission: disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserDisallowed":{"name":"SDLPermissionStatusUserDisallowed","abstract":"<p>permission: user disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserConsentPending":{"name":"SDLPermissionStatusUserConsentPending","abstract":"<p>permission: user consent pending</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusUndefined":{"name":"SDLPowerModeQualificationStatusUndefined","abstract":"<p>An undefined status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusEvaluationInProgress":{"name":"SDLPowerModeQualificationStatusEvaluationInProgress","abstract":"<p>An &ldquo;evaluation in progress&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusNotDefined":{"name":"SDLPowerModeQualificationStatusNotDefined","abstract":"<p>A &ldquo;not defined&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusOk":{"name":"SDLPowerModeQualificationStatusOk","abstract":"<p>An &ldquo;ok&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyOut":{"name":"SDLPowerModeStatusKeyOut","abstract":"<p>The key is not in the ignition, and the power is off</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyRecentlyOut":{"name":"SDLPowerModeStatusKeyRecentlyOut","abstract":"<p>The key is not in the ignition and it was just recently removed</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyApproved":{"name":"SDLPowerModeStatusKeyApproved","abstract":"<p>The key is not in the ignition, but an approved key is available</p>"},"Constants.html#/c:@SDLPowerModeStatusPostAccessory":{"name":"SDLPowerModeStatusPostAccessory","abstract":"<p>We are in a post-accessory power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusAccessory":{"name":"SDLPowerModeStatusAccessory","abstract":"<p>The car is in accessory power mode</p>"},"Constants.html#/c:@SDLPowerModeStatusPostIgnition":{"name":"SDLPowerModeStatusPostIgnition","abstract":"<p>We are in a post-ignition power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusIgnitionOn":{"name":"SDLPowerModeStatusIgnitionOn","abstract":"<p>The ignition is on but the car is not yet running</p>"},"Constants.html#/c:@SDLPowerModeStatusRunning":{"name":"SDLPowerModeStatusRunning","abstract":"<p>The ignition is on and the car is running</p>"},"Constants.html#/c:@SDLPowerModeStatusCrank":{"name":"SDLPowerModeStatusCrank","abstract":"<p>We are in a crank power situation</p>"},"Constants.html#/c:@SDLPredefinedLayoutDefault":{"name":"SDLPredefinedLayoutDefault","abstract":"<p>A default layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutMedia":{"name":"SDLPredefinedLayoutMedia","abstract":"<p>The default media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutNonMedia":{"name":"SDLPredefinedLayoutNonMedia","abstract":"<p>The default non-media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutOnscreenPresets":{"name":"SDLPredefinedLayoutOnscreenPresets","abstract":"<p>A media layout containing preset buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationFullscreenMap":{"name":"SDLPredefinedLayoutNavigationFullscreenMap","abstract":"<p>The default navigation layout with a fullscreen map</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationList":{"name":"SDLPredefinedLayoutNavigationList","abstract":"<p>A list layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationKeyboard":{"name":"SDLPredefinedLayoutNavigationKeyboard","abstract":"<p>A keyboard layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithText":{"name":"SDLPredefinedLayoutGraphicWithText","abstract":"<p>A layout with a single graphic on the left and text on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextWithGraphic":{"name":"SDLPredefinedLayoutTextWithGraphic","abstract":"<p>A layout with text on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesOnly":{"name":"SDLPredefinedLayoutTilesOnly","abstract":"<p>A layout with only softbuttons placed in a tile layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsOnly":{"name":"SDLPredefinedLayoutTextButtonsOnly","abstract":"<p>A layout with only soft buttons that only accept text</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTiles":{"name":"SDLPredefinedLayoutGraphicWithTiles","abstract":"<p>A layout with a single graphic on the left and soft buttons in a tile layout on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesWithGraphic":{"name":"SDLPredefinedLayoutTilesWithGraphic","abstract":"<p>A layout with soft buttons in a tile layout on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextAndSoftButtons":{"name":"SDLPredefinedLayoutGraphicWithTextAndSoftButtons","abstract":"<p>A layout with a single graphic on the left and both text and soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextAndSoftButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextAndSoftButtonsWithGraphic","abstract":"<p>A layout with both text and soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextButtons":{"name":"SDLPredefinedLayoutGraphicWithTextButtons","abstract":"<p>A layout with a single graphic on the left and text-only soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextButtonsWithGraphic","abstract":"<p>A layout with text-only soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutLargeGraphicWithSoftButtons","abstract":"<p>A layout with a single large graphic and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutDoubleGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutDoubleGraphicWithSoftButtons","abstract":"<p>A layout with two graphics and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicOnly":{"name":"SDLPredefinedLayoutLargeGraphicOnly","abstract":"<p>A layout with only a single large graphic</p>"},"Constants.html#/c:@SDLPredefinedLayoutWebView":{"name":"SDLPredefinedLayoutWebView","abstract":"<p>Custom root template allowing in-vehicle WebEngine applications with"},"Constants.html#/c:@SDLPrerecordedSpeechHelp":{"name":"SDLPrerecordedSpeechHelp","abstract":"<p>A prerecorded help prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechInitial":{"name":"SDLPrerecordedSpeechInitial","abstract":"<p>A prerecorded initial prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechListen":{"name":"SDLPrerecordedSpeechListen","abstract":"<p>A prerecorded listen prompt is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechPositive":{"name":"SDLPrerecordedSpeechPositive","abstract":"<p>A prerecorded positive indicator noise is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechNegative":{"name":"SDLPrerecordedSpeechNegative","abstract":"<p>A prerecorded negative indicator noise is available</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceNoSourceSelected":{"name":"SDLPrimaryAudioSourceNoSourceSelected","abstract":"<p>Currently no source selected</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB":{"name":"SDLPrimaryAudioSourceUSB","abstract":"<p>USB is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB2":{"name":"SDLPrimaryAudioSourceUSB2","abstract":"<p>USB2 is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceBluetoothStereo":{"name":"SDLPrimaryAudioSourceBluetoothStereo","abstract":"<p>Bluetooth Stereo is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceLineIn":{"name":"SDLPrimaryAudioSourceLineIn","abstract":"<p>Line in is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceIpod":{"name":"SDLPrimaryAudioSourceIpod","abstract":"<p>iPod is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceMobileApp":{"name":"SDLPrimaryAudioSourceMobileApp","abstract":"<p>Mobile app is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceCD":{"name":"SDLPrimaryAudioSourceCD","abstract":"<p>@abstract CD is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceAM":{"name":"SDLPrimaryAudioSourceAM","abstract":"<p>@abstract Radio frequency AM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceFM":{"name":"SDLPrimaryAudioSourceFM","abstract":"<p>@abstract Radio frequency FM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceXM":{"name":"SDLPrimaryAudioSourceXM","abstract":"<p>@abstract Radio frequency XM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceDAB":{"name":"SDLPrimaryAudioSourceDAB","abstract":"<p>@abstract Radio frequency DAB is current source</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddCommand":{"name":"SDLRPCFunctionNameAddCommand","abstract":"<p>Function name for an AddCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddSubMenu":{"name":"SDLRPCFunctionNameAddSubMenu","abstract":"<p>Function name for an AddSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlert":{"name":"SDLRPCFunctionNameAlert","abstract":"<p>Function name for an Alert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlertManeuver":{"name":"SDLRPCFunctionNameAlertManeuver","abstract":"<p>Function name for an AlertManeuver RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameButtonPress":{"name":"SDLRPCFunctionNameButtonPress","abstract":"<p>Function name for a ButtonPress RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCancelInteraction":{"name":"SDLRPCFunctionNameCancelInteraction","abstract":"<p>Function name for a CancelInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameChangeRegistration":{"name":"SDLRPCFunctionNameChangeRegistration","abstract":"<p>Function name for a ChangeRegistration RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCloseApplication":{"name":"SDLRPCFunctionNameCloseApplication","abstract":"<p>Function name for a CloseApplication RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateInteractionChoiceSet":{"name":"SDLRPCFunctionNameCreateInteractionChoiceSet","abstract":"<p>Function name for a CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteCommand":{"name":"SDLRPCFunctionNameDeleteCommand","abstract":"<p>Function name for a DeleteCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteFile":{"name":"SDLRPCFunctionNameDeleteFile","abstract":"<p>Function name for a DeleteFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteInteractionChoiceSet":{"name":"SDLRPCFunctionNameDeleteInteractionChoiceSet","abstract":"<p>Function name for a DeleteInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteSubMenu":{"name":"SDLRPCFunctionNameDeleteSubMenu","abstract":"<p>Function name for a DeleteSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDiagnosticMessage":{"name":"SDLRPCFunctionNameDiagnosticMessage","abstract":"<p>Function name for a DiagnosticMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDialNumber":{"name":"SDLRPCFunctionNameDialNumber","abstract":"<p>Function name for a DialNumber RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEncodedSyncPData":{"name":"SDLRPCFunctionNameEncodedSyncPData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEndAudioPassThru":{"name":"SDLRPCFunctionNameEndAudioPassThru","abstract":"<p>Function name for an EndAudioPassThru RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGenericResponse":{"name":"SDLRPCFunctionNameGenericResponse","abstract":"<p>Function name for an GenricResponse Response RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetAppServiceData":{"name":"SDLRPCFunctionNameGetAppServiceData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetDTCs":{"name":"SDLRPCFunctionNameGetDTCs","abstract":"<p>Function name for a GetDTCs RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetFile":{"name":"SDLRPCFunctionNameGetFile","abstract":"<p>Function name for a GetFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetCloudAppProperties":{"name":"SDLRPCFunctionNameGetCloudAppProperties","abstract":"<p>Function name for a GetCloudAppProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleData":{"name":"SDLRPCFunctionNameGetInteriorVehicleData","abstract":"<p>Function name for a GetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleDataConsent":{"name":"SDLRPCFunctionNameGetInteriorVehicleDataConsent","abstract":"<p>Function name for a GetInteriorVehicleDataConsent RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetSystemCapability":{"name":"SDLRPCFunctionNameGetSystemCapability","abstract":"<p>Function name for a GetSystemCapability RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetVehicleData":{"name":"SDLRPCFunctionNameGetVehicleData","abstract":"<p>Function name for a GetVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetWayPoints":{"name":"SDLRPCFunctionNameGetWayPoints","abstract":"<p>Function name for a GetWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameListFiles":{"name":"SDLRPCFunctionNameListFiles","abstract":"<p>Function name for a ListFiles RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppCapabilityUpdated":{"name":"SDLRPCFunctionNameOnAppCapabilityUpdated","abstract":"<p>Function name for an OnAppCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered":{"name":"SDLRPCFunctionNameOnAppInterfaceUnregistered","abstract":"<p>Function name for an OnAppInterfaceUnregistered notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppServiceData":{"name":"SDLRPCFunctionNameOnAppServiceData","abstract":"<p>Function name for an OnAppServiceData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAudioPassThru":{"name":"SDLRPCFunctionNameOnAudioPassThru","abstract":"<p>Function name for an OnAudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonEvent":{"name":"SDLRPCFunctionNameOnButtonEvent","abstract":"<p>Function name for an OnButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonPress":{"name":"SDLRPCFunctionNameOnButtonPress","abstract":"<p>Function name for an OnButtonPress notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnCommand":{"name":"SDLRPCFunctionNameOnCommand","abstract":"<p>Function name for an OnCommand notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnDriverDistraction":{"name":"SDLRPCFunctionNameOnDriverDistraction","abstract":"<p>Function name for an OnDriverDistraction notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnEncodedSyncPData":{"name":"SDLRPCFunctionNameOnEncodedSyncPData","abstract":"<p>Function name for an OnEncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHashChange":{"name":"SDLRPCFunctionNameOnHashChange","abstract":"<p>Function name for an OnHashChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHMIStatus":{"name":"SDLRPCFunctionNameOnHMIStatus","abstract":"<p>Function name for an OnHMIStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnInteriorVehicleData":{"name":"SDLRPCFunctionNameOnInteriorVehicleData","abstract":"<p>Function name for an OnInteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnKeyboardInput":{"name":"SDLRPCFunctionNameOnKeyboardInput","abstract":"<p>Function name for an OnKeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLanguageChange":{"name":"SDLRPCFunctionNameOnLanguageChange","abstract":"<p>Function name for an OnLanguageChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLockScreenStatus":{"name":"SDLRPCFunctionNameOnLockScreenStatus","abstract":"<p>Function name for an OnLockScreenStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnPermissionsChange":{"name":"SDLRPCFunctionNameOnPermissionsChange","abstract":"<p>Function name for an OnPermissionsChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnRCStatus":{"name":"SDLRPCFunctionNameOnRCStatus","abstract":"<p>Function name for an OnRCStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSubtleAlertPressed":{"name":"SDLRPCFunctionNameOnSubtleAlertPressed","abstract":"<p>Function name for an SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSyncPData":{"name":"SDLRPCFunctionNameOnSyncPData","abstract":"<p>Function name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemCapabilityUpdated":{"name":"SDLRPCFunctionNameOnSystemCapabilityUpdated","abstract":"<p>Function name for an OnSystemCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemRequest":{"name":"SDLRPCFunctionNameOnSystemRequest","abstract":"<p>Function name for an OnSystemRequest notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTBTClientState":{"name":"SDLRPCFunctionNameOnTBTClientState","abstract":"<p>Function name for an OnTBTClientState notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTouchEvent":{"name":"SDLRPCFunctionNameOnTouchEvent","abstract":"<p>Function name for an OnTouchEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateFile":{"name":"SDLRPCFunctionNameOnUpdateFile","abstract":"<p>Function name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateSubMenu":{"name":"SDLRPCFunctionNameOnUpdateSubMenu","abstract":"<p>Function name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnVehicleData":{"name":"SDLRPCFunctionNameOnVehicleData","abstract":"<p>Function name for an OnVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnWayPointChange":{"name":"SDLRPCFunctionNameOnWayPointChange","abstract":"<p>Function name for an OnWayPointChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAppServiceInteraction":{"name":"SDLRPCFunctionNamePerformAppServiceInteraction","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAudioPassThru":{"name":"SDLRPCFunctionNamePerformAudioPassThru","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformInteraction":{"name":"SDLRPCFunctionNamePerformInteraction","abstract":"<p>Function name for a PerformInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePublishAppService":{"name":"SDLRPCFunctionNamePublishAppService","abstract":"<p>Function name for a PublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePutFile":{"name":"SDLRPCFunctionNamePutFile","abstract":"<p>Function name for a PutFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReadDID":{"name":"SDLRPCFunctionNameReadDID","abstract":"<p>Function name for a ReadDID RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReleaseInteriorVehicleDataModule":{"name":"SDLRPCFunctionNameReleaseInteriorVehicleDataModule","abstract":"<p>Function name for a ReleaseInteriorVehicleDataModule RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameRegisterAppInterface":{"name":"SDLRPCFunctionNameRegisterAppInterface","abstract":"<p>Function name for a RegisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReserved":{"name":"SDLRPCFunctionNameReserved","abstract":"<p>Function name for a Reserved RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameResetGlobalProperties":{"name":"SDLRPCFunctionNameResetGlobalProperties","abstract":"<p>Function name for a ResetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameScrollableMessage":{"name":"SDLRPCFunctionNameScrollableMessage","abstract":"<p>Function name for a ScrollableMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendHapticData":{"name":"SDLRPCFunctionNameSendHapticData","abstract":"<p>Function name for a SendHapticData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendLocation":{"name":"SDLRPCFunctionNameSendLocation","abstract":"<p>Function name for a SendLocation RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetAppIcon":{"name":"SDLRPCFunctionNameSetAppIcon","abstract":"<p>Function name for a SetAppIcon RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetCloudAppProperties":{"name":"SDLRPCFunctionNameSetCloudAppProperties","abstract":"<p>Function name for a SetCloudProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetDisplayLayout":{"name":"SDLRPCFunctionNameSetDisplayLayout","abstract":"<p>Function name for a SetDisplayLayout RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetGlobalProperties":{"name":"SDLRPCFunctionNameSetGlobalProperties","abstract":"<p>Function name for a SetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetInteriorVehicleData":{"name":"SDLRPCFunctionNameSetInteriorVehicleData","abstract":"<p>Function name for a SetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetMediaClockTimer":{"name":"SDLRPCFunctionNameSetMediaClockTimer","abstract":"<p>Function name for a SetMediaClockTimer RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShow":{"name":"SDLRPCFunctionNameShow","abstract":"<p>Function name for a Show RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowAppMenu":{"name":"SDLRPCFunctionNameShowAppMenu","abstract":"<p>Function name for a ShowAppMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowConstantTBT":{"name":"SDLRPCFunctionNameShowConstantTBT","abstract":"<p>Function name for a ShowConstantTBT RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSlider":{"name":"SDLRPCFunctionNameSlider","abstract":"<p>Function name for a Slider RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSpeak":{"name":"SDLRPCFunctionNameSpeak","abstract":"<p>Function name for a Speak RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeButton":{"name":"SDLRPCFunctionNameSubscribeButton","abstract":"<p>Function name for a SubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeVehicleData":{"name":"SDLRPCFunctionNameSubscribeVehicleData","abstract":"<p>Function name for a SubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeWayPoints":{"name":"SDLRPCFunctionNameSubscribeWayPoints","abstract":"<p>Function name for a SubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubtleAlert":{"name":"SDLRPCFunctionNameSubtleAlert","abstract":"<p>Function name for a SubtleAlert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSyncPData":{"name":"SDLRPCFunctionNameSyncPData","abstract":"<p>Function name for a SyncPData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSystemRequest":{"name":"SDLRPCFunctionNameSystemRequest","abstract":"<p>Function name for a SystemRequest RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnpublishAppService":{"name":"SDLRPCFunctionNameUnpublishAppService","abstract":"<p>Function name for an UnpublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnregisterAppInterface":{"name":"SDLRPCFunctionNameUnregisterAppInterface","abstract":"<p>Function name for an UnregisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeButton":{"name":"SDLRPCFunctionNameUnsubscribeButton","abstract":"<p>Function name for an UnsubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeVehicleData":{"name":"SDLRPCFunctionNameUnsubscribeVehicleData","abstract":"<p>Function name for an UnsubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints":{"name":"SDLRPCFunctionNameUnsubscribeWayPoints","abstract":"<p>Function name for an UnsubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList":{"name":"SDLRPCFunctionNameUpdateTurnList","abstract":"<p>Function name for an UpdateTurnList RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateWindow":{"name":"SDLRPCFunctionNameCreateWindow","abstract":"<p>Function name for a CreateWindow RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteWindow":{"name":"SDLRPCFunctionNameDeleteWindow","abstract":"<p>Function name for a DeleteWindow RPC</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameRequest":{"name":"SDLRPCMessageTypeNameRequest","abstract":"<p>A request that will require a response</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameResponse":{"name":"SDLRPCMessageTypeNameResponse","abstract":"<p>A response to a request</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameNotification":{"name":"SDLRPCMessageTypeNameNotification","abstract":"<p>A message that does not have a response</p>"},"Constants.html#/c:@SDLRadioBandAM":{"name":"SDLRadioBandAM","abstract":"<p>Represents AM radio band</p>"},"Constants.html#/c:@SDLRadioBandFM":{"name":"SDLRadioBandFM","abstract":"<p>Represents FM radio band</p>"},"Constants.html#/c:@SDLRadioBandXM":{"name":"SDLRadioBandXM","abstract":"<p>Represents XM radio band</p>"},"Constants.html#/c:@SDLRadioStateAcquiring":{"name":"SDLRadioStateAcquiring","abstract":"<p>Represents Radio state as ACQUIRING</p>"},"Constants.html#/c:@SDLRadioStateAcquired":{"name":"SDLRadioStateAcquired","abstract":"<p>Represents Radio state as ACQUIRED</p>"},"Constants.html#/c:@SDLRadioStateMulticast":{"name":"SDLRadioStateMulticast","abstract":"<p>Represents Radio state as MULTICAST</p>"},"Constants.html#/c:@SDLRadioStateNotFound":{"name":"SDLRadioStateNotFound","abstract":"<p>Represents Radio state as NOT_FOUND</p>"},"Constants.html#/c:@SDLRequestTypeHTTP":{"name":"SDLRequestTypeHTTP","abstract":"<p>An HTTP request</p>"},"Constants.html#/c:@SDLRequestTypeFileResume":{"name":"SDLRequestTypeFileResume","abstract":"<p>A file resumption request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationRequest":{"name":"SDLRequestTypeAuthenticationRequest","abstract":"<p>An authentication request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationChallenge":{"name":"SDLRequestTypeAuthenticationChallenge","abstract":"<p>An authentication challenge</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationAck":{"name":"SDLRequestTypeAuthenticationAck","abstract":"<p>An authentication acknowledgment</p>"},"Constants.html#/c:@SDLRequestTypeProprietary":{"name":"SDLRequestTypeProprietary","abstract":"<p>An proprietary formatted request</p>"},"Constants.html#/c:@SDLRequestTypeQueryApps":{"name":"SDLRequestTypeQueryApps","abstract":"<p>An Query Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLaunchApp":{"name":"SDLRequestTypeLaunchApp","abstract":"<p>A Launch Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLockScreenIconURL":{"name":"SDLRequestTypeLockScreenIconURL","abstract":"<p>The URL for a lock screen icon</p>"},"Constants.html#/c:@SDLRequestTypeTrafficMessageChannel":{"name":"SDLRequestTypeTrafficMessageChannel","abstract":"<p>A traffic message channel request</p>"},"Constants.html#/c:@SDLRequestTypeDriverProfile":{"name":"SDLRequestTypeDriverProfile","abstract":"<p>A driver profile request</p>"},"Constants.html#/c:@SDLRequestTypeVoiceSearch":{"name":"SDLRequestTypeVoiceSearch","abstract":"<p>A voice search request</p>"},"Constants.html#/c:@SDLRequestTypeNavigation":{"name":"SDLRequestTypeNavigation","abstract":"<p>A navigation request</p>"},"Constants.html#/c:@SDLRequestTypePhone":{"name":"SDLRequestTypePhone","abstract":"<p>A phone request</p>"},"Constants.html#/c:@SDLRequestTypeClimate":{"name":"SDLRequestTypeClimate","abstract":"<p>A climate request</p>"},"Constants.html#/c:@SDLRequestTypeSettings":{"name":"SDLRequestTypeSettings","abstract":"<p>A settings request</p>"},"Constants.html#/c:@SDLRequestTypeVehicleDiagnostics":{"name":"SDLRequestTypeVehicleDiagnostics","abstract":"<p>A vehicle diagnostics request</p>"},"Constants.html#/c:@SDLRequestTypeEmergency":{"name":"SDLRequestTypeEmergency","abstract":"<p>An emergency request</p>"},"Constants.html#/c:@SDLRequestTypeMedia":{"name":"SDLRequestTypeMedia","abstract":"<p>A media request</p>"},"Constants.html#/c:@SDLRequestTypeFOTA":{"name":"SDLRequestTypeFOTA","abstract":"<p>A firmware over-the-air request</p>"},"Constants.html#/c:@SDLRequestTypeOEMSpecific":{"name":"SDLRequestTypeOEMSpecific","abstract":"<p>A request that is OEM specific using the <code>RequestSubType</code> in SystemRequest</p>"},"Constants.html#/c:@SDLRequestTypeIconURL":{"name":"SDLRequestTypeIconURL","abstract":"<p>A request for an icon url</p>"},"Constants.html#/c:@SDLResultSuccess":{"name":"SDLResultSuccess","abstract":"<p>The request succeeded</p>"},"Constants.html#/c:@SDLResultInvalidData":{"name":"SDLResultInvalidData","abstract":"<p>The request contained invalid data</p>"},"Constants.html#/c:@SDLResultCharacterLimitExceeded":{"name":"SDLResultCharacterLimitExceeded","abstract":"<p>The request had a string containing too many characters</p>"},"Constants.html#/c:@SDLResultUnsupportedRequest":{"name":"SDLResultUnsupportedRequest","abstract":"<p>The request is not supported by the IVI unit implementing SDL</p>"},"Constants.html#/c:@SDLResultOutOfMemory":{"name":"SDLResultOutOfMemory","abstract":"<p>The system could not process the request because the necessary memory couldn&rsquo;t be allocated</p>"},"Constants.html#/c:@SDLResultTooManyPendingRequests":{"name":"SDLResultTooManyPendingRequests","abstract":"<p>There are too many requests pending (means that the response has not been delivered yet).</p>"},"Constants.html#/c:@SDLResultInvalidId":{"name":"SDLResultInvalidId","abstract":"<p>One of the provided IDs is not valid.</p>"},"Constants.html#/c:@SDLResultDuplicateName":{"name":"SDLResultDuplicateName","abstract":"<p>The provided name or synonym is a duplicate of some already-defined name or synonym.</p>"},"Constants.html#/c:@SDLResultTooManyApplications":{"name":"SDLResultTooManyApplications","abstract":"<p>There are already too many registered applications.</p>"},"Constants.html#/c:@SDLResultApplicationRegisteredAlready":{"name":"SDLResultApplicationRegisteredAlready","abstract":"<p>RegisterAppInterface has been called, but this app is already registered</p>"},"Constants.html#/c:@SDLResultUnsupportedVersion":{"name":"SDLResultUnsupportedVersion","abstract":"<p>The Head Unit doesn&rsquo;t support the SDL version that is requested by the mobile application.</p>"},"Constants.html#/c:@SDLResultWrongLanguage":{"name":"SDLResultWrongLanguage","abstract":"<p>The requested language is currently not supported. This might be because of a mismatch of the currently active language on the head unit and the requested language.</p>"},"Constants.html#/c:@SDLResultApplicationNotRegistered":{"name":"SDLResultApplicationNotRegistered","abstract":"<p>A command can not be executed because no application has been registered with RegisterApplication.</p>"},"Constants.html#/c:@SDLResultInUse":{"name":"SDLResultInUse","abstract":"<p>The data may not be changed, because it is currently in use. For example when trying to delete a choice set that is currently involved in an interaction.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAllowed":{"name":"SDLResultVehicleDataNotAllowed","abstract":"<p>The user has turned off access to vehicle data, and it is globally unavailable to mobile applications.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAvailable":{"name":"SDLResultVehicleDataNotAvailable","abstract":"<p>The requested vehicle data is not available on this vehicle or is not published.</p>"},"Constants.html#/c:@SDLResultRejected":{"name":"SDLResultRejected","abstract":"<p>The requested command was rejected, e.g. because the mobile app is in background and cannot perform any HMI commands, or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is playing.</p>"},"Constants.html#/c:@SDLResultAborted":{"name":"SDLResultAborted","abstract":"<p>A command was aborted, e.g. due to user interaction (user pressed button), or an HMI command (e.g. Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested.</p>"},"Constants.html#/c:@SDLResultIgnored":{"name":"SDLResultIgnored","abstract":"<p>A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was used to pause the media clock although the clock is paused already.</p>"},"Constants.html#/c:@SDLResultUnsupportedResource":{"name":"SDLResultUnsupportedResource","abstract":"<p>A button that was requested for subscription is not supported under the current system.</p>"},"Constants.html#/c:@SDLResultFileNotFound":{"name":"SDLResultFileNotFound","abstract":"<p>A specified file could not be found on the head unit.</p>"},"Constants.html#/c:@SDLResultGenericError":{"name":"SDLResultGenericError","abstract":"<p>Provided data is valid but something went wrong in the lower layers.</p>"},"Constants.html#/c:@SDLResultDisallowed":{"name":"SDLResultDisallowed","abstract":"<p>RPC is not authorized in local policy table.</p>"},"Constants.html#/c:@SDLResultUserDisallowed":{"name":"SDLResultUserDisallowed","abstract":"<p>RPC is included in a functional group explicitly blocked by the user.</p>"},"Constants.html#/c:@SDLResultTimedOut":{"name":"SDLResultTimedOut","abstract":"<p>Overlay reached the maximum timeout and closed.</p>"},"Constants.html#/c:@SDLResultCancelRoute":{"name":"SDLResultCancelRoute","abstract":"<p>User selected to Cancel Route.</p>"},"Constants.html#/c:@SDLResultCorruptedData":{"name":"SDLResultCorruptedData","abstract":"<p>The data sent failed to pass CRC check in receiver end.</p>"},"Constants.html#/c:@SDLResultTruncatedData":{"name":"SDLResultTruncatedData","abstract":"<p>The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, only part of the data is available.</p>"},"Constants.html#/c:@SDLResultRetry":{"name":"SDLResultRetry","abstract":"<p>The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue the new RPC.</p>"},"Constants.html#/c:@SDLResultWarnings":{"name":"SDLResultWarnings","abstract":"<p>The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure.</p>"},"Constants.html#/c:@SDLResultSaved":{"name":"SDLResultSaved","abstract":"<p>The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value.</p>"},"Constants.html#/c:@SDLResultInvalidCertificate":{"name":"SDLResultInvalidCertificate","abstract":"<p>The certificate provided during authentication is invalid.</p>"},"Constants.html#/c:@SDLResultExpiredCertificate":{"name":"SDLResultExpiredCertificate","abstract":"<p>The certificate provided during authentication is expired.</p>"},"Constants.html#/c:@SDLResultResumeFailed":{"name":"SDLResultResumeFailed","abstract":"<p>The provided hash ID does not match the hash of the current set of registered data or the core could not resume the previous data.</p>"},"Constants.html#/c:@SDLResultDataNotAvailable":{"name":"SDLResultDataNotAvailable","abstract":"<p>The requested data is not available on this vehicle or is not published for the connected app.</p>"},"Constants.html#/c:@SDLResultReadOnly":{"name":"SDLResultReadOnly","abstract":"<p>The requested data is read only thus cannot be change via remote control .</p>"},"Constants.html#/c:@SDLResultEncryptionNeeded":{"name":"SDLResultEncryptionNeeded","abstract":"<p>The RPC request needs to be encrypted.</p>"},"Constants.html#/c:@SDLSamplingRate8KHZ":{"name":"SDLSamplingRate8KHZ","abstract":"<p>Sampling rate of 8 kHz</p>"},"Constants.html#/c:@SDLSamplingRate16KHZ":{"name":"SDLSamplingRate16KHZ","abstract":"<p>Sampling rate of 16 kHz</p>"},"Constants.html#/c:@SDLSamplingRate22KHZ":{"name":"SDLSamplingRate22KHZ","abstract":"<p>Sampling rate of 22 kHz</p>"},"Constants.html#/c:@SDLSamplingRate44KHZ":{"name":"SDLSamplingRate44KHZ","abstract":"<p>Sampling rate of 44 kHz</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeSave":{"name":"SDLSeatMemoryActionTypeSave","abstract":"<p>@abstract Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeRestore":{"name":"SDLSeatMemoryActionTypeRestore","abstract":"<p>@abstract Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeNone":{"name":"SDLSeatMemoryActionTypeNone","abstract":"<p>@abstract No action to be performed.</p>"},"Constants.html#/c:@SDLSeekIndicatorTypeTrack":{"name":"SDLSeekIndicatorTypeTrack","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLSeekIndicatorTypeTime":{"name":"SDLSeekIndicatorTypeTime","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLServiceUpdateReasonPublished":{"name":"SDLServiceUpdateReasonPublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdatePublished":{"name":"SDLServiceUpdatePublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonRemoved":{"name":"SDLServiceUpdateReasonRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonActivated":{"name":"SDLServiceUpdateReasonActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateActivated":{"name":"SDLServiceUpdateActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonDeactivated":{"name":"SDLServiceUpdateReasonDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonManifestUpdate":{"name":"SDLServiceUpdateReasonManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLServiceUpdateManifestUpdate":{"name":"SDLServiceUpdateManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLSoftButtonTypeText":{"name":"SDLSoftButtonTypeText","abstract":"<p>Text kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeImage":{"name":"SDLSoftButtonTypeImage","abstract":"<p>Image kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeBoth":{"name":"SDLSoftButtonTypeBoth","abstract":"<p>Both (Text &amp; Image) kind Softbutton</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesText":{"name":"SDLSpeechCapabilitiesText","abstract":"<p>The SDL platform can speak text phrases.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSAPIPhonemes":{"name":"SDLSpeechCapabilitiesSAPIPhonemes","abstract":"<p>The SDL platform can speak SAPI Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesLHPlusPhonemes":{"name":"SDLSpeechCapabilitiesLHPlusPhonemes","abstract":"<p>The SDL platform can speak LHPlus Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesPrerecorded":{"name":"SDLSpeechCapabilitiesPrerecorded","abstract":"<p>The SDL platform can speak Prerecorded indicators and prompts.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSilence":{"name":"SDLSpeechCapabilitiesSilence","abstract":"<p>The SDL platform can speak Silence.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesFile":{"name":"SDLSpeechCapabilitiesFile","abstract":"<p>The SDL platform can play a file</p>"},"Constants.html#/c:@SDLStaticIconNameAcceptCall":{"name":"SDLStaticIconNameAcceptCall","abstract":"<p>Static icon accept call / active phone call in progress / initiate a phone call</p>"},"Constants.html#/c:@SDLStaticIconNameAddWaypoint":{"name":"SDLStaticIconNameAddWaypoint","abstract":"<p>Static icon add waypoint</p>"},"Constants.html#/c:@SDLStaticIconNameAlbum":{"name":"SDLStaticIconNameAlbum","abstract":"<p>Static icon album</p>"},"Constants.html#/c:@SDLStaticIconNameAmbientLighting":{"name":"SDLStaticIconNameAmbientLighting","abstract":"<p>Static icon ambient lighting</p>"},"Constants.html#/c:@SDLStaticIconNameArrowNorth":{"name":"SDLStaticIconNameArrowNorth","abstract":"<p>Static icon arrow - north</p>"},"Constants.html#/c:@SDLStaticIconNameAudioMute":{"name":"SDLStaticIconNameAudioMute","abstract":"<p>Static icon audio mute</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookEpisode":{"name":"SDLStaticIconNameAudiobookEpisode","abstract":"<p>Static icon audiobook episode</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookNarrator":{"name":"SDLStaticIconNameAudiobookNarrator","abstract":"<p>Static icon audiobook narrator</p>"},"Constants.html#/c:@SDLStaticIconNameAuxillaryAudio":{"name":"SDLStaticIconNameAuxillaryAudio","abstract":"<p>Static icon auxiliary audio</p>"},"Constants.html#/c:@SDLStaticIconNameAuxiliaryAudio":{"name":"SDLStaticIconNameAuxiliaryAudio","abstract":"<p>Static icon auxiliary audio</p>"},"Constants.html#/c:@SDLStaticIconNameBack":{"name":"SDLStaticIconNameBack","abstract":"<p>Static icon back / return</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity0Of5":{"name":"SDLStaticIconNameBatteryCapacity0Of5","abstract":"<p>Static icon battery capacity 0 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity1Of5":{"name":"SDLStaticIconNameBatteryCapacity1Of5","abstract":"<p>Static icon battery capacity 1 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity2Of5":{"name":"SDLStaticIconNameBatteryCapacity2Of5","abstract":"<p>Static icon battery capacity 2 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity3Of5":{"name":"SDLStaticIconNameBatteryCapacity3Of5","abstract":"<p>Static icon battery capacity 3 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity4Of5":{"name":"SDLStaticIconNameBatteryCapacity4Of5","abstract":"<p>Static icon battery capacity 4 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity5Of5":{"name":"SDLStaticIconNameBatteryCapacity5Of5","abstract":"<p>Static icon battery capacity 5 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBluetoothAudioSource":{"name":"SDLStaticIconNameBluetoothAudioSource","abstract":"<p>Static icon bluetooth audio source</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth1":{"name":"SDLStaticIconNameBluetooth1","abstract":"<p>Static icon bluetooth1</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth2":{"name":"SDLStaticIconNameBluetooth2","abstract":"<p>Static icon bluetooth2</p>"},"Constants.html#/c:@SDLStaticIconNameBrowse":{"name":"SDLStaticIconNameBrowse","abstract":"<p>Static icon browse</p>"},"Constants.html#/c:@SDLStaticIconNameCellPhoneInRoamingMode":{"name":"SDLStaticIconNameCellPhoneInRoamingMode","abstract":"<p>Static icon cell phone in roaming mode</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength0Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength0Of5Bars","abstract":"<p>Static icon cell service signal strength 0 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength1Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength1Of5Bars","abstract":"<p>Static icon cell service signal strength 1 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength2Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength2Of5Bars","abstract":"<p>Static icon cell service signal strength 2 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength3Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength3Of5Bars","abstract":"<p>Static icon cell service signal strength 3 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength4Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength4Of5Bars","abstract":"<p>Static icon cell service signal strength 4 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength5Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength5Of5Bars","abstract":"<p>Static icon cell service signal strength 5 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneLeft":{"name":"SDLStaticIconNameChangeLaneLeft","abstract":"<p>Static icon change lane left</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneRight":{"name":"SDLStaticIconNameChangeLaneRight","abstract":"<p>Static icon change lane right</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxChecked":{"name":"SDLStaticIconNameCheckBoxChecked","abstract":"<p>Static icon check box checked</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxUnchecked":{"name":"SDLStaticIconNameCheckBoxUnchecked","abstract":"<p>Static icon check box unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameClimate":{"name":"SDLStaticIconNameClimate","abstract":"<p>Static icon climate</p>"},"Constants.html#/c:@SDLStaticIconNameClock":{"name":"SDLStaticIconNameClock","abstract":"<p>Static icon clock</p>"},"Constants.html#/c:@SDLStaticIconNameCompose":{"name":"SDLStaticIconNameCompose","abstract":"<p>Static icon compose (e.g. message)</p>"},"Constants.html#/c:@SDLStaticIconNameContact":{"name":"SDLStaticIconNameContact","abstract":"<p>Static icon contact / person</p>"},"Constants.html#/c:@SDLStaticIconNameContinue":{"name":"SDLStaticIconNameContinue","abstract":"<p>Static icon continue</p>"},"Constants.html#/c:@SDLStaticIconNameDash":{"name":"SDLStaticIconNameDash","abstract":"<p>Static icon dash / bullet point</p>"},"Constants.html#/c:@SDLStaticIconNameDate":{"name":"SDLStaticIconNameDate","abstract":"<p>Static icon date / calendar</p>"},"Constants.html#/c:@SDLStaticIconNameDelete":{"name":"SDLStaticIconNameDelete","abstract":"<p>Static icon delete/remove - trash</p>"},"Constants.html#/c:@SDLStaticIconNameDestination":{"name":"SDLStaticIconNameDestination","abstract":"<p>Static icon destination</p>"},"Constants.html#/c:@SDLStaticIconNameDestinationFerryAhead":{"name":"SDLStaticIconNameDestinationFerryAhead","abstract":"<p>Static icon destination ferry ahead</p>"},"Constants.html#/c:@SDLStaticIconNameEbookmark":{"name":"SDLStaticIconNameEbookmark","abstract":"<p>Static icon ebookmark (e.g. message, feed)</p>"},"Constants.html#/c:@SDLStaticIconNameEmpty":{"name":"SDLStaticIconNameEmpty","abstract":"<p>Static icon empty (i.e. no image)</p>"},"Constants.html#/c:@SDLStaticIconNameEndCall":{"name":"SDLStaticIconNameEndCall","abstract":"<p>Static icon end call / reject call</p>"},"Constants.html#/c:@SDLStaticIconNameFail":{"name":"SDLStaticIconNameFail","abstract":"<p>Static icon fail / X</p>"},"Constants.html#/c:@SDLStaticIconNameFastForward30Secs":{"name":"SDLStaticIconNameFastForward30Secs","abstract":"<p>Static icon fast forward 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteHeart":{"name":"SDLStaticIconNameFavoriteHeart","abstract":"<p>Static icon favorite / heart</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteStar":{"name":"SDLStaticIconNameFavoriteStar","abstract":"<p>Static icon favorite / star</p>"},"Constants.html#/c:@SDLStaticIconNameFaxNumber":{"name":"SDLStaticIconNameFaxNumber","abstract":"<p>Static icon fax number</p>"},"Constants.html#/c:@SDLStaticIconNameFilename":{"name":"SDLStaticIconNameFilename","abstract":"<p>Static icon filename</p>"},"Constants.html#/c:@SDLStaticIconNameFilter":{"name":"SDLStaticIconNameFilter","abstract":"<p>Static icon filter / search</p>"},"Constants.html#/c:@SDLStaticIconNameFolder":{"name":"SDLStaticIconNameFolder","abstract":"<p>Static icon folder</p>"},"Constants.html#/c:@SDLStaticIconNameFuelPrices":{"name":"SDLStaticIconNameFuelPrices","abstract":"<p>Static icon fuel prices</p>"},"Constants.html#/c:@SDLStaticIconNameFullMap":{"name":"SDLStaticIconNameFullMap","abstract":"<p>Static icon full map</p>"},"Constants.html#/c:@SDLStaticIconNameGenericPhoneNumber":{"name":"SDLStaticIconNameGenericPhoneNumber","abstract":"<p>Static icon generic phone number</p>"},"Constants.html#/c:@SDLStaticIconNameGenre":{"name":"SDLStaticIconNameGenre","abstract":"<p>Static icon genre</p>"},"Constants.html#/c:@SDLStaticIconNameGlobalKeyboard":{"name":"SDLStaticIconNameGlobalKeyboard","abstract":"<p>Static icon global keyboard</p>"},"Constants.html#/c:@SDLStaticIconNameHighwayExitInformation":{"name":"SDLStaticIconNameHighwayExitInformation","abstract":"<p>Static icon highway exit information</p>"},"Constants.html#/c:@SDLStaticIconNameHomePhoneNumber":{"name":"SDLStaticIconNameHomePhoneNumber","abstract":"<p>Static icon home phone number</p>"},"Constants.html#/c:@SDLStaticIconNameHyperlink":{"name":"SDLStaticIconNameHyperlink","abstract":"<p>Static icon hyperlink</p>"},"Constants.html#/c:@SDLStaticIconNameID3TagUnknown":{"name":"SDLStaticIconNameID3TagUnknown","abstract":"<p>Static icon ID3 tag unknown</p>"},"Constants.html#/c:@SDLStaticIconNameIncomingCalls":{"name":"SDLStaticIconNameIncomingCalls","abstract":"<p>Static icon incoming calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameInformation":{"name":"SDLStaticIconNameInformation","abstract":"<p>Static icon information</p>"},"Constants.html#/c:@SDLStaticIconNameIPodMediaSource":{"name":"SDLStaticIconNameIPodMediaSource","abstract":"<p>Static icon IPOD media source</p>"},"Constants.html#/c:@SDLStaticIconNameJoinCalls":{"name":"SDLStaticIconNameJoinCalls","abstract":"<p>Static icon join calls</p>"},"Constants.html#/c:@SDLStaticIconNameKeepLeft":{"name":"SDLStaticIconNameKeepLeft","abstract":"<p>Static icon keep left</p>"},"Constants.html#/c:@SDLStaticIconNameKeepRight":{"name":"SDLStaticIconNameKeepRight","abstract":"<p>Static icon keep right</p>"},"Constants.html#/c:@SDLStaticIconNameKey":{"name":"SDLStaticIconNameKey","abstract":"<p>Static icon key / keycode</p>"},"Constants.html#/c:@SDLStaticIconNameLeft":{"name":"SDLStaticIconNameLeft","abstract":"<p>Static icon left</p>"},"Constants.html#/c:@SDLStaticIconNameLeftArrow":{"name":"SDLStaticIconNameLeftArrow","abstract":"<p>Static icon left arrow / back</p>"},"Constants.html#/c:@SDLStaticIconNameLeftExit":{"name":"SDLStaticIconNameLeftExit","abstract":"<p>Static icon left exit</p>"},"Constants.html#/c:@SDLStaticIconNameLineInAudioSource":{"name":"SDLStaticIconNameLineInAudioSource","abstract":"<p>Static icon LINE IN audio source</p>"},"Constants.html#/c:@SDLStaticIconNameLocked":{"name":"SDLStaticIconNameLocked","abstract":"<p>Static icon locked</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlLeftArrow":{"name":"SDLStaticIconNameMediaControlLeftArrow","abstract":"<p>Static icon media control - left arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRecording":{"name":"SDLStaticIconNameMediaControlRecording","abstract":"<p>Static icon media control - recording</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRightArrow":{"name":"SDLStaticIconNameMediaControlRightArrow","abstract":"<p>Static icon media control - right arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlStop":{"name":"SDLStaticIconNameMediaControlStop","abstract":"<p>Static icon media control - stop (e.g. streaming)</p>"},"Constants.html#/c:@SDLStaticIconNameMicrophone":{"name":"SDLStaticIconNameMicrophone","abstract":"<p>Static icon microphone</p>"},"Constants.html#/c:@SDLStaticIconNameMissedCalls":{"name":"SDLStaticIconNameMissedCalls","abstract":"<p>Static icon missed calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameMobilePhoneNumber":{"name":"SDLStaticIconNameMobilePhoneNumber","abstract":"<p>Static icon mobile phone number</p>"},"Constants.html#/c:@SDLStaticIconNameMoveDown":{"name":"SDLStaticIconNameMoveDown","abstract":"<p>Static icon move down / download</p>"},"Constants.html#/c:@SDLStaticIconNameMoveUp":{"name":"SDLStaticIconNameMoveUp","abstract":"<p>Static icon move up</p>"},"Constants.html#/c:@SDLStaticIconNameMP3TagArtist":{"name":"SDLStaticIconNameMP3TagArtist","abstract":"<p>Static icon MP3 tag artist</p>"},"Constants.html#/c:@SDLStaticIconNameNavigation":{"name":"SDLStaticIconNameNavigation","abstract":"<p>Static icon navigation / navigation settings</p>"},"Constants.html#/c:@SDLStaticIconNameNavigationCurrentDirection":{"name":"SDLStaticIconNameNavigationCurrentDirection","abstract":"<p>Static icon navigation current direction</p>"},"Constants.html#/c:@SDLStaticIconNameNegativeRatingThumbsDown":{"name":"SDLStaticIconNameNegativeRatingThumbsDown","abstract":"<p>Static icon negative rating - thumbs down</p>"},"Constants.html#/c:@SDLStaticIconNameNew":{"name":"SDLStaticIconNameNew","abstract":"<p>Static icon new/unread text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOfficePhoneNumber":{"name":"SDLStaticIconNameOfficePhoneNumber","abstract":"<p>Static icon office phone number / work phone number</p>"},"Constants.html#/c:@SDLStaticIconNameOpened":{"name":"SDLStaticIconNameOpened","abstract":"<p>Static icon opened/read text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOrigin":{"name":"SDLStaticIconNameOrigin","abstract":"<p>Static icon origin / nearby locale / current position</p>"},"Constants.html#/c:@SDLStaticIconNameOutgoingCalls":{"name":"SDLStaticIconNameOutgoingCalls","abstract":"<p>Static icon outgoing calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNamePause":{"name":"SDLStaticIconNamePause","abstract":"<p>Static icon play / pause - pause active</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall1":{"name":"SDLStaticIconNamePhoneCall1","abstract":"<p>Static icon phone call 1</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall2":{"name":"SDLStaticIconNamePhoneCall2","abstract":"<p>Static icon phone call 2</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneDevice":{"name":"SDLStaticIconNamePhoneDevice","abstract":"<p>Static icon phone device</p>"},"Constants.html#/c:@SDLStaticIconNamePhonebook":{"name":"SDLStaticIconNamePhonebook","abstract":"<p>Static icon phonebook</p>"},"Constants.html#/c:@SDLStaticIconNamePhoto":{"name":"SDLStaticIconNamePhoto","abstract":"<p>Static icon photo / picture</p>"},"Constants.html#/c:@SDLStaticIconNamePlay":{"name":"SDLStaticIconNamePlay","abstract":"<p>Static icon play / pause - play active</p>"},"Constants.html#/c:@SDLStaticIconNamePlaylist":{"name":"SDLStaticIconNamePlaylist","abstract":"<p>Static icon playlist</p>"},"Constants.html#/c:@SDLStaticIconNamePopUp":{"name":"SDLStaticIconNamePopUp","abstract":"<p>Static icon pop-up</p>"},"Constants.html#/c:@SDLStaticIconNamePositiveRatingThumbsUp":{"name":"SDLStaticIconNamePositiveRatingThumbsUp","abstract":"<p>Static icon positive rating - thumbs up</p>"},"Constants.html#/c:@SDLStaticIconNamePower":{"name":"SDLStaticIconNamePower","abstract":"<p>Static icon power</p>"},"Constants.html#/c:@SDLStaticIconNamePrimaryPhone":{"name":"SDLStaticIconNamePrimaryPhone","abstract":"<p>Static icon primary phone (favorite)</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonChecked":{"name":"SDLStaticIconNameRadioButtonChecked","abstract":"<p>Static icon radio button checked</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonUnchecked":{"name":"SDLStaticIconNameRadioButtonUnchecked","abstract":"<p>Static icon radio button unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameRecentCalls":{"name":"SDLStaticIconNameRecentCalls","abstract":"<p>Static icon recent calls / history</p>"},"Constants.html#/c:@SDLStaticIconNameRecentDestinations":{"name":"SDLStaticIconNameRecentDestinations","abstract":"<p>Static icon recent destinations</p>"},"Constants.html#/c:@SDLStaticIconNameRedo":{"name":"SDLStaticIconNameRedo","abstract":"<p>Static icon redo</p>"},"Constants.html#/c:@SDLStaticIconNameRefresh":{"name":"SDLStaticIconNameRefresh","abstract":"<p>Static icon refresh</p>"},"Constants.html#/c:@SDLStaticIconNameRemoteDiagnosticsCheckEngine":{"name":"SDLStaticIconNameRemoteDiagnosticsCheckEngine","abstract":"<p>Static icon remote diagnostics - check engine</p>"},"Constants.html#/c:@SDLStaticIconNameRendered911Assist":{"name":"SDLStaticIconNameRendered911Assist","abstract":"<p>Static icon rendered 911 assist / emergency assistance</p>"},"Constants.html#/c:@SDLStaticIconNameRepeat":{"name":"SDLStaticIconNameRepeat","abstract":"<p>Static icon repeat</p>"},"Constants.html#/c:@SDLStaticIconNameRepeatPlay":{"name":"SDLStaticIconNameRepeatPlay","abstract":"<p>Static icon repeat play</p>"},"Constants.html#/c:@SDLStaticIconNameReply":{"name":"SDLStaticIconNameReply","abstract":"<p>Static icon reply</p>"},"Constants.html#/c:@SDLStaticIconNameRewind30Secs":{"name":"SDLStaticIconNameRewind30Secs","abstract":"<p>Static icon rewind 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameRight":{"name":"SDLStaticIconNameRight","abstract":"<p>Static icon right</p>"},"Constants.html#/c:@SDLStaticIconNameRightExit":{"name":"SDLStaticIconNameRightExit","abstract":"<p>Static icon right exit</p>"},"Constants.html#/c:@SDLStaticIconNameRingtones":{"name":"SDLStaticIconNameRingtones","abstract":"<p>Static icon ringtones</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand1":{"name":"SDLStaticIconNameRoundaboutLeftHand1","abstract":"<p>Static icon roundabout left hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand2":{"name":"SDLStaticIconNameRoundaboutLeftHand2","abstract":"<p>Static icon roundabout left hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand3":{"name":"SDLStaticIconNameRoundaboutLeftHand3","abstract":"<p>Static icon roundabout left hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand4":{"name":"SDLStaticIconNameRoundaboutLeftHand4","abstract":"<p>Static icon roundabout left hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand5":{"name":"SDLStaticIconNameRoundaboutLeftHand5","abstract":"<p>Static icon roundabout left hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand6":{"name":"SDLStaticIconNameRoundaboutLeftHand6","abstract":"<p>Static icon roundabout left hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand7":{"name":"SDLStaticIconNameRoundaboutLeftHand7","abstract":"<p>Static icon roundabout left hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand1":{"name":"SDLStaticIconNameRoundaboutRightHand1","abstract":"<p>Static icon roundabout right hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand2":{"name":"SDLStaticIconNameRoundaboutRightHand2","abstract":"<p>Static icon roundabout right hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand3":{"name":"SDLStaticIconNameRoundaboutRightHand3","abstract":"<p>Static icon roundabout right hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand4":{"name":"SDLStaticIconNameRoundaboutRightHand4","abstract":"<p>Static icon roundabout right hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand5":{"name":"SDLStaticIconNameRoundaboutRightHand5","abstract":"<p>Static icon roundabout right hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand6":{"name":"SDLStaticIconNameRoundaboutRightHand6","abstract":"<p>Static icon roundabout right hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand7":{"name":"SDLStaticIconNameRoundaboutRightHand7","abstract":"<p>Static icon roundabout right hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRSS":{"name":"SDLStaticIconNameRSS","abstract":"<p>Static icon RSS</p>"},"Constants.html#/c:@SDLStaticIconNameSettings":{"name":"SDLStaticIconNameSettings","abstract":"<p>Static icon settings / menu</p>"},"Constants.html#/c:@SDLStaticIconNameSharpLeft":{"name":"SDLStaticIconNameSharpLeft","abstract":"<p>Static icon sharp left</p>"},"Constants.html#/c:@SDLStaticIconNameSharpRight":{"name":"SDLStaticIconNameSharpRight","abstract":"<p>Static icon sharp right</p>"},"Constants.html#/c:@SDLStaticIconNameShow":{"name":"SDLStaticIconNameShow","abstract":"<p>Static icon show</p>"},"Constants.html#/c:@SDLStaticIconNameShufflePlay":{"name":"SDLStaticIconNameShufflePlay","abstract":"<p>Static icon shuffle play</p>"},"Constants.html#/c:@SDLStaticIconNameSkiPlaces":{"name":"SDLStaticIconNameSkiPlaces","abstract":"<p>Static icon ski places / elevation / altitude</p>"},"Constants.html#/c:@SDLStaticIconNameSlightLeft":{"name":"SDLStaticIconNameSlightLeft","abstract":"<p>Static icon slight left</p>"},"Constants.html#/c:@SDLStaticIconNameSlightRight":{"name":"SDLStaticIconNameSlightRight","abstract":"<p>Static icon slight right</p>"},"Constants.html#/c:@SDLStaticIconNameSmartphone":{"name":"SDLStaticIconNameSmartphone","abstract":"<p>Static icon smartphone</p>"},"Constants.html#/c:@SDLStaticIconNameSortList":{"name":"SDLStaticIconNameSortList","abstract":"<p>Static icon sort list</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber0":{"name":"SDLStaticIconNameSpeedDialNumbersNumber0","abstract":"<p>Static icon speed dial numbers - number 0</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber1":{"name":"SDLStaticIconNameSpeedDialNumbersNumber1","abstract":"<p>Static icon speed dial numbers - number 1</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber2":{"name":"SDLStaticIconNameSpeedDialNumbersNumber2","abstract":"<p>Static icon speed dial numbers - number 2</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber3":{"name":"SDLStaticIconNameSpeedDialNumbersNumber3","abstract":"<p>Static icon speed dial numbers - number 3</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber4":{"name":"SDLStaticIconNameSpeedDialNumbersNumber4","abstract":"<p>Static icon speed dial numbers - number 4</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber5":{"name":"SDLStaticIconNameSpeedDialNumbersNumber5","abstract":"<p>Static icon speed dial numbers - number 5</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber6":{"name":"SDLStaticIconNameSpeedDialNumbersNumber6","abstract":"<p>Static icon speed dial numbers - number 6</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber7":{"name":"SDLStaticIconNameSpeedDialNumbersNumber7","abstract":"<p>Static icon speed dial numbers - number 7</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber8":{"name":"SDLStaticIconNameSpeedDialNumbersNumber8","abstract":"<p>Static icon speed dial numbers - number 8</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber9":{"name":"SDLStaticIconNameSpeedDialNumbersNumber9","abstract":"<p>Static icon speed dial numbers - number 9</p>"},"Constants.html#/c:@SDLStaticIconNameSuccess":{"name":"SDLStaticIconNameSuccess","abstract":"<p>Static icon success / check</p>"},"Constants.html#/c:@SDLStaticIconNameTrackTitle":{"name":"SDLStaticIconNameTrackTitle","abstract":"<p>Static icon track title / song title</p>"},"Constants.html#/c:@SDLStaticIconNameTrafficReport":{"name":"SDLStaticIconNameTrafficReport","abstract":"<p>Static icon traffic report</p>"},"Constants.html#/c:@SDLStaticIconNameTurnList":{"name":"SDLStaticIconNameTurnList","abstract":"<p>Static icon turn list</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnLeftTraffic":{"name":"SDLStaticIconNameUTurnLeftTraffic","abstract":"<p>Static icon u-turn left traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnRightTraffic":{"name":"SDLStaticIconNameUTurnRightTraffic","abstract":"<p>Static icon u-turn right traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUndo":{"name":"SDLStaticIconNameUndo","abstract":"<p>Static icon undo</p>"},"Constants.html#/c:@SDLStaticIconNameUnlocked":{"name":"SDLStaticIconNameUnlocked","abstract":"<p>Static icon unlocked</p>"},"Constants.html#/c:@SDLStaticIconNameUSBMediaAudioSource":{"name":"SDLStaticIconNameUSBMediaAudioSource","abstract":"<p>Static icon USB media audio source</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo1":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo1","abstract":"<p>Static icon voice control scrollbar - list item no. 1</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo2":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo2","abstract":"<p>Static icon voice control scrollbar - list item no. 2</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo3":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo3","abstract":"<p>Static icon voice control scrollbar - list item no. 3</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo4":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo4","abstract":"<p>Static icon voice control scrollbar - list item no. 4</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionFailed":{"name":"SDLStaticIconNameVoiceRecognitionFailed","abstract":"<p>Static icon voice recognition - failed</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionPause":{"name":"SDLStaticIconNameVoiceRecognitionPause","abstract":"<p>Static icon voice recognition - pause</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSuccessful":{"name":"SDLStaticIconNameVoiceRecognitionSuccessful","abstract":"<p>Static icon voice recognition - successful</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemActive":{"name":"SDLStaticIconNameVoiceRecognitionSystemActive","abstract":"<p>Static icon voice recognition - system active</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemListening":{"name":"SDLStaticIconNameVoiceRecognitionSystemListening","abstract":"<p>Static icon voice recognition - system listening</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionTryAgain":{"name":"SDLStaticIconNameVoiceRecognitionTryAgain","abstract":"<p>Static icon voice recognition - try again</p>"},"Constants.html#/c:@SDLStaticIconNameWarning":{"name":"SDLStaticIconNameWarning","abstract":"<p>Static icon warning / safety alert</p>"},"Constants.html#/c:@SDLStaticIconNameWeather":{"name":"SDLStaticIconNameWeather","abstract":"<p>Static icon weather</p>"},"Constants.html#/c:@SDLStaticIconNameWifiFull":{"name":"SDLStaticIconNameWifiFull","abstract":"<p>Static icon wifi full</p>"},"Constants.html#/c:@SDLStaticIconNameZoomIn":{"name":"SDLStaticIconNameZoomIn","abstract":"<p>Static icon zoom in</p>"},"Constants.html#/c:@SDLStaticIconNameZoomOut":{"name":"SDLStaticIconNameZoomOut","abstract":"<p>Static icon zoom out</p>"},"Constants.html#/c:@SDLVideoStreamDidStartNotification":{"name":"SDLVideoStreamDidStartNotification","abstract":"<p>Name of video stream start notification</p>"},"Constants.html#/c:@SDLVideoStreamDidStopNotification":{"name":"SDLVideoStreamDidStopNotification","abstract":"<p>Name of video stream stop notification</p>"},"Constants.html#/c:@SDLVideoStreamSuspendedNotification":{"name":"SDLVideoStreamSuspendedNotification","abstract":"<p>Name of video stream suspended notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStartNotification":{"name":"SDLAudioStreamDidStartNotification","abstract":"<p>Name of audio stream start notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStopNotification":{"name":"SDLAudioStreamDidStopNotification","abstract":"<p>Name of audio stream stop notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillPresentLockScreenViewController":{"name":"SDLLockScreenManagerWillPresentLockScreenViewController","abstract":"<p>Lockscreen will present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidPresentLockScreenViewController":{"name":"SDLLockScreenManagerDidPresentLockScreenViewController","abstract":"<p>Lockscreen did present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillDismissLockScreenViewController":{"name":"SDLLockScreenManagerWillDismissLockScreenViewController","abstract":"<p>Lockscreen will dismiss notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidDismissLockScreenViewController":{"name":"SDLLockScreenManagerDidDismissLockScreenViewController","abstract":"<p>Lockscreen did dismiss notification</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStopped":{"name":"SDLVideoStreamManagerStateStopped","abstract":"<p>Streaming state stopped</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStarting":{"name":"SDLVideoStreamManagerStateStarting","abstract":"<p>Streaming state starting</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateReady":{"name":"SDLVideoStreamManagerStateReady","abstract":"<p>Streaming state ready</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateSuspended":{"name":"SDLVideoStreamManagerStateSuspended","abstract":"<p>Streaming state suspended</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateShuttingDown":{"name":"SDLVideoStreamManagerStateShuttingDown","abstract":"<p>Streaming state shutting down</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStopped":{"name":"SDLAudioStreamManagerStateStopped","abstract":"<p>Audio state stopped</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStarting":{"name":"SDLAudioStreamManagerStateStarting","abstract":"<p>Audio state starting</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateReady":{"name":"SDLAudioStreamManagerStateReady","abstract":"<p>Audio state ready</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateShuttingDown":{"name":"SDLAudioStreamManagerStateShuttingDown","abstract":"<p>Audio state shutting down</p>"},"Constants.html#/c:@SDLAppStateInactive":{"name":"SDLAppStateInactive","abstract":"<p>App state inactive</p>"},"Constants.html#/c:@SDLAppStateActive":{"name":"SDLAppStateActive","abstract":"<p>App state active</p>"},"Constants.html#/c:@SDLSupportedSeatDriver":{"name":"SDLSupportedSeatDriver","abstract":"<p>Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSupportedSeatFrontPassenger":{"name":"SDLSupportedSeatFrontPassenger","abstract":"<p>Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSystemActionDefaultAction":{"name":"SDLSystemActionDefaultAction","abstract":"<p>A default soft button action</p>"},"Constants.html#/c:@SDLSystemActionStealFocus":{"name":"SDLSystemActionStealFocus","abstract":"<p>An action causing your app to steal HMI focus</p>"},"Constants.html#/c:@SDLSystemActionKeepContext":{"name":"SDLSystemActionKeepContext","abstract":"<p>An action causing you to keep context</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeAppServices":{"name":"SDLSystemCapabilityTypeAppServices","abstract":"<p>The app services capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeNavigation":{"name":"SDLSystemCapabilityTypeNavigation","abstract":"<p>The navigation capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypePhoneCall":{"name":"SDLSystemCapabilityTypePhoneCall","abstract":"<p>The phone call capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeVideoStreaming":{"name":"SDLSystemCapabilityTypeVideoStreaming","abstract":"<p>The video streaming capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeRemoteControl":{"name":"SDLSystemCapabilityTypeRemoteControl","abstract":"<p>The remote control capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeSeatLocation":{"name":"SDLSystemCapabilityTypeSeatLocation","abstract":"<p>Contains information about the locations of each seat</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDisplays":{"name":"SDLSystemCapabilityTypeDisplays","abstract":"<p>The Display type capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDriverDistraction":{"name":"SDLSystemCapabilityTypeDriverDistraction","abstract":"<p>@since SDL 7.0.0</p>"},"Constants.html#/c:@SDLSystemContextMain":{"name":"SDLSystemContextMain","abstract":"<p>No user interaction (user-initiated or app-initiated) is in progress.</p>"},"Constants.html#/c:@SDLSystemContextVoiceRecognitionSession":{"name":"SDLSystemContextVoiceRecognitionSession","abstract":"<p>VR-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextMenu":{"name":"SDLSystemContextMenu","abstract":"<p>Menu-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextHMIObscured":{"name":"SDLSystemContextHMIObscured","abstract":"<p>The app&rsquo;s display HMI is currently being obscured by either a system or other app&rsquo;s overlay.</p>"},"Constants.html#/c:@SDLSystemContextAlert":{"name":"SDLSystemContextAlert","abstract":"<p>Broadcast only to whichever app has an alert currently being displayed.</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequest":{"name":"SDLTBTStateRouteUpdateRequest","abstract":"<p>The route should be updated</p>"},"Constants.html#/c:@SDLTBTStateRouteAccepted":{"name":"SDLTBTStateRouteAccepted","abstract":"<p>The route is accepted</p>"},"Constants.html#/c:@SDLTBTStateRouteRefused":{"name":"SDLTBTStateRouteRefused","abstract":"<p>The route is refused</p>"},"Constants.html#/c:@SDLTBTStateRouteCancelled":{"name":"SDLTBTStateRouteCancelled","abstract":"<p>The route is cancelled</p>"},"Constants.html#/c:@SDLTBTStateETARequest":{"name":"SDLTBTStateETARequest","abstract":"<p>The route should update its Estimated Time of Arrival</p>"},"Constants.html#/c:@SDLTBTStateNextTurnRequest":{"name":"SDLTBTStateNextTurnRequest","abstract":"<p>The route should update its next turn</p>"},"Constants.html#/c:@SDLTBTStateRouteStatusRequest":{"name":"SDLTBTStateRouteStatusRequest","abstract":"<p>The route should update its status</p>"},"Constants.html#/c:@SDLTBTStateRouteSummaryRequest":{"name":"SDLTBTStateRouteSummaryRequest","abstract":"<p>The route update its summary</p>"},"Constants.html#/c:@SDLTBTStateTripStatusRequest":{"name":"SDLTBTStateTripStatusRequest","abstract":"<p>The route should update the trip&rsquo;s status</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequestTimeout":{"name":"SDLTBTStateRouteUpdateRequestTimeout","abstract":"<p>The route update timed out</p>"},"Constants.html#/c:@SDLTPMSUnknown":{"name":"SDLTPMSUnknown","abstract":"<p>If set the status of the tire is not known.</p>"},"Constants.html#/c:@SDLTPMSSystemFault":{"name":"SDLTPMSSystemFault","abstract":"<p>TPMS does not function.</p>"},"Constants.html#/c:@SDLTPMSSensorFault":{"name":"SDLTPMSSensorFault","abstract":"<p>The sensor of the tire does not function.</p>"},"Constants.html#/c:@SDLTPMSLow":{"name":"SDLTPMSLow","abstract":"<p>TPMS is reporting a low tire pressure for the tire.</p>"},"Constants.html#/c:@SDLTPMSSystemActive":{"name":"SDLTPMSSystemActive","abstract":"<p>TPMS is active and the tire pressure is monitored.</p>"},"Constants.html#/c:@SDLTPMSTrain":{"name":"SDLTPMSTrain","abstract":"<p>TPMS is reporting that the tire must be trained.</p>"},"Constants.html#/c:@SDLTPMSTrainingComplete":{"name":"SDLTPMSTrainingComplete","abstract":"<p>TPMS reports the training for the tire is completed.</p>"},"Constants.html#/c:@SDLTPMSNotTrained":{"name":"SDLTPMSNotTrained","abstract":"<p>TPMS reports the tire is not trained.</p>"},"Constants.html#/c:@SDLTemperatureUnitCelsius":{"name":"SDLTemperatureUnitCelsius","abstract":"<p>Reflects the current HMI setting for temperature unit in Celsius</p>"},"Constants.html#/c:@SDLTemperatureUnitFahrenheit":{"name":"SDLTemperatureUnitFahrenheit","abstract":"<p>Reflects the current HMI setting for temperature unit in Fahrenheit</p>"},"Constants.html#/c:@SDLTextAlignmentLeft":{"name":"SDLTextAlignmentLeft","abstract":"<p>Text aligned left.</p>"},"Constants.html#/c:@SDLTextAlignmentRight":{"name":"SDLTextAlignmentRight","abstract":"<p>Text aligned right.</p>"},"Constants.html#/c:@SDLTextAlignmentCenter":{"name":"SDLTextAlignmentCenter","abstract":"<p>Text aligned centered.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField1":{"name":"SDLTextFieldNameMainField1","abstract":"<p>The first line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField2":{"name":"SDLTextFieldNameMainField2","abstract":"<p>The second line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField3":{"name":"SDLTextFieldNameMainField3","abstract":"<p>The first line of the second set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField4":{"name":"SDLTextFieldNameMainField4"},"Constants.html#/c:@SDLTextFieldNameTemplateTitle":{"name":"SDLTextFieldNameTemplateTitle","abstract":"<p>The title line of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameStatusBar":{"name":"SDLTextFieldNameStatusBar","abstract":"<p>The status bar on the NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaClock":{"name":"SDLTextFieldNameMediaClock","abstract":"<p>Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaTrack":{"name":"SDLTextFieldNameMediaTrack","abstract":"<p>The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText1":{"name":"SDLTextFieldNameAlertText1","abstract":"<p>The first line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText2":{"name":"SDLTextFieldNameAlertText2","abstract":"<p>The second line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText3":{"name":"SDLTextFieldNameAlertText3","abstract":"<p>The third line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameScrollableMessageBody":{"name":"SDLTextFieldNameScrollableMessageBody","abstract":"<p>Long form body of text that can include newlines and tabs. Applies to SDLScrollableMessage.</p>"},"Constants.html#/c:@SDLTextFieldNameInitialInteractionText":{"name":"SDLTextFieldNameInitialInteractionText","abstract":"<p>First line suggestion for a user response (in the case of VR enabled interaction).</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText1":{"name":"SDLTextFieldNameNavigationText1","abstract":"<p>First line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText2":{"name":"SDLTextFieldNameNavigationText2","abstract":"<p>Second line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameETA":{"name":"SDLTextFieldNameETA","abstract":"<p>Estimated Time of Arrival time for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameTotalDistance":{"name":"SDLTextFieldNameTotalDistance","abstract":"<p>Total distance to destination for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText1":{"name":"SDLTextFieldNameAudioPassThruDisplayText1","abstract":"<p>First line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText2":{"name":"SDLTextFieldNameAudioPassThruDisplayText2","abstract":"<p>Second line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderHeader":{"name":"SDLTextFieldNameSliderHeader","abstract":"<p>Header text for slider.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderFooter":{"name":"SDLTextFieldNameSliderFooter","abstract":"<p>Footer text for slider</p>"},"Constants.html#/c:@SDLTextFieldNameMenuName":{"name":"SDLTextFieldNameMenuName","abstract":"<p>Primary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameSecondaryText":{"name":"SDLTextFieldNameSecondaryText","abstract":"<p>Secondary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameTertiaryText":{"name":"SDLTextFieldNameTertiaryText","abstract":"<p>Tertiary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameMenuTitle":{"name":"SDLTextFieldNameMenuTitle","abstract":"<p>Optional text to label an app menu button (for certain touchscreen platforms)</p>"},"Constants.html#/c:@SDLTextFieldNameLocationName":{"name":"SDLTextFieldNameLocationName","abstract":"<p>Optional name / title of intended location for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameLocationDescription":{"name":"SDLTextFieldNameLocationDescription","abstract":"<p>Optional description of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameAddressLines":{"name":"SDLTextFieldNameAddressLines","abstract":"<p>Optional location address (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNamePhoneNumber":{"name":"SDLTextFieldNamePhoneNumber","abstract":"<p>Optional hone number of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameTimeToDestination":{"name":"SDLTextFieldNameTimeToDestination","abstract":"<p>Optional time to destination field for ShowConstantTBT</p>"},"Constants.html#/c:@SDLTextFieldNameTurnText":{"name":"SDLTextFieldNameTurnText","abstract":"<p>Turn text for turnList parameter of UpdateTurnList</p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText1":{"name":"SDLTextFieldNameSubtleAlertText1","abstract":"<p>The first line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText1</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText2":{"name":"SDLTextFieldNameSubtleAlertText2","abstract":"<p>The second line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText2</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertSoftButtonText":{"name":"SDLTextFieldNameSubtleAlertSoftButtonText","abstract":"<p>A text field in the soft button of a subtle alert; applies to <code>SubtleAlert</code> <code>softButtons</code></p>"},"Constants.html#/c:@SDLTextFieldNameMenuCommandSecondaryText":{"name":"SDLTextFieldNameMenuCommandSecondaryText","abstract":"<p>Secondary text for AddCommand</p>"},"Constants.html#/c:@SDLTextFieldNameMenuCommandTertiaryText":{"name":"SDLTextFieldNameMenuCommandTertiaryText","abstract":"<p>Tertiary text for AddCommand</p>"},"Constants.html#/c:@SDLTextFieldNameMenuSubMenuSecondaryText":{"name":"SDLTextFieldNameMenuSubMenuSecondaryText","abstract":"<p>Secondary text for AddSubMenu</p>"},"Constants.html#/c:@SDLTextFieldNameMenuSubMenuTertiaryText":{"name":"SDLTextFieldNameMenuSubMenuTertiaryText","abstract":"<p>Tertiary text for AddSubMenu</p>"},"Constants.html#/c:@SDLTimerModeUp":{"name":"SDLTimerModeUp","abstract":"<p>The timer should count up.</p>"},"Constants.html#/c:@SDLTimerModeDown":{"name":"SDLTimerModeDown","abstract":"<p>The timer should count down.</p>"},"Constants.html#/c:@SDLTimerModeNone":{"name":"SDLTimerModeNone","abstract":"<p>The timer should not count.</p>"},"Constants.html#/c:@SDLTouchTypeBegin":{"name":"SDLTouchTypeBegin","abstract":"<p>The touch is the beginning of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeMove":{"name":"SDLTouchTypeMove","abstract":"<p>The touch is the movement of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeEnd":{"name":"SDLTouchTypeEnd","abstract":"<p>The touch is the ending of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeCancel":{"name":"SDLTouchTypeCancel","abstract":"<p>The touch is the cancellation of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTransmissionTypeAutomatic":{"name":"SDLTransmissionTypeAutomatic","abstract":"<p>Automatic transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeContinuouslyVariable":{"name":"SDLTransmissionTypeContinuouslyVariable","abstract":"<p>Continuously variable transmission(CVT).</p>"},"Constants.html#/c:@SDLTransmissionTypeDirectDrive":{"name":"SDLTransmissionTypeDirectDrive","abstract":"<p>Direct drive between engine and wheels.</p>"},"Constants.html#/c:@SDLTransmissionTypeDualClutch":{"name":"SDLTransmissionTypeDualClutch","abstract":"<p>Dual clutch transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeElectricVariable":{"name":"SDLTransmissionTypeElectricVariable","abstract":"<p>Electric variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeInfinitelyVariable":{"name":"SDLTransmissionTypeInfinitelyVariable","abstract":"<p>Infinitely variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeManual":{"name":"SDLTransmissionTypeManual","abstract":"<p>Manual transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeSemiAutomatic":{"name":"SDLTransmissionTypeSemiAutomatic","abstract":"<p>Semi automatic transmission.</p>"},"Constants.html#/c:@SDLTriggerSourceMenu":{"name":"SDLTriggerSourceMenu","abstract":"<p>Selection made via menu</p>"},"Constants.html#/c:@SDLTriggerSourceVoiceRecognition":{"name":"SDLTriggerSourceVoiceRecognition","abstract":"<p>Selection made via Voice session</p>"},"Constants.html#/c:@SDLTriggerSourceKeyboard":{"name":"SDLTriggerSourceKeyboard","abstract":"<p>Selection made via Keyboard</p>"},"Constants.html#/c:@SDLTurnSignalOff":{"name":"SDLTurnSignalOff","abstract":"<p>Turn signal is OFF</p>"},"Constants.html#/c:@SDLTurnSignalLeft":{"name":"SDLTurnSignalLeft","abstract":"<p>Left turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalRight":{"name":"SDLTurnSignalRight","abstract":"<p>Right turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalBoth":{"name":"SDLTurnSignalBoth","abstract":"<p>Both signals (left and right) are on</p>"},"Constants.html#/c:@SDLUpdateModeCountUp":{"name":"SDLUpdateModeCountUp","abstract":"<p>Starts the media clock timer counting upward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModeCountDown":{"name":"SDLUpdateModeCountDown","abstract":"<p>Starts the media clock timer counting downward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModePause":{"name":"SDLUpdateModePause","abstract":"<p>Pauses the media clock timer.</p>"},"Constants.html#/c:@SDLUpdateModeResume":{"name":"SDLUpdateModeResume","abstract":"<p>Resumes the media clock timer. The timer resumes counting in whatever mode was in effect before pausing (i.e. COUNTUP or COUNTDOWN).</p>"},"Constants.html#/c:@SDLUpdateModeClear":{"name":"SDLUpdateModeClear","abstract":"<p>Clear the media clock timer.</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveNotConfirmed","abstract":"<p>Inactive not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveConfirmed","abstract":"<p>Inactive confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusActiveNotConfirmed","abstract":"<p>Active not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveConfirmed":{"name":"SDLVehicleDataActiveStatusActiveConfirmed","abstract":"<p>Active confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusFault":{"name":"SDLVehicleDataActiveStatusFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNoEvent":{"name":"SDLVehicleDataEventStatusNoEvent","abstract":"<p>No event</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNo":{"name":"SDLVehicleDataEventStatusNo","abstract":"<p>The event is a No status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusYes":{"name":"SDLVehicleDataEventStatusYes","abstract":"<p>The event is a Yes status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNotSupported":{"name":"SDLVehicleDataEventStatusNotSupported","abstract":"<p>Vehicle data event is not supported</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusFault":{"name":"SDLVehicleDataEventStatusFault","abstract":"<p>The event is a Fault status</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotSupported":{"name":"SDLVehicleDataNotificationStatusNotSupported","abstract":"<p>The vehicle data notification status is not supported</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNormal":{"name":"SDLVehicleDataNotificationStatusNormal","abstract":"<p>The vehicle data notification status is normal</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusActive":{"name":"SDLVehicleDataNotificationStatusActive","abstract":"<p>The vehicle data notification status is active</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotUsed":{"name":"SDLVehicleDataNotificationStatusNotUsed","abstract":"<p>The vehicle data notification status is not used</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeSuccess":{"name":"SDLVehicleDataResultCodeSuccess","abstract":"<p>Individual vehicle data item / DTC / DID request or subscription successful</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeTruncatedData":{"name":"SDLVehicleDataResultCodeTruncatedData","abstract":"<p>DTC / DID request successful, however, not all active DTCs or full contents of DID location available</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDisallowed":{"name":"SDLVehicleDataResultCodeDisallowed","abstract":"<p>This vehicle data item is not allowed for this app by SDL</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeUserDisallowed":{"name":"SDLVehicleDataResultCodeUserDisallowed","abstract":"<p>The user has not granted access to this type of vehicle data item at this time</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeInvalidId":{"name":"SDLVehicleDataResultCodeInvalidId","abstract":"<p>The ECU ID referenced is not a valid ID on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeVehicleDataNotAvailable":{"name":"SDLVehicleDataResultCodeVehicleDataNotAvailable","abstract":"<p>The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataAlreadySubscribed":{"name":"SDLVehicleDataResultCodeDataAlreadySubscribed","abstract":"<p>The vehicle data item is already subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataNotSubscribed":{"name":"SDLVehicleDataResultCodeDataNotSubscribed","abstract":"<p>The vehicle data item cannot be unsubscribed because it is not currently subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeIgnored":{"name":"SDLVehicleDataResultCodeIgnored","abstract":"<p>The request for this item is ignored because it is already in progress</p>"},"Constants.html#/c:@SDLVehicleDataStatusNoDataExists":{"name":"SDLVehicleDataStatusNoDataExists","abstract":"<p>No data available</p>"},"Constants.html#/c:@SDLVehicleDataStatusOff":{"name":"SDLVehicleDataStatusOff","abstract":"<p>The status is Off</p>"},"Constants.html#/c:@SDLVehicleDataStatusOn":{"name":"SDLVehicleDataStatusOn","abstract":"<p>The status is On</p>"},"Constants.html#/c:@SDLVehicleDataTypeGearStatus":{"name":"SDLVehicleDataTypeGearStatus","abstract":"<p>Vehicle Gear Status data"},"Constants.html#/c:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"<p>GPS vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"<p>Vehicle speed data</p>"},"Constants.html#/c:@SDLVehicleDataTypeStabilityControlsStatus":{"name":"SDLVehicleDataTypeStabilityControlsStatus","abstract":"<p>vehicle data StabilityControlsStatus to know if stability controls like ESC, Traction Control etc. are active.</p>"},"Constants.html#/c:@SDLVehicleDataTypeRPM":{"name":"SDLVehicleDataTypeRPM","abstract":"<p>Vehicle RPM data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevel":{"name":"SDLVehicleDataTypeFuelLevel","abstract":"<p>Vehicle fuel level data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevelState":{"name":"SDLVehicleDataTypeFuelLevelState","abstract":"<p>Vehicle fuel level state data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelConsumption":{"name":"SDLVehicleDataTypeFuelConsumption","abstract":"<p>Vehicle fuel consumption data</p>"},"Constants.html#/c:@SDLVehicleDataTypeExternalTemperature":{"name":"SDLVehicleDataTypeExternalTemperature","abstract":"<p>Vehicle external temperature data"},"Constants.html#/c:@SDLVehicleDataTypeVehicleDataClimateData":{"name":"SDLVehicleDataTypeVehicleDataClimateData","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLVehicleDataTypeVIN":{"name":"SDLVehicleDataTypeVIN","abstract":"<p>Vehicle VIN data</p>"},"Constants.html#/c:@SDLVehicleDataTypePRNDL":{"name":"SDLVehicleDataTypePRNDL","abstract":"<p>Vehicle PRNDL data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTirePressure":{"name":"SDLVehicleDataTypeTirePressure","abstract":"<p>Vehicle tire pressure data</p>"},"Constants.html#/c:@SDLVehicleDataTypeOdometer":{"name":"SDLVehicleDataTypeOdometer","abstract":"<p>Vehicle odometer data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBeltStatus":{"name":"SDLVehicleDataTypeBeltStatus","abstract":"<p>Vehicle belt status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBodyInfo":{"name":"SDLVehicleDataTypeBodyInfo","abstract":"<p>Vehicle body info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeDeviceStatus":{"name":"SDLVehicleDataTypeDeviceStatus","abstract":"<p>Vehicle device status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeECallInfo":{"name":"SDLVehicleDataTypeECallInfo","abstract":"<p>Vehicle emergency call info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelRange":{"name":"SDLVehicleDataTypeFuelRange","abstract":"<p>Vehicle fuel range data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAirbagStatus":{"name":"SDLVehicleDataTypeAirbagStatus","abstract":"<p>Vehicle airbag status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEmergencyEvent":{"name":"SDLVehicleDataTypeEmergencyEvent","abstract":"<p>Vehicle emergency event info</p>"},"Constants.html#/c:@SDLVehicleDataTypeClusterModeStatus":{"name":"SDLVehicleDataTypeClusterModeStatus","abstract":"<p>Vehicle cluster mode status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeMyKey":{"name":"SDLVehicleDataTypeMyKey","abstract":"<p>Vehicle MyKey data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBraking":{"name":"SDLVehicleDataTypeBraking","abstract":"<p>Vehicle braking data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWiperStatus":{"name":"SDLVehicleDataTypeWiperStatus","abstract":"<p>Vehicle wiper status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeHandsOffSteering":{"name":"SDLVehicleDataTypeHandsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel"},"Constants.html#/c:@SDLVehicleDataTypeHeadlampStatus":{"name":"SDLVehicleDataTypeHeadlampStatus","abstract":"<p>Vehicle headlamp status</p>"},"Constants.html#/c:@SDLVehicleDataTypeBatteryVoltage":{"name":"SDLVehicleDataTypeBatteryVoltage","abstract":"<p>Vehicle battery voltage data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineOilLife":{"name":"SDLVehicleDataTypeEngineOilLife","abstract":"<p>Vehicle engine oil life data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineTorque":{"name":"SDLVehicleDataTypeEngineTorque","abstract":"<p>Vehicle engine torque data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAccelerationPedal":{"name":"SDLVehicleDataTypeAccelerationPedal","abstract":"<p>Vehicle acceleration pedal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSteeringWheel":{"name":"SDLVehicleDataTypeSteeringWheel","abstract":"<p>Vehicle steering wheel data</p>"},"Constants.html#/c:@SDLVehicleDataTypeElectronicParkBrakeStatus":{"name":"SDLVehicleDataTypeElectronicParkBrakeStatus","abstract":"<p>Vehicle electronic parking brake status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTurnSignal":{"name":"SDLVehicleDataTypeTurnSignal","abstract":"<p>Vehicle turn signal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeCloudAppVehicleID":{"name":"SDLVehicleDataTypeCloudAppVehicleID","abstract":"<p>The cloud application vehicle id. Used by cloud apps to identify a head unit</p>"},"Constants.html#/c:@SDLVehicleDataTypeOEMVehicleDataType":{"name":"SDLVehicleDataTypeOEMVehicleDataType","abstract":"<p>Custom OEM Vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWindowStatus":{"name":"SDLVehicleDataTypeWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Constants.html#/c:@SDLVehicleDataTypeSeatOccupancy":{"name":"SDLVehicleDataTypeSeatOccupancy","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLVentilationModeUpper":{"name":"SDLVentilationModeUpper","abstract":"<p>The upper ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeLower":{"name":"SDLVentilationModeLower","abstract":"<p>The lower ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeBoth":{"name":"SDLVentilationModeBoth","abstract":"<p>The both ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeNone":{"name":"SDLVentilationModeNone","abstract":"<p>No ventilation mode</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH264":{"name":"SDLVideoStreamingCodecH264","abstract":"<p>H264</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH265":{"name":"SDLVideoStreamingCodecH265","abstract":"<p>H265</p>"},"Constants.html#/c:@SDLVideoStreamingCodecTheora":{"name":"SDLVideoStreamingCodecTheora","abstract":"<p>Theora</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP8":{"name":"SDLVideoStreamingCodecVP8","abstract":"<p>VP8</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP9":{"name":"SDLVideoStreamingCodecVP9","abstract":"<p>VP9</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRAW":{"name":"SDLVideoStreamingProtocolRAW","abstract":"<p>RAW</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTP":{"name":"SDLVideoStreamingProtocolRTP","abstract":"<p>RTP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTSP":{"name":"SDLVideoStreamingProtocolRTSP","abstract":"<p>RTSP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTMP":{"name":"SDLVideoStreamingProtocolRTMP","abstract":"<p>RTMP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolWebM":{"name":"SDLVideoStreamingProtocolWebM","abstract":"<p>WebM</p>"},"Constants.html#/c:@SDLVideoStreamingStateStreamable":{"name":"SDLVideoStreamingStateStreamable","abstract":"<p>STREAMABLE, the current app is allowed to stream video</p>"},"Constants.html#/c:@SDLVideoStreamingStateNotStreamable":{"name":"SDLVideoStreamingStateNotStreamable","abstract":"<p>NOT_STREAMABLE, the current app is not allowed to stream video</p>"},"Constants.html#/c:@SDLVRCapabilitiesText":{"name":"SDLVRCapabilitiesText","abstract":"<p>The SDL platform is capable of recognizing spoken text in the current language.</p>"},"Constants.html#/c:@SDLWarningLightStatusOff":{"name":"SDLWarningLightStatusOff","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusOn":{"name":"SDLWarningLightStatusOn","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusFlash":{"name":"SDLWarningLightStatusFlash","abstract":"<p>The warning light is flashing</p>"},"Constants.html#/c:@SDLWarningLightStatusNotUsed":{"name":"SDLWarningLightStatusNotUsed","abstract":"<p>The warning light is unused</p>"},"Constants.html#/c:@SDLWayPointTypeAll":{"name":"SDLWayPointTypeAll","abstract":"<p>All other waypoint types</p>"},"Constants.html#/c:@SDLWayPointTypeDestination":{"name":"SDLWayPointTypeDestination","abstract":"<p>The destination waypoint</p>"},"Constants.html#/c:@SDLWindowTypeMain":{"name":"SDLWindowTypeMain","abstract":"<p>This window type describes the main window on a display.</p>"},"Constants.html#/c:@SDLWindowTypeWidget":{"name":"SDLWindowTypeWidget","abstract":"<p>A widget is a small window that the app can create to provide information and soft buttons for quick app control.</p>"},"Constants.html#/c:@SDLWiperStatusOff":{"name":"SDLWiperStatusOff","abstract":"<p>Wiper is off</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticOff":{"name":"SDLWiperStatusAutomaticOff","abstract":"<p>Wiper is off automatically</p>"},"Constants.html#/c:@SDLWiperStatusOffMoving":{"name":"SDLWiperStatusOffMoving","abstract":"<p>Wiper is moving but off</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOff":{"name":"SDLWiperStatusManualIntervalOff","abstract":"<p>Wiper is off due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOn":{"name":"SDLWiperStatusManualIntervalOn","abstract":"<p>Wiper is on due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualLow":{"name":"SDLWiperStatusManualLow","abstract":"<p>Wiper is on low manually</p>"},"Constants.html#/c:@SDLWiperStatusManualHigh":{"name":"SDLWiperStatusManualHigh","abstract":"<p>Wiper is on high manually</p>"},"Constants.html#/c:@SDLWiperStatusManualFlick":{"name":"SDLWiperStatusManualFlick","abstract":"<p>Wiper is on for a single wipe manually</p>"},"Constants.html#/c:@SDLWiperStatusWash":{"name":"SDLWiperStatusWash","abstract":"<p>Wiper is in wash mode</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticLow":{"name":"SDLWiperStatusAutomaticLow","abstract":"<p>Wiper is on low automatically</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticHigh":{"name":"SDLWiperStatusAutomaticHigh","abstract":"<p>Wiper is on high automatically</p>"},"Constants.html#/c:@SDLWiperStatusCourtesyWipe":{"name":"SDLWiperStatusCourtesyWipe","abstract":"<p>Wiper is performing a courtesy wipe</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticAdjust":{"name":"SDLWiperStatusAutomaticAdjust","abstract":"<p>Wiper is on automatic adjust</p>"},"Constants.html#/c:@SDLWiperStatusStalled":{"name":"SDLWiperStatusStalled","abstract":"<p>Wiper is stalled</p>"},"Constants.html#/c:@SDLWiperStatusNoDataExists":{"name":"SDLWiperStatusNoDataExists","abstract":"<p>Wiper data is not available</p>"},"Constants.html#/c:@SmartDeviceLinkVersionNumber":{"name":"SmartDeviceLinkVersionNumber","abstract":"<p>Project version number for SmartDeviceLink.</p>"},"Constants.html#/c:@SmartDeviceLinkVersionString":{"name":"SmartDeviceLinkVersionString","abstract":"<p>Project version string for SmartDeviceLink.</p>"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(im)initWithType:maximumNumberOfWindows:":{"name":"-initWithType:maximumNumberOfWindows:","abstract":"<p>Init with required parameters</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)type":{"name":"type","abstract":"<p>Type of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)maximumNumberOfWindows":{"name":"maximumNumberOfWindows","abstract":"<p>Number of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(im)initWithLocation:state:":{"name":"-initWithLocation:state:","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)location":{"name":"location","abstract":"<p>location</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)state":{"name":"state","abstract":"<p>state</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(im)initWithApproximatePosition:deviation:":{"name":"-initWithApproximatePosition:deviation:","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)approximatePosition":{"name":"approximatePosition","abstract":"<p>The approximate percentage that the window is open - 0 being fully closed, 100 being fully open</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)deviation":{"name":"deviation","abstract":"<p>The percentage deviation of the approximatePosition. e.g. If the approximatePosition is 50 and the deviation is 10, then the window&rsquo;s location is somewhere between 40 and 60.</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)windowID":{"name":"windowID","abstract":"<p>The specified ID of the window. Can be set to a predefined window, or omitted for the main window on the main display.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)textFields":{"name":"textFields","abstract":"<p>A set of all fields that support text data. - see: TextField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageFields":{"name":"imageFields","abstract":"<p>A set of all fields that support images. - see: ImageField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>Provides information about image types supported by the system.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>A set of all window templates available on the head unit.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-window custom presets available (if any); otherwise omitted.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The number of buttons and the capabilities of each on-window button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The number of soft buttons available on-window and the capabilities for each button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)menuLayoutsAvailable":{"name":"menuLayoutsAvailable","abstract":"<p>An array of available menu layouts. If this parameter is not provided, only the <code>LIST</code> layout is assumed to be available.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)dynamicUpdateCapabilities":{"name":"dynamicUpdateCapabilities","abstract":"<p>Contains the head unit&rsquo;s capabilities for dynamic updating features declaring if the module will send dynamic update RPCs.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)keyboardCapabilities":{"name":"keyboardCapabilities","abstract":"<p>See KeyboardCapabilities</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(im)initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:":{"name":"-initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)currentForecastSupported":{"name":"currentForecastSupported","abstract":"<p>Whether or not the current forecast is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMultidayForecastAmount":{"name":"maxMultidayForecastAmount","abstract":"<p>The maximum number of day-by-day forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxHourlyForecastAmount":{"name":"maxHourlyForecastAmount","abstract":"<p>The maximum number of hour-by-hour forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMinutelyForecastAmount":{"name":"maxMinutelyForecastAmount","abstract":"<p>The maximum number of minute-by-minute forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)weatherForLocationSupported":{"name":"weatherForLocationSupported","abstract":"<p>Whether or not the weather for location is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:":{"name":"-initWithLocation:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:":{"name":"-initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)location":{"name":"location","abstract":"<p>The location.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)currentForecast":{"name":"currentForecast","abstract":"<p>The current forecast.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)minuteForecast":{"name":"minuteForecast","abstract":"<p>A minute-by-minute array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)hourlyForecast":{"name":"hourlyForecast","abstract":"<p>An hour-by-hour array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)multidayForecast":{"name":"multidayForecast","abstract":"<p>A day-by-day array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)alerts":{"name":"alerts","abstract":"<p>An array of weather alerts. This array should be ordered with the first object being the current day.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(im)initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:":{"name":"-initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The current temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureHigh":{"name":"temperatureHigh","abstract":"<p>The predicted high temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureLow":{"name":"temperatureLow","abstract":"<p>The predicted low temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperature":{"name":"apparentTemperature","abstract":"<p>The apparent temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureHigh":{"name":"apparentTemperatureHigh","abstract":"<p>The predicted high apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureLow":{"name":"apparentTemperatureLow","abstract":"<p>The predicted low apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherSummary":{"name":"weatherSummary","abstract":"<p>A summary of the weather.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)time":{"name":"time","abstract":"<p>The time this data refers to.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)humidity":{"name":"humidity","abstract":"<p>From 0 to 1, percentage humidity.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)cloudCover":{"name":"cloudCover","abstract":"<p>From 0 to 1, percentage cloud cover.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)moonPhase":{"name":"moonPhase","abstract":"<p>From 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windBearing":{"name":"windBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windGust":{"name":"windGust","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windSpeed":{"name":"windSpeed","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormBearing":{"name":"nearestStormBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormDistance":{"name":"nearestStormDistance","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipAccumulation":{"name":"precipAccumulation","abstract":"<p>In cm</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipIntensity":{"name":"precipIntensity","abstract":"<p>In cm of water per hour.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipProbability":{"name":"precipProbability","abstract":"<p>From 0 to 1, percentage chance.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipType":{"name":"precipType","abstract":"<p>A description of the precipitation type (e.g. &ldquo;rain&rdquo;, &ldquo;snow&rdquo;, &ldquo;sleet&rdquo;, &ldquo;hail&rdquo;)</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)visibility":{"name":"visibility","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherIcon":{"name":"weatherIcon","abstract":"<p>The weather icon image.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(im)initWithTitle:summary:expires:regions:severity:timeIssued:":{"name":"-initWithTitle:summary:expires:regions:severity:timeIssued:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)title":{"name":"title","abstract":"<p>The title of the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)summary":{"name":"summary","abstract":"<p>A summary for the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)expires":{"name":"expires","abstract":"<p>The date the alert expires.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)regions":{"name":"regions","abstract":"<p>Regions affected.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)severity":{"name":"severity","abstract":"<p>Severity of the weather alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)timeIssued":{"name":"timeIssued","abstract":"<p>The date the alert was issued.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:":{"name":"-initWithText:image:","abstract":"<p>Convenience init to create a VR help item with the following parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:position:":{"name":"-initWithText:image:position:","abstract":"<p>Convenience init to create a VR help item with all parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)text":{"name":"text","abstract":"<p>Text to display for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)image":{"name":"image","abstract":"<p>Image for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)position":{"name":"position","abstract":"<p>Position to display item in VR Help list</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(im)initWithVoiceCommands:handler:":{"name":"-initWithVoiceCommands:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumAspectRatio":{"name":"minimumAspectRatio","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumAspectRatio":{"name":"maximumAspectRatio","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumDiagonal":{"name":"minimumDiagonal","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumResolution":{"name":"minimumResolution","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumResolution":{"name":"maximumResolution","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)isImageResolutionInRange:":{"name":"-isImageResolutionInRange:","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)isAspectRatioInRange:":{"name":"-isAspectRatioInRange:","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)initWithMinimumResolution:maximumResolution:":{"name":"-initWithMinimumResolution:maximumResolution:","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(cm)disabled":{"name":"+disabled","abstract":"<p>Undocumented</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)protocol":{"name":"protocol","abstract":"<p>Protocol type, see VideoStreamingProtocol</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)codec":{"name":"codec","abstract":"<p>Codec type, see VideoStreamingCodec</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(im)initWithCodec:protocol:":{"name":"-initWithCodec:protocol:","abstract":"<p>Convenience init</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredResolution":{"name":"preferredResolution","abstract":"<p>The preferred resolution of a video stream for decoding and rendering on HMI</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)maxBitrate":{"name":"maxBitrate","abstract":"<p>The maximum bitrate of video stream that is supported, in kbps, optional</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>Detailed information on each format supported by this system, in its preferred order</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported":{"name":"hapticSpatialDataSupported","abstract":"<p>True if the system can utilize the haptic spatial data from the source being streamed.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)diagonalScreenSize":{"name":"diagonalScreenSize","abstract":"<p>The diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)pixelPerInch":{"name":"pixelPerInch","abstract":"<p>The diagonal resolution in pixels divided by the diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)additionalVideoStreamingCapabilities":{"name":"additionalVideoStreamingCapabilities","abstract":"<p>{&ldquo;array_min_size&rdquo;: 1, &ldquo;array_max_size&rdquo;: 100}</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredFPS":{"name":"preferredFPS","abstract":"<p>The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)major":{"name":"major","abstract":"<p>Major version (e.g. X.0.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)minor":{"name":"minor","abstract":"<p>Minor version (e.g. 0.X.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)patch":{"name":"patch","abstract":"<p>Patch version (e.g. 0.0.X)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)stringVersion":{"name":"stringVersion","abstract":"<p>A String format of the current SDLVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithMajor:minor:patch:":{"name":"-initWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithMajor:minor:patch:":{"name":"+versionWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithString:":{"name":"-initWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithString:":{"name":"+versionWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithSDLMsgVersion:":{"name":"-initWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSDLMsgVersion:":{"name":"+versionWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)compare:":{"name":"-compare:","abstract":"<p>Compare two SDLVersions</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanVersion:":{"name":"-isLessThanVersion:","abstract":"<p>Compare is less than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isEqualToVersion:":{"name":"-isEqualToVersion:","abstract":"<p>Compare is equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanVersion:":{"name":"-isGreaterThanVersion:","abstract":"<p>Compare is greater than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanOrEqualToVersion:":{"name":"-isGreaterThanOrEqualToVersion:","abstract":"<p>Compare is greater than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanOrEqualToVersion:":{"name":"-isLessThanOrEqualToVersion:","abstract":"<p>Compare is less than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)make":{"name":"make","abstract":"<p>The make of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)model":{"name":"model","abstract":"<p>The model of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)modelYear":{"name":"modelYear","abstract":"<p>The model year of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)trim":{"name":"trim","abstract":"<p>The trim of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(im)initWithMake:model:modelYear:trim:":{"name":"-initWithMake:model:modelYear:trim:","abstract":"<p>Initialize the object</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithDataType:resultCode:":{"name":"-initWithDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a dataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithCustomOEMDataType:resultCode:":{"name":"-initWithCustomOEMDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a customDataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)dataType":{"name":"dataType","abstract":"<p>Defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)customOEMDataType":{"name":"customOEMDataType","abstract":"<p>OEM custom defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)resultCode":{"name":"resultCode","abstract":"<p>Published data result code</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(im)initWithTurnList:softButtons:":{"name":"-initWithTurnList:softButtons:","abstract":"<p>Convenience init to update a list of maneuvers for navigation</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)turnList":{"name":"turnList","abstract":"<p>Optional, SDLTurn, 1 - 100 entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)softButtons":{"name":"softButtons","abstract":"<p>Required, SDLSoftButton, 0 - 1 Entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to unsubscribe to the GPSData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to unsubscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to unsubscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to unsubscribe to the fuel level state.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to unsubscribe to the fuel range.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to unsubscribe to the tireStatus.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to unsubscribe to the odometer in km.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the seat belts.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to unsubscribe to the body information including power modes.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to unsubscribe to the device status including signal and battery strength.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to unsubscribe to the status of the brake pedal.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the wipers.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>The result of requesting to unsubscribe from the status of driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the head lamps.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to unsubscribe to the emergency call info</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to unsubscribe to the airbag status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to unsubscribe to the emergency event</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to unsubscribe to the cluster modes</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to unsubscribe to the myKey status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to unsubscribe to the electronic parking brake status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to unsubscribe to the turn signal</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to unsubscribe to the cloud app vehicle id</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for unsubscribing to all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>If true, unsubscribes from GPS</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>If true, unsubscribes from Speed</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>If true, unsubscribes from RPM</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>If true, unsubscribes from Fuel Level</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>If true, unsubscribes from Fuel Level State</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>If true, unsubscribes from Fuel Range</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>If true, unsubscribes from Instant Fuel Consumption</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>If true, unsubscribes from Tire Pressure</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>If true, unsubscribes from Odometer</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>If true, unsubscribes from Belt Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>If true, unsubscribes from Body Information</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>If true, unsubscribes from Device Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>If true, unsubscribes from Driver Braking</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>If true, unsubscribes from Wiper Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>If true, unsubscribes from Head Lamp Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>If true, unsubscribes from Engine Oil Life</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>If true, unsubscribes from Engine Torque</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>If true, unsubscribes from Acc Pedal Position</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>If true, unsubscribes from Steering Wheel Angle data</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>If true, unsubscribes from eCallInfo</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>If true, unsubscribes from Airbag Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>If true, unsubscribes from Emergency Event</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>If true, unsubscribes from Cluster Mode Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>If true, unsubscribes from My Key</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, unsubscribes to the Electronic Parking Brake Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, unsubscribes to the Turn Signal</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, unsubscribes to the Cloud App Vehicle ID</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(im)initWithButtonName:":{"name":"-initWithButtonName:","abstract":"<p>Convenience init to unsubscribe from a subscription button</p>","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>A name of the button to unsubscribe from","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(im)initWithServiceID:":{"name":"-initWithServiceID:","abstract":"<p>Create an instance of UnpublishAppService with the serviceID that corresponds with the service to be unpublished</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(py)serviceID":{"name":"serviceID","abstract":"<p>The ID of the service to be unpublished.</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(im)initWithNavigationText:turnIcon:":{"name":"-initWithNavigationText:turnIcon:","abstract":"<p>Convenience init to UpdateTurnList for navigation</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)navigationText":{"name":"navigationText","abstract":"<p>Individual turn text. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)turnIcon":{"name":"turnIcon","abstract":"<p>Individual turn icon. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventDelegate":{"name":"touchEventDelegate","abstract":"<p>Notified of processed touches such as pinches, pans, and taps</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventHandler":{"name":"touchEventHandler","abstract":"<p>Returns all OnTouchEvent notifications as SDLTouch and SDLTouchType objects.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapDistanceThreshold":{"name":"tapDistanceThreshold","abstract":"<p>Distance between two taps on the screen, in the head unit&rsquo;s coordinate system, used for registering double-tap callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)panDistanceThreshold":{"name":"panDistanceThreshold","abstract":"<p>Minimum distance for a pan gesture in the head unit&rsquo;s coordinate system, used for registering pan callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapTimeThreshold":{"name":"tapTimeThreshold","abstract":"<p>Time (in seconds) between tap events to register a double-tap callback. This must be greater than 0.0.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)enableSyncedPanning":{"name":"enableSyncedPanning","abstract":"<p>If set to NO, the display link syncing will be ignored. Defaults to YES.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"<p>Boolean denoting whether or not the touch manager should deliver touch event callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"<p>Cancels pending touch event timers that may be in progress.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)initWithHitTester:videoScaleManager:":{"name":"-initWithHitTester:videoScaleManager:","abstract":"<p>Initialize a touch manager with a hit tester and a video scale manager.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)syncFrame":{"name":"-syncFrame","abstract":"<p>Called by SDLStreamingMediaManager in sync with the streaming framerate. This helps to moderate panning gestures by allowing the UI to be modified in time with the framerate.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)pressAvailable":{"name":"pressAvailable","abstract":"<p>Whether or not long presses are available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)multiTouchAvailable":{"name":"multiTouchAvailable","abstract":"<p>Whether or not multi-touch (e.g. a pinch gesture) is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)doublePressAvailable":{"name":"doublePressAvailable","abstract":"<p>Whether or not a double tap is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)touchEventId":{"name":"touchEventId","abstract":"<p>A touch&rsquo;s unique identifier. The application can track the current touch events by id.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)timeStamp":{"name":"timeStamp","abstract":"<p>The time that the touch was recorded. This number can the time since the beginning of the session or something else as long as the units are in milliseconds.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)coord":{"name":"coord","abstract":"<p>The touch&rsquo;s coordinate</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)x":{"name":"x","abstract":"<p>The x value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)y":{"name":"y","abstract":"<p>The y value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(im)initWithTouchEvent:":{"name":"-initWithTouchEvent:","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)identifier":{"name":"identifier","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)location":{"name":"location","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)timeStamp":{"name":"timeStamp","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isFirstFinger":{"name":"isFirstFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isSecondFinger":{"name":"isSecondFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)pressureTelltale":{"name":"pressureTelltale","abstract":"<p>Status of the Tire Pressure Telltale. See WarningLightStatus.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftFront":{"name":"leftFront","abstract":"<p>The status of the left front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightFront":{"name":"rightFront","abstract":"<p>The status of the right front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftRear":{"name":"leftRear","abstract":"<p>The status of the left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightRear":{"name":"rightRear","abstract":"<p>The status of the right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerLeftRear":{"name":"innerLeftRear","abstract":"<p>The status of the inner left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerRightRear":{"name":"innerRightRear","abstract":"<p>The status of the inner right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)name":{"name":"name","abstract":"<p>The enumeration identifying the field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)characterSet":{"name":"characterSet","abstract":"<p>The set of characters that are supported by this text field. All text is sent in UTF-8 format, but not all systems may support all of the characters expressed by UTF-8. All systems will support at least ASCII, but they may support more, either the LATIN-1 character set, or the full UTF-8 character set.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)width":{"name":"width","abstract":"<p>The number of characters in one row of this field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)rows":{"name":"rows","abstract":"<p>The number of rows for this text field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(im)initWithName:characterSet:width:rows:":{"name":"-initWithName:characterSet:width:rows:","abstract":"<p>Convenience initializer for the TextField RPC struct</p>","parent_name":"SDLTextField"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Constructor with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:":{"name":"-initWithTemplate:","abstract":"<p>Init with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:dayColorScheme:nightColorScheme:":{"name":"-initWithTemplate:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience constructor with all the parameters.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)template":{"name":"template","abstract":"<p>Predefined or dynamically created window template. Currently only predefined window template layouts are defined.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:":{"name":"-initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryColor:secondaryColor:backgroundColor:":{"name":"-initWithPrimaryColor:secondaryColor:backgroundColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)primaryColor":{"name":"primaryColor","abstract":"<p>The &ldquo;primary&rdquo; color. This must always be your primary brand color. If the OEM only uses one color, this will be the color. It is recommended to the OEMs that the primaryColor should change the <code>mediaClockTimer</code> bar and the highlight color of soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)secondaryColor":{"name":"secondaryColor","abstract":"<p>The &ldquo;secondary&rdquo; color. This may be an accent or complimentary color to your primary brand color. If the OEM uses this color, they must also use the primary color. It is recommended to the OEMs that the secondaryColor should change the background color of buttons, such as soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color to be used on the template. If the OEM does not support this parameter, assume on &ldquo;dayColorScheme&rdquo; that this will be a light color, and on &ldquo;nightColorScheme&rdquo; a dark color. You should do the same for your custom schemes.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithFahrenheitValue:":{"name":"-initWithFahrenheitValue:","abstract":"<p>Convenience init for a fahrenheit temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithCelsiusValue:":{"name":"-initWithCelsiusValue:","abstract":"<p>Convenience init for a celsius temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithUnit:value:":{"name":"-initWithUnit:value:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)unit":{"name":"unit","abstract":"<p>Temperature unit</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)value":{"name":"value","abstract":"<p>Temperature value in specified unit. Range depends on OEM and is not checked by SDL.</p>","parent_name":"SDLTemperature"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(im)initWithText:type:":{"name":"-initWithText:type:","abstract":"<p>Initialize with text and a type</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)textChunksFromString:":{"name":"+textChunksFromString:","abstract":"<p>Create TTS using text</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)sapiChunksFromString:":{"name":"+sapiChunksFromString:","abstract":"<p>Create TTS using SAPI</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)lhPlusChunksFromString:":{"name":"+lhPlusChunksFromString:","abstract":"<p>Create TTS using LH Plus</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)prerecordedChunksFromString:":{"name":"+prerecordedChunksFromString:","abstract":"<p>Create TTS using prerecorded chunks</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)silenceChunks":{"name":"+silenceChunks","abstract":"<p>Create TTS using silence</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)fileChunksWithName:":{"name":"+fileChunksWithName:","abstract":"<p>Create &ldquo;TTS&rdquo; to play an audio file previously uploaded to the system.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)text":{"name":"text","abstract":"<p>Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the &ldquo;type&rdquo; field.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)type":{"name":"type","abstract":"<p>The type of information in the &ldquo;text&rdquo; field (e.g. phrase to be spoken, phoneme specification, name of pre-recorded sound).</p>","parent_name":"SDLTTSChunk"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithType:fileName:":{"name":"-initWithType:fileName:","abstract":"<p>Create a generic system request with a file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithProprietaryType:fileName:":{"name":"-initWithProprietaryType:fileName:","abstract":"<p>Create an OEM_PROPRIETARY system request with a subtype and file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request. Note that Proprietary requests should forward the binary data to the known proprietary module on the system.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)fileName":{"name":"fileName","abstract":"<p>Filename of HTTP data to store in predefined system staging area.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)vehicleType":{"name":"vehicleType","abstract":"<p>The connected module&rsquo;s vehicle type: it&rsquo;s make, model, trim, and model year</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The connected module&rsquo;s software version</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)systemHardwareVersion":{"name":"systemHardwareVersion","abstract":"<p>The connected module&rsquo;s hardware version</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(im)initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:":{"name":"-initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:","abstract":"<p>Initialize a system info object with individual pieces</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(im)initWithVehicleType:softwareVersion:hardwareVersion:":{"name":"-initWithVehicleType:softwareVersion:hardwareVersion:","abstract":"<p>Initialize a system info object with the vehicle type and versions</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displays":{"name":"displays","abstract":"<p>Provides window capabilities of all displays connected with SDL. By default, one display is connected and supported which includes window capability information of the default main window of the display. May be nil if the system has not provided display and window capability information yet.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>If returned, the platform supports on-screen SoftButtons</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)prerecordedSpeechCapabilities":{"name":"prerecordedSpeechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)vrCapability":{"name":"vrCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)pcmStreamCapability":{"name":"pcmStreamCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>If returned, the platform supports app services</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>If returned, the platform supports navigation</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>If returned, the platform supports making phone calls</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>If returned, the platform supports video streaming</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>If returned, the platform supports remote control capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>If returned, the platform supports remote control capabilities for seats</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>If returned, the platform supports driver distraction capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)defaultMainWindowCapability":{"name":"defaultMainWindowCapability","abstract":"<p>Returns the window capability object of the default main window which is always pre-created by the connected system. This is a convenience method for easily accessing the capabilities of the default main window.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)supportsSubscriptions":{"name":"supportsSubscriptions","abstract":"<p>YES if subscriptions are available on the connected module and you will automatically be notified if the value changes on the module. If NO, calls to <code>subscribe</code> methods will subscribe to updates, but the module will not automatically notify you. You will need to call <code>updateWithCapabilityType:completionHandler:</code> to force an update if you need one (though this should be rare). This does not apply to the <code>DISPLAYS</code> capability type which you can always subscribe to.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)init":{"name":"-init","abstract":"<p>Init is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"<p>Creates a new system capability manager with a specified connection manager</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)start":{"name":"-start","abstract":"<p>Starts the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)windowCapabilityWithWindowID:":{"name":"-windowCapabilityWithWindowID:","abstract":"<p>Returns the window capability of one of your app&rsquo;s windows with the specified window ID that is on the primary display (i.e. the head unit itself). This is a convenience method to easily access capabilities of windows such as your apps&rsquo; widget windows.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)isCapabilitySupported:":{"name":"-isCapabilitySupported:","abstract":"<p>Returns whether or not the capability type is supported on the module. You can use this to check if subscribing to the capability will work. If this returns NO, then the feature is not supported by the head unit. If YES, the feature is supported by the head unit. You can subscribe to the capability type to get more information about the capability&rsquo;s support and features on the connected module.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)updateCapabilityType:completionHandler:":{"name":"-updateCapabilityType:completionHandler:","abstract":"<p>This method has been superseded by the <code>subscribeToCapabilityType:</code> methods. You should use one of those methods instead unless you only want a value once (you don&rsquo;t want to keep a long-lasting observer) and it must be current (most capabilities do not need to be updated). If you have a separate subscription observer and are connected to a head unit that does not support subscriptions, when this method returns, it will also call all subscription callbacks that you&rsquo;ve set up with the new value if there is one. Therefore, you can use this method to force an update to all subscriptions of that particular type on head units that don&rsquo;t support subscriptions (<code>supportsSubscriptions == NO</code>).</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withUpdateHandler:":{"name":"-subscribeToCapabilityType:withUpdateHandler:","abstract":"<p>Subscribe to a particular capability type using a handler callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withObserver:selector:":{"name":"-subscribeToCapabilityType:withObserver:selector:","abstract":"<p>Subscribe to a particular capability type with a selector callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)unsubscribeFromCapabilityType:withObserver:":{"name":"-unsubscribeFromCapabilityType:withObserver:","abstract":"<p>Unsubscribe from a particular capability type. If it was subscribed with a block / handler, the return value should be passed to the <code>observer</code> to unsubscribe the block. If it was subscribed with a selector, the <code>observer</code> object (on which the selector exists and is called) should be passed to unsubscribe the object selector.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithAppServicesCapabilities:":{"name":"-initWithAppServicesCapabilities:","abstract":"<p>Convenience init for an App Service Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithNavigationCapability:":{"name":"-initWithNavigationCapability:","abstract":"<p>Convenience init for a Navigation Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithPhoneCapability:":{"name":"-initWithPhoneCapability:","abstract":"<p>Convenience init for a Phone Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithVideoStreamingCapability:":{"name":"-initWithVideoStreamingCapability:","abstract":"<p>Convenience init for a Video Streaming Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithRemoteControlCapability:":{"name":"-initWithRemoteControlCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDisplayCapabilities:":{"name":"-initWithDisplayCapabilities:","abstract":"<p>Convenience init for DisplayCapability list</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithSeatLocationCapability:":{"name":"-initWithSeatLocationCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDriverDistractionCapability:":{"name":"-initWithDriverDistractionCapability:","abstract":"<p>Convenience init for a Driver Distraction capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other parameter included.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>Describes the capabilities of app services including what service types are supported and the current state of services.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>Describes the extended capabilities of the onboard navigation system</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s phone feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes the capabilities of the module&rsquo;s video streaming feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s remote control feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>Describes information about the locations of each seat</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contain the display related information and all windows related to that display</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>Describes capabilities when the driver is distracted</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(im)initWithTryAgainTime:":{"name":"-initWithTryAgainTime:","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in milliseconds) that an app must wait before resending an alert. If provided, another system event or overlay currently has a higher priority than this alert. An app must not send an alert without waiting at least the amount of time dictated.","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(im)initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:":{"name":"-initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed for the corresponding alert. See Image. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least one item.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)duration":{"name":"duration","abstract":"<p>Timeout in milliseconds. Typical timeouts are 3-5 seconds. If omitted, timeout is set to 5s.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)softButtons":{"name":"softButtons","abstract":"<p>App defined SoftButtons. If omitted on supported displays, the displayed alert shall not have any SoftButtons.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to subscribe to the GPSData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to subscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to subscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to subscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to subscribe to the fuel level state.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to subscribe to the fuel range.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to subscribe to the tireStatus.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to subscribe to the odometer in km.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to subscribe to the status of the seat belts.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to subscribe to the body information including power modes.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to subscribe to the device status including signal and battery strength.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to subscribe to the status of the brake pedal.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to subscribe to the status of the wipers.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to subscribe to the status of the head lamps.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to subscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to subscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to subscribe to the emergency call info</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to subscribe to the airbag status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to subscribe to the emergency event</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to subscribe to the cluster modes</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to subscribe to the myKey status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to subscribe to the electronic parking brake status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to subscribe to the turn signal</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to subscribe to the cloud app vehicle ID</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, subscribes GPS data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, subscribes Speed data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, subscribes RPM data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, subscribes Fuel Level data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, subscribes Fuel Level State data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, subscribes Fuel Range data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, subscribes Instant Fuel Consumption data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, subscribes Tire Pressure status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, subscribes Odometer data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, subscribes Belt Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, subscribes Body Information data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, subscribes Device Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, subscribes Driver Braking data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, subscribes Wiper Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, subscribes Head Lamp Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, subscribes to Engine Oil Life data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, subscribes Engine Torque data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, subscribes Acc Pedal Position data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, subscribes Steering Wheel Angle data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, subscribes eCall Info data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, subscribes Airbag Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, subscribes Emergency Event data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, subscribes Cluster Mode Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, subscribes myKey data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, subscribes to the electronic parking brake status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, subscribes to the turn signal status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, subscribes to the cloud app vehicle ID.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithButtonName:handler:":{"name":"-initWithButtonName:handler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs with a button name.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you subscribed to is selected.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button to subscribe to","parent_name":"SDLSubscribeButton"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)displayViewportResolution":{"name":"displayViewportResolution","abstract":"<p>The screen resolution of the connected display. The units are pixels.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)appViewportFrame":{"name":"appViewportFrame","abstract":"<p>The frame of the app&rsquo;s projecting view. This is calculated by dividing the display&rsquo;s viewport resolution by the scale. The units are points.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)init":{"name":"-init","abstract":"<p>Creates a default streaming video scale manager.","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)initWithScale:displayViewportResolution:":{"name":"-initWithScale:displayViewportResolution:","abstract":"<p>Convenience init for creating the manager with a scale and connected display viewport resolution.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleTouchEventCoordinates:":{"name":"-scaleTouchEventCoordinates:","abstract":"<p>Scales the coordinates of an <code>OnTouchEvent</code> from the display&rsquo;s coordinate system to the app&rsquo;s viewport coordinate system. If the scale value is less than 1.0, the touch events will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleHapticRect:":{"name":"-scaleHapticRect:","abstract":"<p>Scales a haptic rectangle from the app&rsquo;s viewport coordinate system to the display&rsquo;s coordinate system. If the scale value is less than 1.0, the haptic rectangle will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)makeScaledResolution":{"name":"-makeScaledResolution","abstract":"<p>Create and return the current display resolution respecting the scale factor</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(cm)scale:size:":{"name":"+scale:size:","abstract":"<p>Calculate a new size based on the given size and the scale factor</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager":{"name":"touchManager","abstract":"<p>Touch Manager responsible for providing touch event notifications.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioManager":{"name":"audioManager","abstract":"<p>Audio Manager responsible for managing streaming audio.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)rootViewController":{"name":"rootViewController","abstract":"<p>This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html\">SDLStreamingMediaConfiguration</a></code> <code>rootViewController</code>. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)focusableItemManager":{"name":"focusableItemManager","abstract":"<p>A haptic interface that can be updated to reparse views within the window you&rsquo;ve provided. Send a <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLDidUpdateProjectionView\">SDLDidUpdateProjectionView</a></code> notification or call the <code>updateInterfaceLayout</code> method to reparse. The &ldquo;output&rdquo; of this haptic interface occurs in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager\">touchManager</a></code> property where it will call the delegate.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)streamingSupported":{"name":"streamingSupported","abstract":"<p>Whether or not video streaming is supported</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoConnected":{"name":"videoConnected","abstract":"<p>Whether or not the video session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoEncrypted":{"name":"videoEncrypted","abstract":"<p>Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioEncrypted":{"name":"audioEncrypted","abstract":"<p>Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoStreamingPaused":{"name":"videoStreamingPaused","abstract":"<p>Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)screenSize":{"name":"screenSize","abstract":"<p>The current screen resolution of the connected display in pixels.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoFormat":{"name":"videoFormat","abstract":"<p>This is the agreed upon format of video encoder that is in use, or nil if not currently connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>A list of all supported video formats by this manager</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)pixelBufferPool":{"name":"pixelBufferPool","abstract":"<p>The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)requestedEncryptionType":{"name":"requestedEncryptionType","abstract":"<p>The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)showVideoBackgroundDisplay":{"name":"showVideoBackgroundDisplay","abstract":"<p>When YES, the StreamingMediaManager will send a black screen with &ldquo;Video Backgrounded String&rdquo;. Defaults to YES.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)initWithConnectionManager:configuration:systemCapabilityManager:":{"name":"-initWithConnectionManager:configuration:systemCapabilityManager:","abstract":"<p>Create a new streaming media manager for navigation and projection apps with a specified configuration.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startWithProtocol:":{"name":"-startWithProtocol:","abstract":"<p>Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopAudio":{"name":"-stopAudio","abstract":"<p>Stop the audio feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopVideo":{"name":"-stopVideo","abstract":"<p>Stop the video feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:":{"name":"-sendVideoData:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:presentationTimestamp:":{"name":"-sendVideoData:presentationTimestamp:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)maximumDesiredEncryption":{"name":"maximumDesiredEncryption","abstract":"<p>What encryption level video/audio streaming should be. The default is SDLStreamingEncryptionFlagAuthenticateAndEncrypt.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)customVideoEncoderSettings":{"name":"customVideoEncoderSettings","abstract":"<p>Properties to use for applications that utilize the video encoder for streaming. See VTCompressionProperties.h for more details. For example, you can set kVTCompressionPropertyKey_ExpectedFrameRate to set your framerate. Setting the framerate this way will also set the framerate if you use CarWindow automatic streaming.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)dataSource":{"name":"dataSource","abstract":"<p>Usable to change run time video stream setup behavior. Only use this and modify the results if you <em>really</em> know what you&rsquo;re doing. The head unit defaults are generally good.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController":{"name":"rootViewController","abstract":"<p>Set the initial view controller your video streaming content is within.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)carWindowRenderingType":{"name":"carWindowRenderingType","abstract":"<p>Declares if CarWindow will use layer rendering or view rendering. Defaults to layer rendering.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)enableForcedFramerateSync":{"name":"enableForcedFramerateSync","abstract":"<p>When YES, the StreamingMediaManager will run a CADisplayLink with the framerate set to the video encoder settings kVTCompressionPropertyKey_ExpectedFrameRate. This then forces TouchManager (and CarWindow, if used) to sync their callbacks to the framerate. If using CarWindow, this <em>must</em> be YES. If NO, <code>enableSyncedPanning</code> on SDLTouchManager will be set to NO. Defaults to YES.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)allowMultipleViewControllerOrientations":{"name":"allowMultipleViewControllerOrientations","abstract":"<p>When YES, the StreamingMediaManager will disable its internal checks that the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController\">rootViewController</a></code> only has one <code>supportedOrientation</code>. Having multiple orientations can cause streaming issues. If you wish to disable this check, set it to YES. Defaults to NO.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)supportedLandscapeStreamingRange":{"name":"supportedLandscapeStreamingRange","abstract":"<p>Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all lanscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a <code>disabled</code> video streaming range.","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)supportedPortraitStreamingRange":{"name":"supportedPortraitStreamingRange","abstract":"<p>Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all portrait streaming ranges. If you wish to disable support for streaming in portrait mode, set a <code>disabled</code> video streaming range.","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)delegate":{"name":"delegate","abstract":"<p>The configuration delegate, this is an object conforming to the SDLStreamingVideoDelegate protocol. If video streaming parameters change then this object will be called on.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)init":{"name":"-init","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfiguration":{"name":"+secureConfiguration","abstract":"<p>Create a secure video streaming configuration. Security managers will be provided from SDLEncryptionConfiguration and the encryption flag will be set to SDLStreamingEncryptionFlagAuthenticateAndEncrypt. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:dataSource:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)insecureConfiguration":{"name":"+insecureConfiguration","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually. This is equivalent to <code>init</code>.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingInsecureConfigurationWithInitialViewController:":{"name":"+autostreamingInsecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow insecure configuration with a view controller</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingSecureConfigurationWithInitialViewController:":{"name":"+autostreamingSecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow secure configuration with a view controller.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(im)initWithCountryCode:fccFacilityId:":{"name":"-initWithCountryCode:fccFacilityId:","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)countryCode":{"name":"countryCode","abstract":"<p>@abstract Binary Representation of ITU Country Code. USA Code is 001.</p>","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)fccFacilityId":{"name":"fccFacilityId","abstract":"<p>@abstract Binary representation of unique facility ID assigned by the FCC","parent_name":"SDLStationIDNumber"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithTimeInterval:":{"name":"-initWithTimeInterval:","abstract":"<p>Create a time struct with a time interval (time in seconds). Fractions of the second will be eliminated and rounded down.</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithHours:minutes:seconds:":{"name":"-initWithHours:minutes:seconds:","abstract":"<p>Create a time struct with hours, minutes, and seconds</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)hours":{"name":"hours","abstract":"<p>The hour of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)minutes":{"name":"minutes","abstract":"<p>The minute of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)seconds":{"name":"seconds","abstract":"<p>The second of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(im)initWithEscSystem:trailerSwayControl:":{"name":"-initWithEscSystem:trailerSwayControl:","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)escSystem":{"name":"escSystem","abstract":"<p>true if vehicle stability control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)trailerSwayControl":{"name":"trailerSwayControl","abstract":"<p>true if vehicle trailer sway control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTS:":{"name":"-initWithTTS:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTSChunks:":{"name":"-initWithTTSChunks:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of TTSChunk structs which, taken together, specify the phrase to be spoken</p>","parent_name":"SDLSpeak"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)name":{"name":"name","abstract":"<p>The name of this soft button state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)artwork":{"name":"artwork","abstract":"<p>The artwork to be used with this button or nil if it is text-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)text":{"name":"text","abstract":"<p>The text to be used with this button or nil if it is image-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)highlighted":{"name":"highlighted","abstract":"<p>Whether or not the button should be highlighted on the UI</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)systemAction":{"name":"systemAction","abstract":"<p>A special system action</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)softButton":{"name":"softButton","abstract":"<p>An SDLSoftButton describing this state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:image:":{"name":"-initWithStateName:text:image:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:artwork:":{"name":"-initWithStateName:text:artwork:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)name":{"name":"name","abstract":"<p>The name of this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states":{"name":"states","abstract":"<p>All states available to this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentState":{"name":"currentState","abstract":"<p>The name of the current state of this soft button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentStateSoftButton":{"name":"currentStateSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)eventHandler":{"name":"eventHandler","abstract":"<p>The handler to be called when the button is in the current state and is pressed</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:states:initialStateName:handler:":{"name":"-initWithName:states:initialStateName:handler:","abstract":"<p>Create a multi-state (or single-state, but you should use initWithName:state: instead for that case) soft button. For example, a button that changes its image or text, such as a repeat or shuffle button.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:state:handler:":{"name":"-initWithName:state:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:text:artwork:handler:":{"name":"-initWithName:text:artwork:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToStateNamed:":{"name":"-transitionToStateNamed:","abstract":"<p>Transition the soft button to another state in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property. The wrapper considers all transitions valid (assuming a state with that name exists).</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToNextState":{"name":"-transitionToNextState","abstract":"<p>Transition the soft button to the next state of the array set when in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)stateWithName:":{"name":"-stateWithName:","abstract":"<p>Return a state from the state array with a specific name.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>The button supports a short press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>The button supports a LONG press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>The button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)imageSupported":{"name":"imageSupported","abstract":"<p>The button supports referencing a static or dynamic image.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)textSupported":{"name":"textSupported","abstract":"<p>The button supports the use of text. If not included, the default value should be considered true that the button will support text.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithType:text:image:highlighted:buttonId:systemAction:handler:":{"name":"-initWithType:text:image:highlighted:buttonId:systemAction:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)handler":{"name":"handler","abstract":"<p>A handler that may optionally be run when the SDLSoftButton has a corresponding notification occur.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)type":{"name":"type","abstract":"<p>Describes whether this soft button displays only text, only an image, or both</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)text":{"name":"text","abstract":"<p>Optional text to display (if defined as TEXT or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)image":{"name":"image","abstract":"<p>Optional image struct for SoftButton (if defined as IMAGE or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)isHighlighted":{"name":"isHighlighted","abstract":"<p>Displays in an alternate mode, e.g. with a colored background or foreground. Depends on the IVI system.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)softButtonID":{"name":"softButtonID","abstract":"<p>Value which is returned via OnButtonPress / OnButtonEvent</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)systemAction":{"name":"systemAction","abstract":"<p>Parameter indicating whether selecting a SoftButton shall call a specific system action. This is intended to allow Notifications to bring the callee into full / focus; or in the case of persistent overlays, the overlay can persist when a SoftButton is pressed.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSliderResponse.html#/c:objc(cs)SDLSliderResponse(py)sliderPosition":{"name":"sliderPosition","abstract":"<p>The selected position of the slider.</p>","parent_name":"SDLSliderResponse"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:":{"name":"-initWithNumTicks:position:","abstract":"<p>Creates a slider with only the number of ticks and position. Note that this is not enough to get a SUCCESS response. You must supply additional data. See below for required parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooter:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooter:timeout:","abstract":"<p>Creates a slider with all required data and a static footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:","abstract":"<p>Creates an slider with all required data and a dynamic footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)numTicks":{"name":"numTicks","abstract":"<p>Represents a number of selectable items on a horizontal axis.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)position":{"name":"position","abstract":"<p>Initial position of slider control (cannot exceed numTicks).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderHeader":{"name":"sliderHeader","abstract":"<p>Text header to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderFooter":{"name":"sliderFooter","abstract":"<p>Text footer to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. sliding control resets timeout). If omitted, the value is set to 10 seconds.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific slider to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLSlider"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)status":{"name":"status","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)monitoringSystemStatus":{"name":"monitoringSystemStatus","abstract":"<p>The status of TPMS for this particular tire</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)pressure":{"name":"pressure","abstract":"<p>The pressure value of this particular tire in kPa (kilopascals)</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(im)initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:":{"name":"-initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:","abstract":"<p>Convenience init to create navigation directions</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText1":{"name":"navigationText1","abstract":"<p>The first line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText2":{"name":"navigationText2","abstract":"<p>The second line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)eta":{"name":"eta","abstract":"<p>Estimated Time of Arrival time at final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)timeToDestination":{"name":"timeToDestination","abstract":"<p>The amount of time needed to reach the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)totalDistance":{"name":"totalDistance","abstract":"<p>The distance to the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)turnIcon":{"name":"turnIcon","abstract":"<p>An icon to show with the turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)nextTurnIcon":{"name":"nextTurnIcon","abstract":"<p>An icon to show with the next turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuver":{"name":"distanceToManeuver","abstract":"<p>Distance (in meters) until next maneuver. May be used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuverScale":{"name":"distanceToManeuverScale","abstract":"<p>Distance (in meters) from previous maneuver to next maneuver. May be used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)maneuverComplete":{"name":"maneuverComplete","abstract":"<p>If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)softButtons":{"name":"softButtons","abstract":"<p>Three dynamic SoftButtons available (first SoftButton is fixed to &ldquo;Turns&rdquo;). If omitted on supported displays, the currently displayed SoftButton values will not change.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","abstract":"<p>Creates a ShowAppMenu RPC to open the app menu directly to a AddSubMenu RPC&rsquo;s submenu.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(py)menuID":{"name":"menuID","abstract":"<p>A Menu ID that identifies the AddSubMenu to open if it correlates with the AddSubMenu menuID parameter. If not set the top level menu will be opened.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:":{"name":"-initWithMainField1:mainField2:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:":{"name":"-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField1":{"name":"mainField1","abstract":"<p>The text displayed in a single-line display, or in the upper display","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField2":{"name":"mainField2","abstract":"<p>The text displayed on the second display line of a two-line display</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField3":{"name":"mainField3","abstract":"<p>The text displayed on the first display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField4":{"name":"mainField4","abstract":"<p>The text displayed on the second display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)alignment":{"name":"alignment","abstract":"<p>The alignment that Specifies how mainField1 and mainField2 text","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)statusBar":{"name":"statusBar","abstract":"<p>Text in the Status Bar</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaClock":{"name":"mediaClock","abstract":"<p>Text value for MediaClock field. Has to be properly formatted by Mobile App according to the module&rsquo;s capabilities. If this text is set, any automatic media clock updates previously set with SetMediaClockTimer will be stopped.","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaTrack":{"name":"mediaTrack","abstract":"<p>The text in the track field</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)graphic":{"name":"graphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)softButtons":{"name":"softButtons","abstract":"<p>The the Soft buttons defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)customPresets":{"name":"customPresets","abstract":"<p>The Custom Presets defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)metadataTags":{"name":"metadataTags","abstract":"<p>Text Field Metadata</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateConfiguration":{"name":"templateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateTitle":{"name":"templateTitle","abstract":"<p>The title of the current template.</p>","parent_name":"SDLShow"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)pauseWithPlayPauseIndicator:":{"name":"+pauseWithPlayPauseIndicator:","abstract":"<p>Pause an existing (counting up / down) media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:":{"name":"+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTime:endTime:playPauseIndicator:":{"name":"+updatePauseWithNewStartTime:endTime:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:":{"name":"+resumeWithPlayPauseIndicator:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)clearWithPlayPauseIndicator:":{"name":"+clearWithPlayPauseIndicator:","abstract":"<p>Remove a media clock timer from the screen</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:playPauseIndicator:":{"name":"-initWithUpdateMode:startTime:endTime:playPauseIndicator:","abstract":"<p>Create a SetMediaClockTimer RPC with all available parameters. It&rsquo;s recommended to use the specific initializers above.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"-initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)startTime":{"name":"startTime","abstract":"<p>A Start Time with specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)endTime":{"name":"endTime","abstract":"<p>An END time of type SDLStartTime, specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)updateMode":{"name":"updateMode","abstract":"<p>The media clock/timer update mode (COUNTUP/COUNTDOWN/PAUSE/RESUME)</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)audioStreamingIndicator":{"name":"audioStreamingIndicator","abstract":"<p>The audio streaming indicator used for a play/pause button.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)forwardSeekIndicator":{"name":"forwardSeekIndicator","abstract":"<p>Used to control the forward seek button to either skip forward a set amount of time or to the next track.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)backSeekIndicator":{"name":"backSeekIndicator","abstract":"<p>Used to control the back seek button to either skip back a set amount of time or to the previous track.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)countRate":{"name":"countRate","abstract":"<p>The value of this parameter is the amount that the media clock timer will advance per 1.0 seconds of real time. Values less than 1.0 will therefore advance the timer slower than real-time, while values greater than 1.0 will advance the timer faster than real-time. e.g. If this parameter is set to <code>0.5</code>, the timer will advance one second per two seconds real-time, or at 50% speed. If this parameter is set to <code>2.0</code>, the timer will advance two seconds per one second real-time, or at 200% speed.","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetInteriorVehicleDataResponse.html#/c:objc(cs)SDLSetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The new module data for the requested module</p>","parent_name":"SDLSetInteriorVehicleDataResponse"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(im)initWithModuleData:":{"name":"-initWithModuleData:","abstract":"<p>Convenience init to change settings of a module</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The module data to set for the requested RC module.</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Initialize SetGlobalProperties with all possible items</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Convenience init for setting all possible global properties</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help prompt for when the user asks for help with an interface prompt</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Help prompt for when an interface prompt times out</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelpTitle":{"name":"vrHelpTitle","abstract":"<p>Sets a voice recognition Help Title</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelp":{"name":"vrHelp","abstract":"<p>Sets the items listed in the VR help screen used in an interaction started by Push to Talk</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuTitle":{"name":"menuTitle","abstract":"<p>Text for the menu button label</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuIcon":{"name":"menuIcon","abstract":"<p>Icon for the menu button</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)keyboardProperties":{"name":"keyboardProperties","abstract":"<p>On-screen keyboard (perform interaction) configuration</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)userLocation":{"name":"userLocation","abstract":"<p>Location of the user&rsquo;s seat. Default is driver&rsquo;s seat location if it is not set yet</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuLayout":{"name":"menuLayout","abstract":"<p>The main menu layout. If this is sent while a menu is already on-screen, the head unit will change the display to the new layout type. See available menu layouts on DisplayCapabilities.menuLayoutsAvailable. Defaults to the head unit default.</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>The display capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The soft button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>The preset bank capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:":{"name":"-initWithLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithPredefinedLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)displayLayout":{"name":"displayLayout","abstract":"<p>A display layout. Predefined or dynamically created screen layout.","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(py)properties":{"name":"properties","abstract":"<p>The new cloud application properties.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to set an image icon from a file name. The file must already be uploaded to the head unit.</p>","parent_name":"SDLSetAppIcon"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(py)syncFileName":{"name":"syncFileName","abstract":"<p>A file reference name","parent_name":"SDLSetAppIcon"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:":{"name":"-initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:","abstract":"<p>Create a <code>SendLocation</code> request with an address object, without Lat/Long coordinates.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate, not an address object</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate and an address object and let the nav system decide how to parse it</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>The longitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>The latitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationName":{"name":"locationName","abstract":"<p>Name / title of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description of the intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)deliveryMode":{"name":"deliveryMode","abstract":"<p>Mode in which the sendLocation request is sent</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)timeStamp":{"name":"timeStamp","abstract":"<p>Arrival time of Location. If multiple SendLocations are sent, this will be used for sorting as well.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address":{"name":"address","abstract":"<p>Address to be used for setting destination. Either the latitude / longitude OR the <code>address</code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(im)initWithHapticRectData:":{"name":"-initWithHapticRectData:","abstract":"<p>Constructs a new SDLSendHapticData object indicated by the hapticSpatialData parameter</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(py)hapticRectData":{"name":"hapticRectData","abstract":"<p>Array of spatial data structures that represent the locations of all user controls present on the HMI. This data should be updated if/when the application presents a new screen. When a request is sent, if successful, it will replace all spatial data previously sent through RPC. If an empty array is sent, the existing spatial data will be cleared</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(im)initWithType:":{"name":"-initWithType:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(im)initWithType:seekTime:":{"name":"-initWithType:seekTime:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(cm)seekIndicatorWithSeekTime:":{"name":"+seekIndicatorWithSeekTime:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(py)type":{"name":"type","abstract":"<p>Undocumented</p>","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(py)seekTime":{"name":"seekTime","abstract":"<p>If the type is TIME, this number of seconds may be present alongside the skip indicator. It will indicate the number of seconds that the currently playing media will skip forward or backward.","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(im)initWithSeatLocation:conditionActive:":{"name":"-initWithSeatLocation:conditionActive:","parent_name":"SDLSeatStatus"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(py)seatLocation":{"name":"seatLocation","abstract":"<p>Undocumented</p>","parent_name":"SDLSeatStatus"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(py)conditionActive":{"name":"conditionActive","abstract":"<p>Undocumented</p>","parent_name":"SDLSeatStatus"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(im)initWithSeatsOccupied:seatsBelted:":{"name":"-initWithSeatsOccupied:seatsBelted:","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(py)seatsOccupied":{"name":"seatsOccupied","abstract":"<p>Seat status array containing location and whether the seats are occupied.","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(py)seatsBelted":{"name":"seatsBelted","abstract":"<p>Seat status array containing location and whether the seats are belted.","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:action:":{"name":"-initWithId:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:label:action:":{"name":"-initWithId:label:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)id":{"name":"id","abstract":"<p>@abstract id of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)label":{"name":"label","abstract":"<p>@abstract label of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)action":{"name":"action","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(im)initWithSeats:cols:rows:levels:":{"name":"-initWithSeats:cols:rows:levels:","abstract":"<p>Constructs a newly allocated SDLSeatLocationCapability object with all parameters</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)cols":{"name":"cols","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)rows":{"name":"rows","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)levels":{"name":"levels","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)seats":{"name":"seats","abstract":"<p>Contains a list of SeatLocation in the vehicle, the first element is the driver&rsquo;s seat","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocation.html#/c:objc(cs)SDLSeatLocation(py)grid":{"name":"grid","abstract":"<p>Optional</p>","parent_name":"SDLSeatLocation"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:":{"name":"-initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:","abstract":"<p>Convenience init for setting all possible seat control data</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:":{"name":"-initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)id":{"name":"id","abstract":"<p>@abstract id of seat that is a remote controllable seat.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingEnabled":{"name":"heatingEnabled","abstract":"<p>@abstract Whether or not heating is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingEnabled":{"name":"coolingEnabled","abstract":"<p>@abstract Whether or not cooling is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingLevel":{"name":"heatingLevel","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingLevel":{"name":"coolingLevel","abstract":"<p>@abstract cooling level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)horizontalPosition":{"name":"horizontalPosition","abstract":"<p>@abstract horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)verticalPosition":{"name":"verticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)frontVerticalPosition":{"name":"frontVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backVerticalPosition":{"name":"backVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backTiltAngle":{"name":"backTiltAngle","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportHorizontalPosition":{"name":"headSupportHorizontalPosition","abstract":"<p>@abstract head Support Horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportVerticalPosition":{"name":"headSupportVerticalPosition","abstract":"<p>@abstract head Support Vertical Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageEnabled":{"name":"massageEnabled","abstract":"<p>@abstract Whether or not massage is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract Array of massage mode data.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageCushionFirmness":{"name":"massageCushionFirmness","abstract":"<p>@abstract Array of firmness of a cushion.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)memory":{"name":"memory","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:":{"name":"-initWithName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with moduleName and moduleInfo</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with all parameters</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingEnabledAvailable":{"name":"heatingEnabledAvailable","abstract":"<p>@abstract Whether or not heating is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingEnabledAvailable":{"name":"coolingEnabledAvailable","abstract":"<p>@abstract Whether or not cooling is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingLevelAvailable":{"name":"heatingLevelAvailable","abstract":"<p>@abstract Whether or not heating level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingLevelAvailable":{"name":"coolingLevelAvailable","abstract":"<p>@abstract Whether or not cooling level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)horizontalPositionAvailable":{"name":"horizontalPositionAvailable","abstract":"<p>@abstract Whether or not horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)verticalPositionAvailable":{"name":"verticalPositionAvailable","abstract":"<p>@abstract Whether or not vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)frontVerticalPositionAvailable":{"name":"frontVerticalPositionAvailable","abstract":"<p>@abstract Whether or not front Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backVerticalPositionAvailable":{"name":"backVerticalPositionAvailable","abstract":"<p>@abstract Whether or not back Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backTiltAngleAvailable":{"name":"backTiltAngleAvailable","abstract":"<p>@abstract Whether or not backTilt Angle Available is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportHorizontalPositionAvailable":{"name":"headSupportHorizontalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportVerticalPositionAvailable":{"name":"headSupportVerticalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageEnabledAvailable":{"name":"massageEnabledAvailable","abstract":"<p>@abstract Whether or not massage Enabled is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageModeAvailable":{"name":"massageModeAvailable","abstract":"<p>@abstract Whether or not massage Mode is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageCushionFirmnessAvailable":{"name":"massageCushionFirmnessAvailable","abstract":"<p>@abstract Whether or not massage Cushion Firmness is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)memoryAvailable":{"name":"memoryAvailable","abstract":"<p>@abstract Whether or not memory is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>@abstract Information about a RC module, including its id.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:":{"name":"-initWithMessage:","abstract":"<p>Convenience init for creating a scrolling message with text.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:timeout:softButtons:cancelID:":{"name":"-initWithMessage:timeout:softButtons:cancelID:","abstract":"<p>Convenience init for creating a scrolling message with text and buttons.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)scrollableMessageBody":{"name":"scrollableMessageBody","abstract":"<p>Body of text that can include newlines and tabs.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. scrolling message resets timeout). If not set, a default value of 30 seconds is used by Core.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed scrollable message. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton will be displayed.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific scrollable message to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)resolution":{"name":"resolution","abstract":"<p>The resolution of the prescribed screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)touchEventAvailable":{"name":"touchEventAvailable","abstract":"<p>Types of screen touch events available in screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1":{"name":"textField1","abstract":"<p>The top text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2":{"name":"textField2","abstract":"<p>The second text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3":{"name":"textField3","abstract":"<p>The third text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4":{"name":"textField4","abstract":"<p>The fourth text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)mediaTrackTextField":{"name":"mediaTrackTextField","abstract":"<p>The media text field available within the media layout. Often less emphasized than textField(1-4)</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)primaryGraphic":{"name":"primaryGraphic","abstract":"<p>The primary graphic within a template layout</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>A secondary graphic used in some template layouts</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textAlignment":{"name":"textAlignment","abstract":"<p>What alignment textField(1-4) should use</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1Type":{"name":"textField1Type","abstract":"<p>The type of data textField1 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2Type":{"name":"textField2Type","abstract":"<p>The type of data textField2 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3Type":{"name":"textField3Type","abstract":"<p>The type of data textField3 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4Type":{"name":"textField4Type","abstract":"<p>The type of data textField4 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)title":{"name":"title","abstract":"<p>The title of the current template layout.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)softButtonObjects":{"name":"softButtonObjects","abstract":"<p>The current list of soft buttons within a template layout. Set this array to change the displayed soft buttons.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menuConfiguration":{"name":"menuConfiguration","abstract":"<p>Configures the layout of the menu and sub-menus. If set after a menu already exists, the existing main menu layout will be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menu":{"name":"menu","abstract":"<p>The current list of menu cells displayed in the app&rsquo;s menu.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)dynamicMenuUpdatesMode":{"name":"dynamicMenuUpdatesMode","abstract":"<p>Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The current list of voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)keyboardConfiguration":{"name":"keyboardConfiguration","abstract":"<p>The default keyboard configuration, this can be additionally customized by each SDLKeyboardDelegate.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)preloadedChoices":{"name":"preloadedChoices","abstract":"<p>Cells will be hashed by their text, image names, and VR command text. When assembling an SDLChoiceSet, you can pull objects from here, or recreate them. The preloaded versions will be used so long as their text, image names, and VR commands are the same.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Starts the manager and all sub-managers</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)beginUpdates":{"name":"-beginUpdates","abstract":"<p>Delays all screen updates until endUpdatesWithCompletionHandler: is called.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdates":{"name":"-endUpdates","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)changeLayout:withCompletionHandler:":{"name":"-changeLayout:withCompletionHandler:","abstract":"<p>Change the current layout to a new layout and optionally update the layout&rsquo;s night and day color schemes. The values set for the text, graphics, buttons and template title persist between layout changes. To update the text, graphics, buttons and template title at the same time as the template, batch all the updates between <code>beginUpdates</code> and <code>endUpdates</code>. If the layout update fails while batching, then the updated text, graphics, buttons or template title will also not be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)softButtonObjectNamed:":{"name":"-softButtonObjectNamed:","abstract":"<p>Retrieve a SoftButtonObject based on its name.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withUpdateHandler:":{"name":"-subscribeButton:withUpdateHandler:","abstract":"<p>Subscribes to a subscribe button. The update handler will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the updateHandler.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withObserver:selector:":{"name":"-subscribeButton:withObserver:selector:","abstract":"<p>Subscribes to a subscribe button. The selector will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the selector.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)unsubscribeButton:withObserver:withCompletionHandler:":{"name":"-unsubscribeButton:withObserver:withCompletionHandler:","abstract":"<p>Unsubscribes to a subscribe button. Please note that if a subscribe button has multiple subscribers the observer will no longer get notifications, however, the app will still be subscribed to the hard button until the last subscriber is removed.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)preloadChoices:withCompletionHandler:":{"name":"-preloadChoices:withCompletionHandler:","abstract":"<p>Preload cells to the head unit. This will <em>greatly</em> reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You <em>do not</em> need to wait until the completion handler is called to present a choice set containing choices being loaded. The choice set will wait until the preload completes and then immediately present.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)deleteChoices:":{"name":"-deleteChoices:","abstract":"<p>Delete loaded cells from the head unit. If the cells don&rsquo;t exist on the head unit they will be ignored.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentChoiceSet:mode:":{"name":"-presentChoiceSet:mode:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentSearchableChoiceSet:mode:withKeyboardDelegate:":{"name":"-presentSearchableChoiceSet:mode:withKeyboardDelegate:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentKeyboardWithInitialText:delegate:":{"name":"-presentKeyboardWithInitialText:delegate:","abstract":"<p>Present a keyboard-only interface to the user and receive input. The user will be able to input text in the keyboard when in a non-driver distraction situation.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)dismissKeyboardWithCancelID:":{"name":"-dismissKeyboardWithCancelID:","abstract":"<p>Cancels the keyboard-only interface if it is currently showing. If the keyboard has not yet been sent to Core, it will not be sent.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openMenu":{"name":"-openMenu","abstract":"<p>Present the top-level of your application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openSubmenu:":{"name":"-openSubmenu:","abstract":"<p>Present the application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden. You must update the menu with the proper cells before calling this method. This RPC will fail if the cell does not contain a sub menu, or is not in the menu array.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentAlert:withCompletionHandler:":{"name":"-presentAlert:withCompletionHandler:","abstract":"<p>Present the alert on the screen. To replace a currently presenting alert with a new alert, you must first call <code>cancel</code> on the currently presenting alert before sending the new alert. Otherwise the newest alert will only be presented when the module dismisses the currently presented alert (either due to the timeout or the user selecting a button on the alert). Please note that cancelling a currently presented alert will only work on modules supporting RPC Spec v.5.0+.</p>","parent_name":"SDLScreenManager"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(im)initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:":{"name":"-initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:","abstract":"<p>Convenience init to SISData</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationShortName":{"name":"stationShortName","abstract":"<p>@abstract Identifies the 4-alpha-character station call sign","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationIDNumber":{"name":"stationIDNumber","abstract":"<p>@abstract Used for network Application.","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLongName":{"name":"stationLongName","abstract":"<p>@abstract Identifies the station call sign or other identifying","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLocation":{"name":"stationLocation","abstract":"<p>@abstract Provides the 3-dimensional geographic station location</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationMessage":{"name":"stationMessage","abstract":"<p>@abstract May be used to convey textual information of general interest","parent_name":"SDLSISData"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(im)initWithLocation:status:state:":{"name":"-initWithLocation:status:state:","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)location":{"name":"location","abstract":"<p>Undocumented</p>","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)status":{"name":"status","abstract":"<p>Undocumented</p>","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)state":{"name":"state","abstract":"<p>Undocumented</p>","parent_name":"SDLRoofStatus"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init to reset global properties.</p>","parent_name":"SDLResetGlobalProperties"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(py)properties":{"name":"properties","abstract":"<p>An array of one or more GlobalProperty enumeration elements","parent_name":"SDLResetGlobalProperties"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:","abstract":"<p>Constructs a newly allocated SDLRemoteControlCapabilities object with given parameters</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)climateControlCapabilities":{"name":"climateControlCapabilities","abstract":"<p>If included, the platform supports RC climate controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)radioControlCapabilities":{"name":"radioControlCapabilities","abstract":"<p>If included, the platform supports RC radio controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>If included, the platform supports RC button controls with the included button names.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)seatControlCapabilities":{"name":"seatControlCapabilities","abstract":"<p>If included, the platform supports seat controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)audioControlCapabilities":{"name":"audioControlCapabilities","abstract":"<p>If included, the platform supports audio controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)hmiSettingsControlCapabilities":{"name":"hmiSettingsControlCapabilities","abstract":"<p>If included, the platform supports hmi setting controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)lightControlCapabilities":{"name":"lightControlCapabilities","abstract":"<p>If included, the platform supports light controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to release a controlled module</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the negotiated version number of the SmartDeviceLink protocol that is to be supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)language":{"name":"language","abstract":"<p>The currently active VR+TTS language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>The currently active display language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contains information about the display&rsquo;s capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>Contains information about the head unit button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>Contains information about the head unit soft button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<p>Contains information about the HMI zone capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<p>Contains information about the text-to-speech capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)prerecordedSpeech":{"name":"prerecordedSpeech","abstract":"<p>Contains a list of prerecorded speech items present on the platform.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vrCapabilities":{"name":"vrCapabilities","abstract":"<p>Contains information about the VR capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for PerformAudioPassThru, e.g. {8kHz,8-bit,PCM}. The audio is recorded in monaural.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)pcmStreamCapabilities":{"name":"pcmStreamCapabilities","abstract":"<p>Describes different audio type configurations for the audio PCM stream service, e.g. {8kHz,8-bit,PCM}</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vehicleType":{"name":"vehicleType","abstract":"<p>Specifies the vehicle&rsquo;s type. See VehicleType.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)supportedDiagModes":{"name":"supportedDiagModes","abstract":"<p>Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<p>Specifies the HMI capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlVersion":{"name":"sdlVersion","abstract":"<p>The version of SDL Core running on the connected head unit</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The software version of the system that implements the SmartDeviceLink core.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)iconResumed":{"name":"iconResumed","abstract":"<p>Existence of apps icon at system. If true, apps icon was resumed at system. If false, apps icon is not resumed at system.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithLifecycleConfiguration:":{"name":"-initWithLifecycleConfiguration:","abstract":"<p>Convenience init for registering the application with a lifecycle configuration.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:":{"name":"-initWithAppName:appId:languageDesired:","abstract":"<p>Convenience init for registering the application with an app name, app id, and desired language.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:":{"name":"-initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init for registering the application with all possible options.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the version number of the SmartDeviceLink protocol that is supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appName":{"name":"appName","abstract":"<p>The mobile application&rsquo;s name. This name is displayed in the SDL Mobile Applications menu. It also serves as the unique identifier of the application for SmartDeviceLink. Applications with the same name will be rejected.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ttsName":{"name":"ttsName","abstract":"<p>Text-to-speech string for voice recognition of the mobile application name. Meant to overcome any failing on speech engine in properly pronouncing / understanding app name.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Provides an abbreviated version of the app name (if needed), that will be displayed on head units that support very few characters. If not provided, the appName is used instead (and will be truncated if too long). It&rsquo;s recommended that this string be no longer than 5 characters.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Defines additional voice recognition commands</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)isMediaApplication":{"name":"isMediaApplication","abstract":"<p>Indicates if the application is a media or a non-media application. Media applications will appear in the head unit&rsquo;s media source list and can use the <code>MEDIA</code> template.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)languageDesired":{"name":"languageDesired","abstract":"<p>App&rsquo;s starting VR+TTS language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hmiDisplayLanguageDesired":{"name":"hmiDisplayLanguageDesired","abstract":"<p>Current app&rsquo;s expected display language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appHMIType":{"name":"appHMIType","abstract":"<p>List of all applicable app HMI types stating which HMI classifications to be given to the app.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hashID":{"name":"hashID","abstract":"<p>ID used to uniquely identify a previous state of all app data that can persist through connection cycles (e.g. ignition cycles). This registered data (commands, submenus, choice sets, etc.) can be reestablished without needing to explicitly re-send each piece. If omitted, then the previous state of an app&rsquo;s commands, etc. will not be restored.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)deviceInfo":{"name":"deviceInfo","abstract":"<p>Information about the connecting device.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appID":{"name":"appID","abstract":"<p>ID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)fullAppID":{"name":"fullAppID","abstract":"<p>A full UUID appID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appInfo":{"name":"appInfo","abstract":"<p>Contains detailed information about the registered application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithX:y:width:height:":{"name":"-initWithX:y:width:height:","abstract":"<p>Create a Rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithCGRect:":{"name":"-initWithCGRect:","abstract":"<p>Create a Rectangle from a CGRect</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)x":{"name":"x","abstract":"<p>The X-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)y":{"name":"y","abstract":"<p>The Y-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)width":{"name":"width","abstract":"<p>The width of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)height":{"name":"height","abstract":"<p>The height of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLReadDIDResponse.html#/c:objc(cs)SDLReadDIDResponse(py)didResult":{"name":"didResult","abstract":"<p>Array of requested DID results (with data if available).</p>","parent_name":"SDLReadDIDResponse"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(im)initWithECUName:didLocation:":{"name":"-initWithECUName:didLocation:","abstract":"<p>Convenience init</p>","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)ecuName":{"name":"ecuName","abstract":"<p>An ID of the vehicle module","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)didLocation":{"name":"didLocation","abstract":"<p>Raw data from vehicle data DID location(s)","parent_name":"SDLReadDID"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initFMWithFrequencyInteger:frequencyFraction:hdChannel:":{"name":"-initFMWithFrequencyInteger:frequencyFraction:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initAMWithFrequencyInteger:hdChannel:":{"name":"-initAMWithFrequencyInteger:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initXMWithFrequencyInteger:":{"name":"-initXMWithFrequencyInteger:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyInteger":{"name":"frequencyInteger","abstract":"<p>The integer part of the frequency ie for 101.7 this value should be 101</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyFraction":{"name":"frequencyFraction","abstract":"<p>The fractional part of the frequency for 101.7 is 7</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)band":{"name":"band","abstract":"<p>Radio band value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)rdsData":{"name":"rdsData","abstract":"<p>Read only parameter. See RDSData data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDs":{"name":"availableHDs","abstract":"<p>number of HD sub-channels if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDChannels":{"name":"availableHDChannels","abstract":"<p>the list of available hd sub-channel indexes, empty list means no Hd channel is available, read-only</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdChannel":{"name":"hdChannel","abstract":"<p>Current HD sub-channel if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalStrength":{"name":"signalStrength","abstract":"<p>Signal Strength Value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalChangeThreshold":{"name":"signalChangeThreshold","abstract":"<p>If the signal strength falls below the set value for this parameter, the radio will tune to an alternative frequency</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)radioEnable":{"name":"radioEnable","abstract":"<p>True if the radio is on, false is the radio is off. When the radio is disabled, no data other than radioEnable is included in a GetInteriorVehicleData response</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)state":{"name":"state","abstract":"<p>Read only parameter. See RadioState data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdRadioEnable":{"name":"hdRadioEnable","abstract":"<p>True if the hd radio is on, false is the radio is off</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)sisData":{"name":"sisData","abstract":"<p>Read Read-only Station Information Service (SIS) data provides basic information","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>The short friendly name of the radio control module.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioEnableAvailable":{"name":"radioEnableAvailable","abstract":"<p>Availability of the control of enable/disable radio.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioBandAvailable":{"name":"radioBandAvailable","abstract":"<p>Availability of the control of radio band.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioFrequencyAvailable":{"name":"radioFrequencyAvailable","abstract":"<p>Availability of the control of radio frequency.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdChannelAvailable":{"name":"hdChannelAvailable","abstract":"<p>Availability of the control of HD radio channel.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)rdsDataAvailable":{"name":"rdsDataAvailable","abstract":"<p>Availability of the getting Radio Data System (RDS) data.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDsAvailable":{"name":"availableHDsAvailable","abstract":"<p>Availability of the getting the number of available HD channels.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDChannelsAvailable":{"name":"availableHDChannelsAvailable","abstract":"<p>Availability of the list of available HD sub-channel indexes.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)stateAvailable":{"name":"stateAvailable","abstract":"<p>Availability of the getting the Radio state.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalStrengthAvailable":{"name":"signalStrengthAvailable","abstract":"<p>Availability of the getting the signal strength.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalChangeThresholdAvailable":{"name":"signalChangeThresholdAvailable","abstract":"<p>Availability of the getting the signal Change Threshold</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdRadioEnableAvailable":{"name":"hdRadioEnableAvailable","abstract":"<p>Availability of the control of enable/disable HD radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)siriusXMRadioAvailable":{"name":"siriusXMRadioAvailable","abstract":"<p>Availability of sirius XM radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)sisDataAvailable":{"name":"sisDataAvailable","abstract":"<p>Availability of the getting HD radio Station Information Service (SIS) data.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)store":{"name":"store","abstract":"<p>The store that contains RPC data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)payloadProtected":{"name":"payloadProtected","abstract":"<p>Declares if the RPC payload ought to be protected</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)serializeAsDictionary:":{"name":"-serializeAsDictionary:","abstract":"<p>Converts struct to JSON formatted data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(py)response":{"name":"response","abstract":"<p>The response to be included within the userinfo dictionary</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)initWithName:object:rpcResponse:":{"name":"-initWithName:object:rpcResponse:","abstract":"<p>Create an NSNotification object containing an SDLRPCResponse</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseMemberOfClass:":{"name":"-isResponseMemberOfClass:","abstract":"<p>Returns whether or not the containing response is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseKindOfClass:":{"name":"-isResponseKindOfClass:","abstract":"<p>Returns whether or not the containing response is a kind of class, including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)correlationID":{"name":"correlationID","abstract":"<p>The correlation id of the corresponding SDLRPCRequest.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)success":{"name":"success","abstract":"<p>Whether or not the SDLRPCRequest was successful.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)resultCode":{"name":"resultCode","abstract":"<p>The result of the SDLRPCRequest. If the request failed, the result code contains the failure reason.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)info":{"name":"info","abstract":"<p>More detailed success or error message.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(py)request":{"name":"request","abstract":"<p>The request to be included in the userinfo dictionary</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)initWithName:object:rpcRequest:":{"name":"-initWithName:object:rpcRequest:","abstract":"<p>Create an NSNotification object containing an SDLRPCRequest</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestMemberOfClass:":{"name":"-isRequestMemberOfClass:","abstract":"<p>Returns whether or not the containing request is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestKindOfClass:":{"name":"-isRequestKindOfClass:","abstract":"<p>Returns whether or not the containing request is a kind of class, including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequest.html#/c:objc(cs)SDLRPCRequest(py)correlationID":{"name":"correlationID","abstract":"<p>A unique id assigned to message sent to Core. The Correlation ID is used to map a request to its response.</p>","parent_name":"SDLRPCRequest"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcAllowed":{"name":"rpcAllowed","abstract":"<p>Whether or not the RPC is allowed.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcParameters":{"name":"rpcParameters","abstract":"<p>Holds a dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(im)initWithRPCName:isRPCAllowed:rpcParameters:":{"name":"-initWithRPCName:isRPCAllowed:rpcParameters:","abstract":"<p>Initializes a SDLRPCPermissionStatus object.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(py)notification":{"name":"notification","abstract":"<p>The notification within the userinfo dictionary</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)initWithName:object:rpcNotification:":{"name":"-initWithName:object:rpcNotification:","abstract":"<p>Create an NSNotification object caontaining an SDLRPCNotification</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationMemberOfClass:":{"name":"-isNotificationMemberOfClass:","abstract":"<p>Returns whether or not the containing notification is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationKindOfClass:":{"name":"-isNotificationKindOfClass:","abstract":"<p>Returns whether or not the containing notification is a kind of class, including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setFunctionName:":{"name":"-setFunctionName:","abstract":"<p>Sets the function name.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setParameters:value:":{"name":"-setParameters:value:","abstract":"<p>Sets a key-value pair using the function name as the key.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)bulkData":{"name":"bulkData","abstract":"<p>The data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)name":{"name":"name","abstract":"<p>The name of the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)parameters":{"name":"parameters","abstract":"<p>The JSON-RPC parameters</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)messageType":{"name":"messageType","abstract":"<p>The type of data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithRed:green:blue:":{"name":"-initWithRed:green:blue:","abstract":"<p>Create an SDL color object with red / green / blue values between 0-255</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithColor:":{"name":"-initWithColor:","abstract":"<p>Create an SDL color object with a UIColor object.</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)red":{"name":"red","abstract":"<p>The red value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)green":{"name":"green","abstract":"<p>The green value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)blue":{"name":"blue","abstract":"<p>The blue value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(im)initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:":{"name":"-initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:","abstract":"<p>Convenience init</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programService":{"name":"programService","abstract":"<p>Program Service Name</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)radioText":{"name":"radioText","abstract":"<p>Radio Text</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)clockText":{"name":"clockText","abstract":"<p>The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programIdentification":{"name":"programIdentification","abstract":"<p>Program Identification - the call sign for the radio station</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programType":{"name":"programType","abstract":"<p>The program type - The region should be used to differentiate between EU","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficProgramIdentification":{"name":"trafficProgramIdentification","abstract":"<p>Traffic Program Identification - Identifies a station that offers traffic</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficAnnouncementIdentification":{"name":"trafficAnnouncementIdentification","abstract":"<p>Traffic Announcement Identification - Indicates an ongoing traffic announcement</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)region":{"name":"region","abstract":"<p>Region</p>","parent_name":"SDLRDSData"},"Classes/SDLPutFileResponse.html#/c:objc(cs)SDLPutFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available in SDL Core for the registered app. If the transfer has systemFile enabled, then the value will be set to 0 automatically.</p>","parent_name":"SDLPutFileResponse"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)init":{"name":"-init","abstract":"<p>Init</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:":{"name":"-initWithFileName:fileType:","abstract":"<p>Convenience init for creating a putfile with a name and file format.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:":{"name":"-initWithFileName:fileType:persistentFile:","abstract":"<p>Convenience init for creating a putfile with a name, file format, and persistence.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload. A CRC checksum is calculated for the bulk data.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)sdlFileName":{"name":"sdlFileName","abstract":"<p>File reference name</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)fileType":{"name":"fileType","abstract":"<p>A FileType value representing a selected file type</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)persistentFile":{"name":"persistentFile","abstract":"<p>A value to indicates if the file is meant to persist between sessions / ignition cycles. If set to TRUE, then the system will aim to persist this file through session / cycles. While files with this designation will have priority over others, they are subject to deletion by the system at any time. In the event of automatic deletion by the system, the app will receive a rejection and have to resend the file. If omitted, the value will be set to false.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)systemFile":{"name":"systemFile","abstract":"<p>Indicates if the file is meant to be passed through core to elsewhere on the system. If set to TRUE, then the system will instead pass the data thru as it arrives to a predetermined area outside of core.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)offset":{"name":"offset","abstract":"<p>Offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)length":{"name":"length","abstract":"<p>Length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLPutFile"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(im)initWithAppServiceRecord:":{"name":"-initWithAppServiceRecord:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(py)appServiceRecord":{"name":"appServiceRecord","abstract":"<p>If the request was successful, this object will be the current status of the service record for the published service. This will include the Core supplied service ID.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(im)initWithAppServiceManifest:":{"name":"-initWithAppServiceManifest:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppService"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(py)appServiceManifest":{"name":"appServiceManifest","abstract":"<p>The manifest of the service that wishes to be published.","parent_name":"SDLPublishAppService"},"Classes/SDLPresetBankCapabilities.html#/c:objc(cs)SDLPresetBankCapabilities(py)onScreenPresetsAvailable":{"name":"onScreenPresetsAvailable","abstract":"<p>If Onscreen custom presets are available.</p>","parent_name":"SDLPresetBankCapabilities"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(im)initWithFirstTouch:secondTouch:":{"name":"-initWithFirstTouch:secondTouch:","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)firstTouch":{"name":"firstTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)secondTouch":{"name":"secondTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)distance":{"name":"distance","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)center":{"name":"center","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)isValid":{"name":"isValid","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(im)initWithDialNumber:":{"name":"-initWithDialNumber:","abstract":"<p>Convenience init for defining the phone capability</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(py)dialNumberEnabled":{"name":"dialNumberEnabled","abstract":"<p>Whether or not the DialNumber RPC is enabled.</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(py)requiresEncryption":{"name":"requiresEncryption","abstract":"<p>Flag indicating if the app requires an encryption service to be active.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLPermissionManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isRPCNameAllowed:":{"name":"-isRPCNameAllowed:","abstract":"<p>Determine if an individual RPC is allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)groupStatusOfRPCPermissions:":{"name":"-groupStatusOfRPCPermissions:","abstract":"<p>Determine if all RPCs are allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)statusesOfRPCPermissions:":{"name":"-statusesOfRPCPermissions:","abstract":"<p>Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber<BOOL> specifying if that RPC is currently allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)subscribeToRPCPermissions:groupType:withHandler:":{"name":"-subscribeToRPCPermissions:groupType:withHandler:","abstract":"<p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. The callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeAllObservers":{"name":"-removeAllObservers","abstract":"<p>Remove every current observer</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeObserverForIdentifier:":{"name":"-removeObserverForIdentifier:","abstract":"<p>Remove block observers for the specified RPC</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)rpcNameRequiresEncryption:":{"name":"-rpcNameRequiresEncryption:","abstract":"<p>Check whether or not an RPC needs encryption.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isPermissionParameterAllowed:parameter:":{"name":"-isPermissionParameterAllowed:parameter:","abstract":"<p>Check whether a parameter of an RPC is allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC in the policy table.</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)hmiPermissions":{"name":"hmiPermissions","abstract":"<p>HMI Permissions for the individual RPC; i.e. which HMI levels may it be used in</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the RPC needs encryption</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(im)initWithRPCName:parameterPermissions:":{"name":"-initWithRPCName:parameterPermissions:","abstract":"<p>Creates a new permission element.</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)choiceID":{"name":"choiceID","abstract":"<p>ID of the choice that was selected in response to PerformInteraction. Only is valid if general result is &ldquo;success:true&rdquo;.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)manualTextEntry":{"name":"manualTextEntry","abstract":"<p>Manually entered text selection, e.g. through keyboard. Can be returned in lieu of choiceID, depending on the trigger source.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)triggerSource":{"name":"triggerSource","abstract":"<p>A <em>SDLTriggerSource</em> object which will be shown in the HMI. Only is valid if resultCode is SUCCESS.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:":{"name":"-initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:","abstract":"<p>Convenience init for creating a basic display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:":{"name":"-initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:","abstract":"<p>Convenience init for setting all parameters of a display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialText":{"name":"initialText","abstract":"<p>Text to be displayed first.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>This is the TTS prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionMode":{"name":"interactionMode","abstract":"<p>For application-requested interactions, this mode indicates the method in which the user is notified and uses the interaction. Users can choose either only by voice (VR_ONLY), by tactile selection from the menu (MANUAL_ONLY), or by either mode (BOTH).</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionChoiceSetIDList":{"name":"interactionChoiceSetIDList","abstract":"<p>List of interaction choice set IDs to use with an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help text. This is the spoken text when a user speaks &ldquo;help&rdquo; while the interaction is occurring.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Timeout text. This text is spoken when a VR interaction times out.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeout":{"name":"timeout","abstract":"<p>Timeout in milliseconds. Applies only to the menu portion of the interaction. The VR timeout will be handled by the platform. If omitted a standard value of 10 seconds is used.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)vrHelp":{"name":"vrHelp","abstract":"<p>Suggested voice recognition help items to display on-screen during a perform interaction. If omitted on supported displays, the default generated list of suggested choices shall be displayed.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionLayout":{"name":"interactionLayout","abstract":"<p>For tactile interaction modes (MANUAL_ONLY, or BOTH), the layout mode of how the choices are presented.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific perform interaction to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>initial prompt which will be spoken before opening the audio pass","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText1":{"name":"audioPassThruDisplayText1","abstract":"<p>a line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText2":{"name":"audioPassThruDisplayText2","abstract":"<p>A line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)samplingRate":{"name":"samplingRate","abstract":"<p>A samplingRate</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)maxDuration":{"name":"maxDuration","abstract":"<p>the maximum duration of audio recording in milliseconds</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>the quality the audio is recorded - 8 bit or 16 bit</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioType":{"name":"audioType","abstract":"<p>an audioType</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)muteAudio":{"name":"muteAudio","abstract":"<p>a Boolean value representing if the current audio source should be","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioDataHandler":{"name":"audioDataHandler","abstract":"<p>A handler that will be called whenever an <code>onAudioPassThru</code> notification is received.</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(im)initWithServiceSpecificResult:":{"name":"-initWithServiceSpecificResult:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(py)serviceSpecificResult":{"name":"serviceSpecificResult","abstract":"<p>The service can provide specific result strings to the consumer through this param.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:":{"name":"-initWithServiceUri:serviceID:originApp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:requestServiceActive:":{"name":"-initWithServiceUri:serviceID:originApp:requestServiceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceUri":{"name":"serviceUri","abstract":"<p>Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes no guarantee that this URI is correct.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceID":{"name":"serviceID","abstract":"<p>The service ID that the app consumer wishes to send this URI.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)originApp":{"name":"originApp","abstract":"<p>This string is the appID of the app requesting the app service provider take the specific action.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)requestServiceActive":{"name":"requestServiceActive","abstract":"<p>This flag signals the requesting consumer would like this service to become the active primary service of the destination&rsquo;s type.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all parameters that are permitted for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all parameters that are prohibited for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLOnWayPointChange.html#/c:objc(cs)SDLOnWayPointChange(py)waypoints":{"name":"waypoints","abstract":"<p>Location address for display purposes only</p>","parent_name":"SDLOnWayPointChange"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:updateSubCells:":{"name":"-initWithMenuID:updateSubCells:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)menuID":{"name":"menuID","abstract":"<p>This menuID must match a menuID in the current menu structure","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)updateSubCells":{"name":"updateSubCells","abstract":"<p>If not set, assume false. If true, the app should send AddCommands with parentIDs matching the menuID. These AddCommands will then be attached to the submenu and displayed if the submenu is selected.</p>","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(im)initWithFileName:":{"name":"-initWithFileName:","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(py)fileName":{"name":"fileName","abstract":"<p>File reference name.","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)type":{"name":"type","abstract":"<p>The type of touch event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)event":{"name":"event","abstract":"<p>List of all individual touches involved in this event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTBTClientState.html#/c:objc(cs)SDLOnTBTClientState(py)state":{"name":"state","abstract":"<p>Current State of TBT client</p>","parent_name":"SDLOnTBTClientState"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)url":{"name":"url","abstract":"<p>Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If not blank, the binary data shall be forwarded to the url with a provided timeout in seconds.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)timeout":{"name":"timeout","abstract":"<p>Optional timeout for HTTP requests Required if a URL is provided</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)fileType":{"name":"fileType","abstract":"<p>Optional file type (meant for HTTP file requests).</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(im)initWithSystemCapability:":{"name":"-initWithSystemCapability:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(py)systemCapability":{"name":"systemCapability","abstract":"<p>The system capability that has been updated.</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)URL":{"name":"URL","abstract":"<p>The url</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>How long until a timeout</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allocatedModules":{"name":"allocatedModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)freeModules":{"name":"freeModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that are free to access for the application.</p>","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allowed":{"name":"allowed","abstract":"<p>Issued by SDL to notify the application about remote control status change on SDL","parent_name":"SDLOnRCStatus"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)permissionItem":{"name":"permissionItem","abstract":"<p>Describes change in permissions for a given set of RPCs</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the app needs the encryption permission</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)language":{"name":"language","abstract":"<p>Current SDL voice engine (VR+TTS) language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>Current display language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)event":{"name":"event","abstract":"<p>The type of keyboard input</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)data":{"name":"data","abstract":"<p>The current keyboard string input from the user</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnInteriorVehicleData.html#/c:objc(cs)SDLOnInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The subscribed module data that changed</p>","parent_name":"SDLOnInteriorVehicleData"},"Classes/SDLOnHashChange.html#/c:objc(cs)SDLOnHashChange(py)hashID":{"name":"hashID","abstract":"<p>Calculated hash ID to be referenced during RegisterAppInterface request.</p>","parent_name":"SDLOnHashChange"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>SDLHMILevel in effect for the application</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>Current state of audio streaming for the application. When this parameter has a value of NOT_AUDIBLE, the application must stop streaming audio to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)videoStreamingState":{"name":"videoStreamingState","abstract":"<p>Current availability of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)systemContext":{"name":"systemContext","abstract":"<p>Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended for. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(im)initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:":{"name":"-initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:","abstract":"<p>Initialize an SDLOnHMIStatus RPC with initial parameters</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)URL":{"name":"URL","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded to the provided URL.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded with the provided timeout in seconds.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)state":{"name":"state","abstract":"<p>The driver distraction state (i.e. whether driver distraction rules are in effect, or not)</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalEnabled":{"name":"lockScreenDismissalEnabled","abstract":"<p>If enabled, the lock screen will be able to be dismissed while connected to SDL, allowing users the ability to interact with the app.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalWarning":{"name":"lockScreenDismissalWarning","abstract":"<p>Warning message to be displayed on the lock screen when dismissal is enabled. This warning should be used to ensure that the user is not the driver of the vehicle, ex. <code>Swipe up to dismiss, acknowledging that you are not the driver.</code>. This parameter must be present if &ldquo;lockScreenDismissalEnabled&rdquo; is set to true.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)cmdID":{"name":"cmdID","abstract":"<p>The command ID of the command the user selected. This is the command ID value provided by the application in the SDLAddCommand operation that created the command.</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)triggerSource":{"name":"triggerSource","abstract":"<p>Indicates whether command was selected via voice or via a menu selection (using the OK button).</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The button&rsquo;s name</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonEventMode":{"name":"buttonEventMode","abstract":"<p>Indicates whether this is an UP or DOWN event</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(im)initWithServiceData:":{"name":"-initWithServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(py)serviceData":{"name":"serviceData","abstract":"<p>The updated app service data.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppInterfaceUnregistered.html#/c:objc(cs)SDLOnAppInterfaceUnregistered(py)reason":{"name":"reason","abstract":"<p>The reason application&rsquo;s interface was terminated</p>","parent_name":"SDLOnAppInterfaceUnregistered"},"Classes/SDLOnAppCapabilityUpdated.html#/c:objc(cs)SDLOnAppCapabilityUpdated(im)initWithAppCapability:":{"name":"-initWithAppCapability:","parent_name":"SDLOnAppCapabilityUpdated"},"Classes/SDLOnAppCapabilityUpdated.html#/c:objc(cs)SDLOnAppCapabilityUpdated(py)appCapability":{"name":"appCapability","abstract":"<p>The app capability that has been updated</p>","parent_name":"SDLOnAppCapabilityUpdated"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:","abstract":"<p>Convenience init to describe an oasis address</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:","abstract":"<p>Convenience init to describe an oasis address with all parameters</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryName":{"name":"countryName","abstract":"<p>Name of the country (localized)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryCode":{"name":"countryCode","abstract":"<p>countryCode of the country(ISO 3166-2)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)postalCode":{"name":"postalCode","abstract":"<p>postalCode of location (PLZ, ZIP, PIN, CAP etc.)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)administrativeArea":{"name":"administrativeArea","abstract":"<p>Portion of country (e.g. state)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subAdministrativeArea":{"name":"subAdministrativeArea","abstract":"<p>Portion of administrativeArea (e.g. county)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)locality":{"name":"locality","abstract":"<p>Hypernym for city/village</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subLocality":{"name":"subLocality","abstract":"<p>Hypernym for district</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)thoroughfare":{"name":"thoroughfare","abstract":"<p>Hypernym for street, road etc.</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subThoroughfare":{"name":"subThoroughfare","abstract":"<p>Portion of thoroughfare (e.g. house number)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allResponseNames":{"name":"+allResponseNames","abstract":"<p>All of the possible SDL RPC Response notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allButtonEventNotifications":{"name":"+allButtonEventNotifications","abstract":"<p>All of the possible SDL Button event notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(im)initWithAcceptsWayPoints:":{"name":"-initWithAcceptsWayPoints:","abstract":"<p>Convenience init.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(py)acceptsWayPoints":{"name":"acceptsWayPoints","abstract":"<p>Informs the subscriber if this service can actually accept way points.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:":{"name":"-initWithTimestamp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:":{"name":"-initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)timestamp":{"name":"timestamp","abstract":"<p>This is the timestamp of when the data was generated. This is to ensure any time or distance given in the data can accurately be adjusted if necessary.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)origin":{"name":"origin","abstract":"<p>The start location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destination":{"name":"destination","abstract":"<p>The final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destinationETA":{"name":"destinationETA","abstract":"<p>The estimated time of arrival at the final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)instructions":{"name":"instructions","abstract":"<p>This array should be ordered with all remaining instructions. The start of this array should always contain the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionETA":{"name":"nextInstructionETA","abstract":"<p>The estimated time of arrival at the next destination.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistance":{"name":"nextInstructionDistance","abstract":"<p>The distance to this instruction from current location. This should only be updated ever .1 unit of distance. For more accuracy the consumer can use the GPS location of itself and the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistanceScale":{"name":"nextInstructionDistanceScale","abstract":"<p>Distance till next maneuver (starting from) from previous maneuver.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)prompt":{"name":"prompt","abstract":"<p>This is a prompt message that should be conveyed to the user through either display or voice (TTS). This param will change often as it should represent the following: approaching instruction, post instruction, alerts that affect the current navigation session, etc.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:":{"name":"-initWithLocationDetails:action:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:":{"name":"-initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)locationDetails":{"name":"locationDetails","abstract":"<p>The location details.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)action":{"name":"action","abstract":"<p>The navigation action.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)eta":{"name":"eta","abstract":"<p>The estimated time of arrival.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)bearing":{"name":"bearing","abstract":"<p>The angle at which this instruction takes place. For example, 0 would mean straight, &lt;=45 is bearing right, &gt;= 135 is sharp right, between 45 and 135 is a regular right, and 180 is a U-Turn, etc. </p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)junctionType":{"name":"junctionType","abstract":"<p>The navigation junction type.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)drivingSide":{"name":"drivingSide","abstract":"<p>Used to infer which side of the road this instruction takes place. For a U-Turn (action=TURN, bearing=180) this will determine which direction the turn should take place.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)details":{"name":"details","abstract":"<p>This is a string representation of this instruction, used to display instructions to the users. This is not intended to be read aloud to the users, see the param prompt in <code>NavigationServiceData</code> for that.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)image":{"name":"image","abstract":"<p>An image representation of this instruction.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(im)initWithSendLocation:waypoints:":{"name":"-initWithSendLocation:waypoints:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)sendLocationEnabled":{"name":"sendLocationEnabled","abstract":"<p>Whether or not the SendLocation RPC is enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)getWayPointsEnabled":{"name":"getWayPointsEnabled","abstract":"<p>Whether or not Waypoint related RPCs are enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLMyKey.html#/c:objc(cs)SDLMyKey(py)e911Override":{"name":"e911Override","abstract":"<p>Indicates whether e911 override is on. References signal &ldquo;MyKey_e911Override_St&rdquo;. See VehicleDataStatus.</p>","parent_name":"SDLMyKey"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"<p>The major version indicates versions that is not-compatible to previous versions</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)minorVersion":{"name":"minorVersion","abstract":"<p>The minor version indicates a change to a previous version that should still allow to be run on an older version (with limited functionality)</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"<p>Allows backward-compatible fixes to the API without increasing the minor version of the interface</p>","parent_name":"SDLMsgVersion"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)moduleId":{"name":"moduleId","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)location":{"name":"location","abstract":"<p>Location of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)serviceArea":{"name":"serviceArea","abstract":"<p>Service area of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)allowMultipleAccess":{"name":"allowMultipleAccess","abstract":"<p>Allow multiple users/apps to access the module or not</p>","parent_name":"SDLModuleInfo"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithRadioControlData:":{"name":"-initWithRadioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithClimateControlData:":{"name":"-initWithClimateControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithAudioControlData:":{"name":"-initWithAudioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithLightControlData:":{"name":"-initWithLightControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithHMISettingsControlData:":{"name":"-initWithHMISettingsControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with hmi settings data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithSeatControlData:":{"name":"-initWithSeatControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleType":{"name":"moduleType","abstract":"<p>The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)radioControlData":{"name":"radioControlData","abstract":"<p>The radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)climateControlData":{"name":"climateControlData","abstract":"<p>The climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)seatControlData":{"name":"seatControlData","abstract":"<p>The seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)audioControlData":{"name":"audioControlData","abstract":"<p>The audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)lightControlData":{"name":"lightControlData","abstract":"<p>The light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)hmiSettingsControlData":{"name":"hmiSettingsControlData","abstract":"<p>The hmi control data</p>","parent_name":"SDLModuleData"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:":{"name":"-initWithTextFieldTypes:mainField2:","abstract":"<p>Constructs a newly allocated SDLMetadataType object with NSArrays</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:mainField3:mainField4:":{"name":"-initWithTextFieldTypes:mainField2:mainField3:mainField4:","abstract":"<p>Constructs a newly allocated SDLMetadataType with all parameters</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField1":{"name":"mainField1","abstract":"<p>The type of data contained in the &ldquo;mainField1&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField2":{"name":"mainField2","abstract":"<p>The type of data contained in the &ldquo;mainField2&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField3":{"name":"mainField3","abstract":"<p>The type of data contained in the &ldquo;mainField3&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField4":{"name":"mainField4","abstract":"<p>The type of data contained in the &ldquo;mainField4&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:":{"name":"-initWithMenuName:","abstract":"<p>Convenience init with required parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentId:position:":{"name":"-initWithMenuName:parentId:position:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentID:position:secondaryText:tertiaryText:":{"name":"-initWithMenuName:parentID:position:secondaryText:tertiaryText:","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)parentID":{"name":"parentID","abstract":"<p>The unique ID of an existing submenu to which a command will be added</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)position":{"name":"position","abstract":"<p>The position within the items of the parent Command Menu</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)menuName":{"name":"menuName","abstract":"<p>The menu name which appears in menu, representing this command</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)secondaryText":{"name":"secondaryText","abstract":"<p>Optional secondary text to display","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Optional tertiary text to display","parent_name":"SDLMenuParams"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)mainMenuLayout":{"name":"mainMenuLayout","abstract":"<p>Changes the default main menu layout. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)defaultSubmenuLayout":{"name":"defaultSubmenuLayout","abstract":"<p>Changes the default submenu layout. To change this for an individual submenu, set the <code>menuLayout</code> property on the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html\">SDLMenuCell</a></code> initializer for creating a cell with sub-cells. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(im)initWithMainMenuLayout:defaultSubmenuLayout:":{"name":"-initWithMainMenuLayout:defaultSubmenuLayout:","abstract":"<p>Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overridden per-submenu if desired.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title":{"name":"title","abstract":"<p>The cell&rsquo;s text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)icon":{"name":"icon","abstract":"<p>The cell&rsquo;s icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells":{"name":"subCells","abstract":"<p>If this is non-nil, this cell will be a sub-menu button, displaying the subcells in a menu when pressed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)submenuLayout":{"name":"submenuLayout","abstract":"<p>The layout in which the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells\">subCells</a></code> will be displayed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)uniqueTitle":{"name":"uniqueTitle","abstract":"<p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title\">title</a></code> but other fields are different. This is autogenerated by the screen manager. This will not be used when connected to modules supporting RPC 7.1+ because duplicate titles are supported.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>The cell&rsquo;s secondary text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>The cell&rsquo;s tertiary text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>The cell&rsquo;s secondary icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:voiceCommands:handler:":{"name":"-initWithTitle:icon:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:submenuLayout:subCells:":{"name":"-initWithTitle:icon:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:":{"name":"-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:":{"name":"-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(im)initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:","abstract":"<p>Convenience init</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaImage":{"name":"mediaImage","abstract":"<p>Sets the media image associated with the currently playing media","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaType":{"name":"mediaType","abstract":"<p>The type of the currently playing or paused track.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaTitle":{"name":"mediaTitle","abstract":"<p>Music: The name of the current track","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaArtist":{"name":"mediaArtist","abstract":"<p>Music: The name of the current album artist","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaAlbum":{"name":"mediaAlbum","abstract":"<p>Music: The name of the current album","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)playlistName":{"name":"playlistName","abstract":"<p>Music: The name of the playlist or radio station, if the user is playing from a playlist, otherwise, Null","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)isExplicit":{"name":"isExplicit","abstract":"<p>Whether or not the content currently playing (e.g. the track, episode, or book) contains explicit content.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackProgress":{"name":"trackPlaybackProgress","abstract":"<p>Music: The current progress of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackDuration":{"name":"trackPlaybackDuration","abstract":"<p>Music: The total duration of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackProgress":{"name":"queuePlaybackProgress","abstract":"<p>Music: The current progress of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackDuration":{"name":"queuePlaybackDuration","abstract":"<p>Music: The total duration of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueCurrentTrackNumber":{"name":"queueCurrentTrackNumber","abstract":"<p>Music: The current number (1 based) of the track in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueTotalTrackCount":{"name":"queueTotalTrackCount","abstract":"<p>Music: The total number of tracks in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(im)initWithMassageMode:massageZone:":{"name":"-initWithMassageMode:massageZone:","abstract":"<p>@abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract mode of a massage zone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageZone":{"name":"massageZone","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(im)initWithMassageCushion:firmness:":{"name":"-initWithMassageCushion:firmness:","abstract":"<p>Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)cushion":{"name":"cushion","abstract":"<p>@abstract cushion of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)firmness":{"name":"firmness","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)configuration":{"name":"configuration","abstract":"<p>The configuration the manager was set up with.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>The current HMI level of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>The current audio streaming state of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemContext":{"name":"systemContext","abstract":"<p>The current system context of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)fileManager":{"name":"fileManager","abstract":"<p>The file manager to be used by the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)permissionManager":{"name":"permissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)streamManager":{"name":"streamManager","abstract":"<p>The streaming media manager to be used for starting video sessions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)screenManager":{"name":"screenManager","abstract":"<p>The screen manager for sending UI related RPCs.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemCapabilityManager":{"name":"systemCapabilityManager","abstract":"<p>Centralized manager for retrieving all system capabilities.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)registerResponse":{"name":"registerResponse","abstract":"<p>The response of a register call after it has been received.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)authToken":{"name":"authToken","abstract":"<p>The auth token, if received. This should be used to log into a user account. Primarily used for cloud apps with companion app stores.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)delegate":{"name":"delegate","abstract":"<p>The manager&rsquo;s delegate.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)pendingRPCTransactions":{"name":"pendingRPCTransactions","abstract":"<p>The currently pending RPC request send transactions</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)initWithConfiguration:delegate:":{"name":"-initWithConfiguration:delegate:","abstract":"<p>Initialize the manager with a configuration. Call <code>startWithHandler</code> to begin waiting for a connection.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startWithReadyHandler:":{"name":"-startWithReadyHandler:","abstract":"<p>Start the manager, which will tell it to start looking for a connection. Once one does, it will automatically run the setup process and call the readyBlock when done.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager, it will disconnect if needed and no longer look for a connection. You probably don&rsquo;t need to call this method ever.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startRPCEncryption":{"name":"-startRPCEncryption","abstract":"<p>Start the encryption lifecycle manager, which will attempt to open a secure service.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRPC:":{"name":"-sendRPC:","abstract":"<p>Send an RPC of type <code>Response</code>, <code>Notification</code> or <code>Request</code>. Responses and notifications sent to Core do not a response back from Core. Each request sent to Core does get a response, so if you need the response and/or error, call <code>sendRequest:withResponseHandler:</code> instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:":{"name":"-sendRequest:","abstract":"<p>Send an RPC request and don&rsquo;t bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:withResponseHandler:":{"name":"-sendRequest:withResponseHandler:","abstract":"<p>Send an RPC request and set a completion handler that will be called with the response when the response returns.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequests:progressHandler:completionHandler:":{"name":"-sendRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendSequentialRequests:progressHandler:completionHandler:":{"name":"-sendSequentialRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withBlock:":{"name":"-subscribeToRPC:withBlock:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a block callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withObserver:selector:":{"name":"-subscribeToRPC:withObserver:selector:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)unsubscribeFromRPC:withObserver:":{"name":"-unsubscribeFromRPC:withObserver:","abstract":"<p>Unsubscribe to callbacks about a particular RPC request, notification, or response.</p>","parent_name":"SDLManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)modules":{"name":"modules","abstract":"<p>Active log modules</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)targets":{"name":"targets","abstract":"<p>Active log targets</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)filters":{"name":"filters","abstract":"<p>Active log filters</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use this log level</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)formatType":{"name":"formatType","abstract":"<p>Active log format</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not verbose, debug, and warning logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)dateFormatter":{"name":"dateFormatter","abstract":"<p>Active date formatter</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)logQueue":{"name":"logQueue","abstract":"<p>The queue asynchronously logged logs are logged on. Say that 10 times fast.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)sharedManager":{"name":"+sharedManager","abstract":"<p>The singleton object</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)setConfiguration:":{"name":"+setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager&rsquo;s sharedManager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)setConfiguration:":{"name":"-setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to the sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"+logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"-logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this manager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"+logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to the sharedManager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"-logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to this manager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(py)filter":{"name":"filter","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)initWithCustomFilter:":{"name":"-initWithCustomFilter:","abstract":"<p>Create a new filter with a custom filter block. The filter block will take a log model and return a BOOL of pass / fail.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingString:caseSensitive:":{"name":"+filterByDisallowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs not containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingString:caseSensitive:":{"name":"+filterByAllowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingRegex:":{"name":"+filterByDisallowingRegex:","abstract":"<p>Returns a filter that only allows logs not passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingRegex:":{"name":"+filterByAllowingRegex:","abstract":"<p>Returns a filter that only allows logs passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingModules:":{"name":"+filterByDisallowingModules:","abstract":"<p>Returns a filter that only allows logs not within the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingModules:":{"name":"+filterByAllowingModules:","abstract":"<p>Returns a filter that only allows logs of the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingFileNames:":{"name":"+filterByDisallowingFileNames:","abstract":"<p>Returns a filter that only allows logs not within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingFileNames:":{"name":"+filterByAllowingFileNames:","abstract":"<p>Returns a filter that only allows logs within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)name":{"name":"name","abstract":"<p>The name of the this module, e.g. &ldquo;Transport&rdquo;</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)files":{"name":"files","abstract":"<p>All of the files contained within this module. When a log is logged, the <code>__FILE__</code> (in Obj-C) or <code>#file</code> (in Swift) is automatically captured and checked to see if any module has a file in this set that matches. If it does, it will be logged using the module&rsquo;s log level and the module&rsquo;s name will be printed in the formatted log.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)logLevel":{"name":"logLevel","abstract":"<p>The custom level of the log. This is <code>SDLLogLevelDefault</code> (whatever the current global log level is) by default.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)init":{"name":"-init","abstract":"<p>This method is unavailable and may not be used.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:level:":{"name":"-initWithName:files:level:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name, set of files, and associated log level.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:":{"name":"-initWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(cm)moduleWithName:files:":{"name":"+moduleWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)containsFile:":{"name":"-containsFile:","abstract":"<p>Returns whether or not this module contains a given file.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)modules":{"name":"modules","abstract":"<p>Any custom logging modules used by the developer&rsquo;s code. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)targets":{"name":"targets","abstract":"<p>Where the logs will attempt to output. Defaults to Console.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)filters":{"name":"filters","abstract":"<p>What log filters will run over this session. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)formatType":{"name":"formatType","abstract":"<p>How detailed of logs will be output. Defaults to Default.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not logs will be run on a separate queue, asynchronously, allowing the following code to run before the log completes. Or if it will occur synchronously, which will prevent logs from being missed, but will slow down surrounding code. Defaults to YES.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs will be dispatched to loggers asynchronously. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use the global log level. Defaults to Error.","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>A default logger for production. This sets the format type to Default, the log level to Error, and the target to SDLLogTargetOSLog.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)debugConfiguration":{"name":"+debugConfiguration","abstract":"<p>A debug logger for use in development. This sets the format type to Detailed, the log level to Debug, and enables the Console and ASL loggers.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)appIcon":{"name":"appIcon","abstract":"<p>The app&rsquo;s icon. This will be set by the lock screen configuration.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)vehicleIcon":{"name":"vehicleIcon","abstract":"<p>The vehicle&rsquo;s designated icon. This will be set by the lock screen manager when it is notified that a lock screen icon has been downloaded.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The designated background color set in the lock screen configuration, or the default SDL gray-blue.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)lockedLabelText":{"name":"lockedLabelText","abstract":"<p>The locked label string. This will be set by the lock screen manager to inform the user about the dismissible state.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)addDismissGestureWithCallback:":{"name":"-addDismissGestureWithCallback:","abstract":"<p>Adds a swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)removeDismissGesture":{"name":"-removeDismissGesture","abstract":"<p>Remove swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)displayMode":{"name":"displayMode","abstract":"<p>Describes when the lock screen will be displayed. Defaults to <code>SDLLockScreenConfigurationDisplayModeRequiredOnly</code>.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)enableDismissGesture":{"name":"enableDismissGesture","abstract":"<p>If YES, then the lock screen can be dismissed with a downward swipe on compatible head units. Requires a connection of SDL 6.0+ and the head unit to enable the feature. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)showDeviceLogo":{"name":"showDeviceLogo","abstract":"<p>If YES, then the lockscreen will show the vehicle&rsquo;s logo if the vehicle has made it available. If NO, then the lockscreen will not show the vehicle logo. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>Your app icon as it will appear on the lock screen.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)customViewController":{"name":"customViewController","abstract":"<p>A custom view controller that the lock screen will manage the presentation of.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)disabledConfiguration":{"name":"+disabledConfiguration","abstract":"<p>Use this configuration if you wish to manage a lock screen yourself. This may be useful if the automatic presentation feature of SDLLockScreenManager is failing for some reason.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfiguration":{"name":"+enabledConfiguration","abstract":"<p>Use this configuration for the basic default lock screen. A custom app icon will not be used.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithAppIcon:backgroundColor:":{"name":"+enabledConfigurationWithAppIcon:backgroundColor:","abstract":"<p>Use this configuration to provide a custom lock screen icon and a custom background color, or nil if you wish to use the default background color. This will use the default lock screen layout.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithViewController:":{"name":"+enabledConfigurationWithViewController:","abstract":"<p>Use this configuration if you wish to provide your own view controller for the lock screen. This view controller&rsquo;s presentation and dismissal will still be managed by the lock screen manager. Note that you may subclass SDLLockScreenViewController and pass it here to continue to have the vehicle icon set to your view controller by the manager.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:":{"name":"-initWithCoordinate:","abstract":"<p>Convenience init for location coordinate.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:":{"name":"-initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)coordinate":{"name":"coordinate","abstract":"<p>Latitude/Longitude of the location</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationName":{"name":"locationName","abstract":"<p>Name of location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description intended location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)searchAddress":{"name":"searchAddress","abstract":"<p>Address to be used by navigation engines for search.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(im)initWithLatitudeDegrees:longitudeDegrees:":{"name":"-initWithLatitudeDegrees:longitudeDegrees:","abstract":"<p>Convenience init for location coordinates</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)filenames":{"name":"filenames","abstract":"<p>An array of all filenames resident on the module for the given registered app. If omitted, then no files currently reside on the system.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available on the module for the registered app.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:":{"name":"-initWithId:status:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:density:color:":{"name":"-initWithId:status:density:color:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:lightStatus:lightDensity:lightColor:":{"name":"-initWithId:lightStatus:lightDensity:lightColor:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)id":{"name":"id","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)status":{"name":"status","abstract":"<p>@abstract Reflects the status of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)density":{"name":"density","abstract":"<p>@abstract Reflects the density of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)color":{"name":"color","abstract":"<p>@abstract Reflects the color of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(im)initWithLightStates:":{"name":"-initWithLightStates:","abstract":"<p>Constructs a newly allocated SDLLightControlData object with lightState</p>","parent_name":"SDLLightControlData"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(py)lightState":{"name":"lightState","abstract":"<p>@abstract An array of LightNames and their current or desired status.","parent_name":"SDLLightControlData"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(im)initWithModuleName:moduleInfo:supportedLights:":{"name":"-initWithModuleName:moduleInfo:supportedLights:","abstract":"<p>Constructs a newly allocated SDLLightControlCapabilities object with given parameters</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)supportedLights":{"name":"supportedLights","abstract":"<p>@abstract An array of available LightCapabilities that are controllable.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with the name of the light or group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:densityAvailable:colorAvailable:statusAvailable:":{"name":"-initWithName:densityAvailable:colorAvailable:statusAvailable:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with given parameters</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)name":{"name":"name","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)densityAvailable":{"name":"densityAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s density can be set remotely (similar to a dimmer).</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)colorAvailable":{"name":"colorAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s color can be set remotely by using the RGB color space.</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)statusAvailable":{"name":"statusAvailable","abstract":"<p>@abstract Indicates if the status (ON/OFF) can be set remotely.","parent_name":"SDLLightCapabilities"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)appName":{"name":"appName","abstract":"<p>The full name of the app to that the configuration should be updated to.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(im)initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:":{"name":"-initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:","abstract":"<p>Initializes and returns a newly allocated lifecycle configuration update object with the specified app data.","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:fullAppId:":{"name":"+defaultConfigurationWithAppName:fullAppId:","abstract":"<p>A production configuration that runs using IAP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:fullAppId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:fullAppId:ipAddress:port:","abstract":"<p>A debug configuration that runs using TCP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugMode":{"name":"tcpDebugMode","abstract":"<p>Whether or not debug mode is enabled</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugIPAddress":{"name":"tcpDebugIPAddress","abstract":"<p>The ip address at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugPort":{"name":"tcpDebugPort","abstract":"<p>The port at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appName":{"name":"appName","abstract":"<p>The full name of the app</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appId":{"name":"appId","abstract":"<p>The app id. This must be the same as the app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)fullAppId":{"name":"fullAppId","abstract":"<p>The full app id. This must be the same as the full app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)resumeHash":{"name":"resumeHash","abstract":"<p>A hash id which should be passed to the remote system in the RegisterAppInterface</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)isMedia":{"name":"isMedia","abstract":"<p>This is an automatically set based on the app type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType":{"name":"appType","abstract":"<p>The application type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)additionalAppTypes":{"name":"additionalAppTypes","abstract":"<p>Additional application types beyond <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType\">appType</a></code></p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)language":{"name":"language","abstract":"<p>The default language to use</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)languagesSupported":{"name":"languagesSupported","abstract":"<p>An array of all the supported languages</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>The application icon to be used on an app launching screen</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumProtocolVersion":{"name":"minimumProtocolVersion","abstract":"<p>The minimum protocol version that will be permitted to connect. This defaults to 1.0.0. If the protocol version of the head unit connected is below this version, the app will disconnect with an EndService protocol message and will not register.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumRPCVersion":{"name":"minimumRPCVersion","abstract":"<p>The minimum RPC version that will be permitted to connect. This defaults to 1.0.0. If the RPC version of the head unit connected is below this version, an UnregisterAppInterface will be sent.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)allowedSecondaryTransports":{"name":"allowedSecondaryTransports","abstract":"<p>Which transports are permitted to be used as secondary transports. A secondary transport is a transport that is connected as an alternate, higher bandwidth transport for situations when a low-bandwidth primary transport (such as Bluetooth) will restrict certain features (such as video streaming navigation).</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:","abstract":"<p>Create a Keyboard Properties RPC object</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:":{"name":"-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:","abstract":"<p>Convenience init with all properties.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:":{"name":"-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)language":{"name":"language","abstract":"<p>The keyboard language</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>Desired keyboard layout</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keypressMode":{"name":"keypressMode","abstract":"<p>Desired keypress mode.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)limitedCharacterList":{"name":"limitedCharacterList","abstract":"<p>Array of keyboard characters to enable. All omitted characters will be greyed out (disabled) on the keyboard. If omitted, the entire keyboard will be enabled.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteText":{"name":"autoCompleteText","abstract":"<p>Deprecated, use autoCompleteList instead.","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteList":{"name":"autoCompleteList","abstract":"<p>Allows an app to show a list of possible autocomplete suggestions as the user types</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)maskInputCharacters":{"name":"maskInputCharacters","abstract":"<p>Allows an app to mask entered characters on HMI</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)customKeys":{"name":"customKeys","abstract":"<p>Array of special characters to show in customizable keys. If omitted, keyboard will show default special characters","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(im)initWithKeyboardLayout:numConfigurableKeys:":{"name":"-initWithKeyboardLayout:numConfigurableKeys:","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>Undocumented</p>","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(py)numConfigurableKeys":{"name":"numConfigurableKeys","abstract":"<p>Number of keys available for special characters, App can customize as per their needs.","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(im)initWithMaskInputCharactersSupported:supportedKeyboards:":{"name":"-initWithMaskInputCharactersSupported:supportedKeyboards:","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)maskInputCharactersSupported":{"name":"maskInputCharactersSupported","abstract":"<p>Availability of capability to mask input characters using keyboard. True: Available, False: Not Available</p>","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)supportedKeyboards":{"name":"supportedKeyboards","abstract":"<p>Capabilities of supported keyboard layouts by HMI.","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionWidth":{"name":"resolutionWidth","abstract":"<p>Resolution width</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionHeight":{"name":"resolutionHeight","abstract":"<p>Resolution height</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(im)initWithWidth:height:":{"name":"-initWithWidth:height:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)name":{"name":"name","abstract":"<p>The name that identifies the field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>The image types that are supported in this field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageResolution":{"name":"imageResolution","abstract":"<p>The image resolution of this field</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(im)initWithName:imageTypeSupported:imageResolution:":{"name":"-initWithName:imageTypeSupported:imageResolution:","abstract":"<p>Convenience initializer for the ImageField RPC struct</p>","parent_name":"SDLImageField"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:isTemplate:":{"name":"-initWithName:ofType:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:isTemplate:":{"name":"-initWithName:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticImageValue:":{"name":"-initWithStaticImageValue:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticIconName:":{"name":"-initWithStaticIconName:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)value":{"name":"value","abstract":"<p>The static hex icon value or the binary image file name identifier (sent by SDLPutFile)</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)imageType":{"name":"imageType","abstract":"<p>Describes whether the image is static or dynamic</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)isTemplate":{"name":"isTemplate","abstract":"<p>Indicates that this image can be (re)colored by the HMI to best fit the current color scheme.</p>","parent_name":"SDLImage"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)lowBeamsOn":{"name":"lowBeamsOn","abstract":"<p>Low beams are on or off.</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)highBeamsOn":{"name":"highBeamsOn","abstract":"<p>High beams are on or off</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)ambientLightSensorStatus":{"name":"ambientLightSensorStatus","abstract":"<p>Status of the ambient light senser</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(im)initWithId:rect:":{"name":"-initWithId:rect:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)id":{"name":"id","abstract":"<p>A user control spatial identifier</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)rect":{"name":"rect","abstract":"<p>The position of the haptic rectangle to be highlighted. The center of this rectangle will be &ldquo;touched&rdquo; when a press occurs.</p>","parent_name":"SDLHapticRect"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(im)initWithDisplaymode:temperatureUnit:distanceUnit:":{"name":"-initWithDisplaymode:temperatureUnit:distanceUnit:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)displayMode":{"name":"displayMode","abstract":"<p>@abstract Display the Display Mode used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)temperatureUnit":{"name":"temperatureUnit","abstract":"<p>@abstract Display the temperature unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)distanceUnit":{"name":"distanceUnit","abstract":"<p>@abstract Display the distance unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the hmi setting module.","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)distanceUnitAvailable":{"name":"distanceUnitAvailable","abstract":"<p>@abstract Availability of the control of distance unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)temperatureUnitAvailable":{"name":"temperatureUnitAvailable","abstract":"<p>@abstract Availability of the control of temperature unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)displayModeUnitAvailable":{"name":"displayModeUnitAvailable","abstract":"<p>@abstract Availability of the control of HMI display mode.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all HMI levels that are permitted for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all HMI levels that are prohibited for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(im)initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:":{"name":"-initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)navigation":{"name":"navigation","abstract":"<p>Availability of built in Nav. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)phoneCall":{"name":"phoneCall","abstract":"<p>Availability of built in phone. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)videoStreaming":{"name":"videoStreaming","abstract":"<p>Availability of built in video streaming. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)remoteControl":{"name":"remoteControl","abstract":"<p>Availability of built in remote control. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)appServices":{"name":"appServices","abstract":"<p>Availability of app services. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)displays":{"name":"displays","abstract":"<p>Availability of displays. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)seatLocation":{"name":"seatLocation","abstract":"<p>Availability of seatLocation. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)driverDistraction":{"name":"driverDistraction","abstract":"<p>Availability of driver distraction capability. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)col":{"name":"col","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)row":{"name":"row","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)level":{"name":"level","abstract":"<p>Optional, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)colspan":{"name":"colspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)rowspan":{"name":"rowspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)levelspan":{"name":"levelspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGetWayPointsResponse.html#/c:objc(cs)SDLGetWayPointsResponse(py)waypoints":{"name":"waypoints","abstract":"<p>Provides additional human readable info regarding the result.</p>","parent_name":"SDLGetWayPointsResponse"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init to get waypoints.</p>","parent_name":"SDLGetWayPoints"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(py)waypointType":{"name":"waypointType","abstract":"<p>To request for either the destination","parent_name":"SDLGetWayPoints"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>The stability controls status</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, requests GPS data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, requests Speed data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, requests RPM data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, requests Fuel Level data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, requests Fuel Level State data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, requests Fuel Range data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, requests Instant Fuel Consumption data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)vin":{"name":"vin","abstract":"<p>A boolean value. If true, requests the Vehicle Identification Number.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, requests Tire Pressure data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, requests Odometer data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, requests Belt Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, requests Body Information data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, requests Device Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, requests Driver Braking data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, requests Wiper Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, requests Head Lamp Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, requests Engine Oil Life data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, requests Engine Torque data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, requests Acc Pedal Position data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, requests Steering Wheel Angle data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, requests Emergency Call Info data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, requests Air Bag Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, requests Emergency Event (if it occurred) data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, requests Cluster Mode Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, requests MyKey data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, requests Electronic Parking Brake status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, requests Turn Signal data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, requests the Cloud App Vehicle ID.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>A boolean value. If true, requests StabilityControlsStatus data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetSystemCapabilityResponse.html#/c:objc(cs)SDLGetSystemCapabilityResponse(py)systemCapability":{"name":"systemCapability","abstract":"<p>The requested system capability, of the type that was sent in the request</p>","parent_name":"SDLGetSystemCapabilityResponse"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:subscribe:":{"name":"-initWithType:subscribe:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>The type of system capability to get more information on</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)subscribe":{"name":"subscribe","abstract":"<p>Flag to subscribe to updates of the supplied service capability type. If true, the requester will be subscribed. If false, the requester will not be subscribed and be removed as a subscriber if it was previously subscribed.</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The requested data</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)isSubscribed":{"name":"isSubscribed","abstract":"<p>It is a conditional-mandatory parameter: must be returned in case &ldquo;subscribe&rdquo; parameter was present in the related request.</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataConsentResponse(py)allowed":{"name":"allowed","abstract":"<p>This array has the same size as &ldquo;moduleIds&rdquo; in the request; each element corresponding to one moduleId","parent_name":"SDLGetInteriorVehicleDataConsentResponse"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(im)initWithModuleType:moduleIds:":{"name":"-initWithModuleType:moduleIds:","abstract":"<p>Convenience init to get consent to control a module</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleIds":{"name":"moduleIds","abstract":"<p>Ids of a module of same type, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to get information of a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:moduleId:":{"name":"-initAndSubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to get information and subscribe to a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:moduleId:":{"name":"-initAndUnsubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to unsubscribe from particular module with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleType":{"name":"moduleType","abstract":"<p>The type of a RC module to retrieve module data from the vehicle.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)subscribe":{"name":"subscribe","abstract":"<p>If subscribe is true, the head unit will register OnInteriorVehicleData notifications for the requested module (moduleId and moduleType).","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(im)initWithOffset:length:fileType:crc:":{"name":"-initWithOffset:length:fileType:crc:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)fileType":{"name":"fileType","abstract":"<p>File type that is being sent in response.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:":{"name":"-initWithFileName:appServiceId:fileType:","abstract":"<p>Convenience init for sending a small file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:offset:length:":{"name":"-initWithFileName:appServiceId:fileType:offset:length:","abstract":"<p>Convenience init for sending a large file in multiple data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileName":{"name":"fileName","abstract":"<p>File name that should be retrieved.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)appServiceId":{"name":"appServiceId","abstract":"<p>ID of the service that should have uploaded the requested file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileType":{"name":"fileType","abstract":"<p>Selected file type.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)ecuHeader":{"name":"ecuHeader","abstract":"<p>2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf)</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)dtc":{"name":"dtc","abstract":"<p>Array of all reported DTCs on module (ecuHeader contains information if list is truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as defined in VHR_Layout_Specification_DTCs.pdf).</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:":{"name":"-initWithECUName:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:mask:":{"name":"-initWithECUName:mask:","abstract":"<p>Convenience init with all properties</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)ecuName":{"name":"ecuName","abstract":"<p>a name of the module to receive the DTC form","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)dtcMask":{"name":"dtcMask","abstract":"<p>DTC Mask Byte to be sent in diagnostic request to module. NSNumber* dtcMask Minvalue:0; Maxvalue:255</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(py)properties":{"name":"properties","abstract":"<p>The requested cloud application properties.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(im)initWithAppServiceData:":{"name":"-initWithAppServiceData:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(py)serviceData":{"name":"serviceData","abstract":"<p>Contains all the current data of the app service.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndSubscribeToAppServiceType:":{"name":"-initAndSubscribeToAppServiceType:","abstract":"<p>Convenience init for subscribing to a service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndUnsubscribeToAppServiceType:":{"name":"-initAndUnsubscribeToAppServiceType:","abstract":"<p>Convenience init for unsubscribing to a service type</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)subscribe":{"name":"subscribe","abstract":"<p>If true, the consumer is requesting to subscribe to all future updates from the service publisher. If false, the consumer doesn&rsquo;t wish to subscribe and should be unsubscribed if it was previously subscribed.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(im)initWithUserSelectedGear:actualGear:transmissionType:":{"name":"-initWithUserSelectedGear:actualGear:transmissionType:","abstract":"<p>Convenience initializer to assign all object properties</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)userSelectedGear":{"name":"userSelectedGear","abstract":"<p>Gear position selected by the user i.e. Park, Drive, Reverse</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)actualGear":{"name":"actualGear","abstract":"<p>Actual Gear in use by the transmission</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)transmissionType":{"name":"transmissionType","abstract":"<p>Tells the transmission type</p>","parent_name":"SDLGearStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLGateStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(py)location":{"name":"location","abstract":"<p>Undocumented</p>","parent_name":"SDLGateStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(py)status":{"name":"status","abstract":"<p>Undocumented</p>","parent_name":"SDLGateStatus"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>longitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>latitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcYear":{"name":"utcYear","abstract":"<p>utc year</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMonth":{"name":"utcMonth","abstract":"<p>utc month</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcDay":{"name":"utcDay","abstract":"<p>utc day</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcHours":{"name":"utcHours","abstract":"<p>utc hours</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMinutes":{"name":"utcMinutes","abstract":"<p>utc minutes</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcSeconds":{"name":"utcSeconds","abstract":"<p>utc seconds</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)compassDirection":{"name":"compassDirection","abstract":"<p>Optional, Potential Compass Directions</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)pdop":{"name":"pdop","abstract":"<p>The 3D positional dilution of precision.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)hdop":{"name":"hdop","abstract":"<p>The horizontal dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)vdop":{"name":"vdop","abstract":"<p>the vertical dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)actual":{"name":"actual","abstract":"<p>What the coordinates are based on</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)satellites":{"name":"satellites","abstract":"<p>The number of satellites in view</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)dimension":{"name":"dimension","abstract":"<p>The supported dimensions of the GPS</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)altitude":{"name":"altitude","abstract":"<p>Altitude in meters</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)heading":{"name":"heading","abstract":"<p>Heading based on the GPS data.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)speed":{"name":"speed","abstract":"<p>Speed in KPH</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)shifted":{"name":"shifted","abstract":"<p>True, if GPS lat/long, time, and altitude have been purposefully shifted (requires a proprietary algorithm to unshift).","parent_name":"SDLGPSData"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(cm)sharedInstance":{"name":"+sharedInstance","abstract":"<p>The shared object for pulling function id information</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionNameForId:":{"name":"-functionNameForId:","abstract":"<p>Gets the function name for a given SDL RPC function ID</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionIdForName:":{"name":"-functionIdForName:","abstract":"<p>Gets the function ID for a given SDL RPC function name</p>","parent_name":"SDLFunctionID"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(im)initWithType:range:level:levelState:capacity:capacityUnit:":{"name":"-initWithType:range:level:levelState:capacity:capacityUnit:","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacity":{"name":"capacity","abstract":"<p>The absolute capacity of this fuel type.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacityUnit":{"name":"capacityUnit","abstract":"<p>The unit of the capacity of this fuel type such as liters for gasoline or kWh for batteries.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)level":{"name":"level","abstract":"<p>The relative remaining capacity of this fuel type (percentage).</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)levelState":{"name":"levelState","abstract":"<p>The fuel level state.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)type":{"name":"type","abstract":"<p>The vehicle&rsquo;s fuel type</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)range":{"name":"range","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)artworkRetryCount":{"name":"artworkRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLArtwork.html\">SDLArtwork</a></code> files in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)fileRetryCount":{"name":"fileRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload general <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLFile.html\">SDLFile</a></code>s in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default file manager configuration.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)init":{"name":"-init","abstract":"<p>Use <code>defaultConfiguration</code> instead</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)initWithArtworkRetryCount:fileRetryCount:":{"name":"-initWithArtworkRetryCount:fileRetryCount:","abstract":"<p>Creates a file manager configuration with customized upload retry counts.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)remoteFileNames":{"name":"remoteFileNames","abstract":"<p>A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)bytesAvailable":{"name":"bytesAvailable","abstract":"<p>The number of bytes still available for files for this app.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)currentState":{"name":"currentState","abstract":"<p>The state of the file manager.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)pendingTransactions":{"name":"pendingTransactions","abstract":"<p>The currently pending transactions (Upload, Delete, and List Files) in the file manager</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)suspended":{"name":"suspended","abstract":"<p>Whether or not the file manager is suspended. If suspended, the file manager can continue to queue uploads and deletes, but will not actually perform any of those until it is no longer suspended. This can be used for throttling down the file manager if other, important operations are taking place over the accessory connection.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)init":{"name":"-init","abstract":"<p>Initialize the class&hellip;or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"<p>Creates a new file manager with a specified connection manager and configuration</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>The manager stars up and attempts to fetch its initial list and transfer initial files.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)stop":{"name":"-stop","abstract":"<p>Cancels all file manager operations and deletes all associated data.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)hasUploadedFile:":{"name":"-hasUploadedFile:","abstract":"<p>Check if the remote system contains a file</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFileWithName:completionHandler:":{"name":"-deleteRemoteFileWithName:completionHandler:","abstract":"<p>Delete a file stored on the remote system</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFilesWithNames:completionHandler:":{"name":"-deleteRemoteFilesWithNames:completionHandler:","abstract":"<p>Deletes an array of files on the remote file system. The files are deleted in the order in which they are added to the array, with the first file to be deleted at index 0. The delete queue is sequential, meaning that once a delete request is sent to Core, the queue waits until a response is received from Core before the next the next delete request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFile:completionHandler:":{"name":"-uploadFile:completionHandler:","abstract":"<p>Upload a file to the remote file system. If a file with the [SDLFile name] already exists, this will overwrite that file. If you do not want that to happen, check remoteFileNames before uploading, or change allowOverwrite to NO.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:progressHandler:completionHandler:":{"name":"-uploadFiles:progressHandler:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:completionHandler:":{"name":"-uploadFiles:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)fileNeedsUpload:":{"name":"-fileNeedsUpload:","abstract":"<p>Check if an SDLFile needs to be uploaded to Core or not. This method differs from hasUploadedFile() because it takes the <code>isStaticIcon</code> and <code>overwrite</code> properties into consideration.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtwork:completionHandler:":{"name":"-uploadArtwork:completionHandler:","abstract":"<p>Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:completionHandler:":{"name":"-uploadArtworks:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:progressHandler:completionHandler:":{"name":"-uploadArtworks:progressHandler:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(cm)temporaryFileDirectory":{"name":"+temporaryFileDirectory","abstract":"<p>A URL to the directory where temporary files are stored. When an SDLFile is created with NSData, it writes to a temporary file until the file manager finishes uploading it.</p>","parent_name":"SDLFileManager"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)persistent":{"name":"persistent","abstract":"<p>Whether or not the file should persist on disk between car ignition cycles.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)overwrite":{"name":"overwrite","abstract":"<p>Whether or not the file should overwrite an existing file on the remote disk with the same name.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)name":{"name":"name","abstract":"<p>The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL":{"name":"fileURL","abstract":"<p>The url the local file is stored at while waiting to push it to the remote system. If the data has not been passed to the file URL, this will be nil.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)data":{"name":"data","abstract":"<p>The binary data of the SDLFile. If initialized with data, this will be a relatively quick call, but if initialized with a file URL, this is a rather expensive call the first time. The data will be cached in RAM after the first call.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the binary data of the SDLFile.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileType":{"name":"fileType","abstract":"<p>The system will attempt to determine the type of file that you have passed in. It will default to BINARY if it does not recognize the file type or the file type is not supported by SDL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)inputStream":{"name":"inputStream","abstract":"<p>A stream to pull binary data from a SDLFile. The stream only pulls required data from the file on disk or in memory. This reduces memory usage while uploading a large file to the remote system as each chunk of data can be released immediately after it is uploaded.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)isStaticIcon":{"name":"isStaticIcon","abstract":"<p>Describes whether or not this file is represented by static icon data. The head unit will present its representation of the static icon concept when sent this data.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithFileURL:name:persistent:":{"name":"-initWithFileURL:name:persistent:","abstract":"<p>The designated initializer for an SDL File. The only major property that is not set using this is &ldquo;overwrite&rdquo;, which defaults to NO.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileAtFileURL:name:":{"name":"+persistentFileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileAtFileURL:name:":{"name":"+fileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithData:name:fileExtension:persistent:":{"name":"-initWithData:name:fileExtension:persistent:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileWithData:name:fileExtension:":{"name":"+persistentFileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileWithData:name:fileExtension:":{"name":"+fileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(im)initWithChannelId:channelSetting:":{"name":"-initWithChannelId:channelSetting:","abstract":"<p>Convenience init</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelName":{"name":"channelName","abstract":"<p>@abstract Read-only channel / frequency name","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelSetting":{"name":"channelSetting","abstract":"<p>@abstract Reflects the setting, from 0%-100%.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelId":{"name":"channelId","abstract":"<p>@abstract id of the channel.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"<p>A set of security managers used to encrypt traffic data. Each OEM has their own proprietary security manager.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)delegate":{"name":"delegate","abstract":"<p>A delegate callback that will tell you when an acknowledgement has occurred for starting as secure service.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default encryption configuration.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(im)initWithSecurityManagers:delegate:":{"name":"-initWithSecurityManagers:delegate:","abstract":"<p>Creates a secure configuration for each of the security managers provided.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncodedSyncPData.html#/c:objc(cs)SDLEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLEncodedSyncPData"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)emergencyEventType":{"name":"emergencyEventType","abstract":"<p>References signal &ldquo;VedsEvntType_D_Ltchd&rdquo;. See EmergencyEventType.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)fuelCutoffStatus":{"name":"fuelCutoffStatus","abstract":"<p>References signal &ldquo;RCM_FuelCutoff&rdquo;. See FuelCutoffStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)rolloverEvent":{"name":"rolloverEvent","abstract":"<p>References signal &ldquo;VedsEvntRoll_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)maximumChangeVelocity":{"name":"maximumChangeVelocity","abstract":"<p>References signal &ldquo;VedsMaxDeltaV_D_Ltchd&rdquo;. Change in velocity in KPH.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)multipleEvents":{"name":"multipleEvents","abstract":"<p>References signal &ldquo;VedsMultiEvnt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallNotificationStatus":{"name":"eCallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification_4A&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)auxECallNotificationStatus":{"name":"auxECallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallConfirmationStatus":{"name":"eCallConfirmationStatus","abstract":"<p>References signal &ldquo;eCallConfirmation&rdquo;. See ECallConfirmationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(im)initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:":{"name":"-initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportedDynamicImageFieldNames":{"name":"supportedDynamicImageFieldNames","abstract":"<p>An array of ImageFieldName values for which the system supports sending OnFileUpdate notifications. If you send an Image struct for that image field with a name without having uploaded the image data using PutFile that matches that name, the system will request that you upload the data with PutFile at a later point when the HMI needs it. The HMI will then display the image in the appropriate field. If not sent, assume false.","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportsDynamicSubMenus":{"name":"supportsDynamicSubMenus","abstract":"<p>If true, the head unit supports dynamic sub-menus by sending OnUpdateSubMenu notifications. If true, you should not send AddCommands that attach to a parentID for an AddSubMenu until OnUpdateSubMenu is received with the menuID. At that point, you should send all AddCommands with a parentID that match the menuID. If not set, assume false.</p>","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(im)initWithMenuLength:subMenuDepth:":{"name":"-initWithMenuLength:subMenuDepth:","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)menuLength":{"name":"menuLength","abstract":"<p>The number of items allowed in a Choice Set or Command menu while the driver is distracted","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)subMenuDepth":{"name":"subMenuDepth","abstract":"<p>The depth of submenus allowed when the driver is distracted. e.g. 3 == top level menu -&gt; submenu -&gt; submenu; 1 == top level menu only","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLDoorStatus"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(py)location":{"name":"location","abstract":"<p>Undocumented</p>","parent_name":"SDLDoorStatus"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(py)status":{"name":"status","abstract":"<p>Undocumented</p>","parent_name":"SDLDoorStatus"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:":{"name":"-initWithDisplayName:","abstract":"<p>Init with required properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:windowCapabilities:windowTypeSupported:":{"name":"-initWithDisplayName:windowCapabilities:windowTypeSupported:","abstract":"<p>Init with all the properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)displayName":{"name":"displayName","abstract":"<p>Name of the display.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowTypeSupported":{"name":"windowTypeSupported","abstract":"<p>Informs the application how many windows the app is allowed to create per type.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowCapabilities":{"name":"windowCapabilities","abstract":"<p>Contains a list of capabilities of all windows related to the app. Once the app has registered the capabilities of all windows will be provided, but GetSystemCapability still allows requesting window capabilities of all windows.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayType":{"name":"displayType","abstract":"<p>The type of display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayName":{"name":"displayName","abstract":"<p>The name of the connected display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)textFields":{"name":"textFields","abstract":"<p>An array of SDLTextField structures, each of which describes a field in the HMI which the application can write to using operations such as <em>SDLShow</em>, <em>SDLSetMediaClockTimer</em>, etc.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)imageFields":{"name":"imageFields","abstract":"<p>An array of SDLImageField elements</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)mediaClockFormats":{"name":"mediaClockFormats","abstract":"<p>An array of SDLMediaClockFormat elements, defining the valid string formats used in specifying the contents of the media clock field</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)graphicSupported":{"name":"graphicSupported","abstract":"<p>The display&rsquo;s persistent screen supports.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>An array of all predefined persistent display templates available on the head unit.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)screenParams":{"name":"screenParams","abstract":"<p>A set of all parameters related to a prescribed screen area (e.g. for video / touch input)</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-screen custom presets available (if any); otherwise omitted</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(im)initWithNumber:":{"name":"-initWithNumber:","abstract":"<p>Convenience init to initiate a dial number request</p>","parent_name":"SDLDialNumber"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(py)number":{"name":"number","abstract":"<p>Up to 40 character string representing the phone number. All characters stripped except for &lsquo;0&rsquo;-&lsquo;9&rsquo;, &lsquo;*&rsquo;, &lsquo;#&rsquo;, &lsquo;,&rsquo;, &lsquo;;&rsquo;, and &lsquo;+&rsquo;</p>","parent_name":"SDLDialNumber"},"Classes/SDLDiagnosticMessageResponse.html#/c:objc(cs)SDLDiagnosticMessageResponse(py)messageDataResult":{"name":"messageDataResult","abstract":"<p>Array of bytes comprising CAN message result.</p>","parent_name":"SDLDiagnosticMessageResponse"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(im)initWithTargetId:length:data:":{"name":"-initWithTargetId:length:data:","abstract":"<p>Convenience init</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)targetID":{"name":"targetID","abstract":"<p>Name of target ECU</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageLength":{"name":"messageLength","abstract":"<p>Length of message (in bytes)</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageData":{"name":"messageData","abstract":"<p>Array of bytes comprising CAN message.</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)voiceRecOn":{"name":"voiceRecOn","abstract":"<p>Indicates whether the voice recognition is on or off</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)btIconOn":{"name":"btIconOn","abstract":"<p>Indicates whether the bluetooth connection established</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)callActive":{"name":"callActive","abstract":"<p>Indicates whether a call is being active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)phoneRoaming":{"name":"phoneRoaming","abstract":"<p>Indicates whether the phone is in roaming mode</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)textMsgAvailable":{"name":"textMsgAvailable","abstract":"<p>Indicates whether a textmessage is available</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)battLevelStatus":{"name":"battLevelStatus","abstract":"<p>Battery level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)stereoAudioOutputMuted":{"name":"stereoAudioOutputMuted","abstract":"<p>The status of the stereo audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)monoAudioOutputMuted":{"name":"monoAudioOutputMuted","abstract":"<p>The status of the mono audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)signalLevelStatus":{"name":"signalLevelStatus","abstract":"<p>Signal level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)primaryAudioSource":{"name":"primaryAudioSource","abstract":"<p>The current primary audio source of SDL (if selected).</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)eCallEventActive":{"name":"eCallEventActive","abstract":"<p>Indicates if an emergency call is active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(cm)currentDevice":{"name":"+currentDevice","abstract":"<p>Convenience init. Object will contain all information about the connected device automatically.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)hardware":{"name":"hardware","abstract":"<p>Device model</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)firmwareRev":{"name":"firmwareRev","abstract":"<p>Device firmware version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)os":{"name":"os","abstract":"<p>Device OS</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)osVersion":{"name":"osVersion","abstract":"<p>Device OS version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)carrier":{"name":"carrier","abstract":"<p>Device mobile carrier</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)maxNumberRFCOMMPorts":{"name":"maxNumberRFCOMMPorts","abstract":"<p>Number of bluetooth RFCOMM ports available.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(im)initWithId:":{"name":"-initWithId:","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.</p>","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a submenu</p>","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(py)menuID":{"name":"menuID","abstract":"<p>the MenuID that identifies the SDLSubMenu to be delete","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a choice set</p>","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>a unique ID that identifies the Choice Set","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteFileResponse.html#/c:objc(cs)SDLDeleteFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>The remaining available space for your application to store data on the remote system.</p>","parent_name":"SDLDeleteFileResponse"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to delete a file</p>","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(py)syncFileName":{"name":"syncFileName","abstract":"<p>a file reference name","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to remove a command from the menu</p>","parent_name":"SDLDeleteCommand"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(py)cmdID":{"name":"cmdID","abstract":"<p>the Command ID that identifies the Command to be deleted from Command Menu","parent_name":"SDLDeleteCommand"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:":{"name":"-initWithHour:minute:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:":{"name":"-initWithHour:minute:second:millisecond:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:","abstract":"<p>Convenience init for creating a date with all properties</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)millisecond":{"name":"millisecond","abstract":"<p>Milliseconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)second":{"name":"second","abstract":"<p>Seconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)minute":{"name":"minute","abstract":"<p>Minutes part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)hour":{"name":"hour","abstract":"<p>Hour part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)day":{"name":"day","abstract":"<p>Day of the month</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)month":{"name":"month","abstract":"<p>Month of the year</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)year":{"name":"year","abstract":"<p>The year in YYYY format</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneMinuteOffset":{"name":"timezoneMinuteOffset","abstract":"<p>Time zone offset in Min with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneHourOffset":{"name":"timezoneHourOffset","abstract":"<p>Time zone offset in Hours with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)resultCode":{"name":"resultCode","abstract":"<p>Individual DID result code.</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)didLocation":{"name":"didLocation","abstract":"<p>Location of raw data from vehicle data DID</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)data":{"name":"data","abstract":"<p>Raw DID-based data returned for requested element.</p>","parent_name":"SDLDIDResult"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:":{"name":"-initWithId:windowName:windowType:","abstract":"<p>Constructor with the required parameters</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:":{"name":"-initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:","abstract":"<p>Convinience constructor with all the parameters.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowName":{"name":"windowName","abstract":"<p>The window name to be used by the HMI.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)type":{"name":"type","abstract":"<p>The type of the window to be created. Main window or widget.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)associatedServiceType":{"name":"associatedServiceType","abstract":"<p>Allows an app to create a widget related to a specific service type.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)duplicateUpdatesFromWindowID":{"name":"duplicateUpdatesFromWindowID","abstract":"<p>Optional parameter. Specify whether the content sent to an existing window should be duplicated to the created window. If there isn&rsquo;t a window with the ID, the request will be rejected with <code>INVALID_DATA</code>.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(im)initWithId:choiceSet:":{"name":"-initWithId:choiceSet:","abstract":"<p>Convenience init for creating a choice set RPC</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>A unique ID that identifies the Choice Set</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)choiceSet":{"name":"choiceSet","abstract":"<p>Array of choices, which the user can select by menu or voice recognition</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lifecycleConfig":{"name":"lifecycleConfig","abstract":"<p>The lifecycle configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lockScreenConfig":{"name":"lockScreenConfig","abstract":"<p>The lock screen configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)loggingConfig":{"name":"loggingConfig","abstract":"<p>The log configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig":{"name":"streamingMediaConfig","abstract":"<p>The streaming media configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig":{"name":"fileManagerConfig","abstract":"<p>The file manager configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)encryptionConfig":{"name":"encryptionConfig","abstract":"<p>The encryption configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeActive":{"name":"powerModeActive","abstract":"<p>References signal &ldquo;PowerMode_UB&rdquo;.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeQualificationStatus":{"name":"powerModeQualificationStatus","abstract":"<p>References signal &ldquo;PowerModeQF&rdquo;. See PowerModeQualificationStatus.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)carModeStatus":{"name":"carModeStatus","abstract":"<p>References signal &ldquo;CarMode&rdquo;. See CarMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeStatus":{"name":"powerModeStatus","abstract":"<p>References signal &ldquo;PowerMode&rdquo;. See PowerMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:":{"name":"-initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)nicknames":{"name":"nicknames","abstract":"<p>An array of app names a cloud app is allowed to register with. If included in a <code>SetCloudAppProperties</code> request, this value will overwrite the existing &ldquo;nicknames&rdquo; field in the app policies section of the policy table.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)enabled":{"name":"enabled","abstract":"<p>If true, the cloud app will appear in the HMI&rsquo;s app list; if false, the cloud app will not appear in the HMI&rsquo;s app list.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)authToken":{"name":"authToken","abstract":"<p>Used to authenticate websocket connection on app activation.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)cloudTransportType":{"name":"cloudTransportType","abstract":"<p>Specifies the connection type Core should use. Currently the ones that work in SDL Core are <code>WS</code> or <code>WSS</code>, but an OEM can implement their own transport adapter to handle different values.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)hybridAppPreference":{"name":"hybridAppPreference","abstract":"<p>Specifies the user preference to use the cloud app version or mobile app version when both are available.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)endpoint":{"name":"endpoint","abstract":"<p>The websocket endpoint.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(im)initWithExternalTemperature:cabinTemperature:atmosphericPressure:":{"name":"-initWithExternalTemperature:cabinTemperature:atmosphericPressure:","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius</p>","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)cabinTemperature":{"name":"cabinTemperature","abstract":"<p>Internal ambient cabin temperature in degrees celsius</p>","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)atmosphericPressure":{"name":"atmosphericPressure","abstract":"<p>Current atmospheric pressure in mBar","parent_name":"SDLClimateData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:","abstract":"<p>Convenience init for climate control data with all properties.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)fanSpeed":{"name":"fanSpeed","abstract":"<p>Speed of Fan in integer</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The Current Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)desiredTemperature":{"name":"desiredTemperature","abstract":"<p>Desired Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acEnable":{"name":"acEnable","abstract":"<p>Represents if AC is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)circulateAirEnable":{"name":"circulateAirEnable","abstract":"<p>Represents if circulation of air is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)autoModeEnable":{"name":"autoModeEnable","abstract":"<p>Represents if auto mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)defrostZone":{"name":"defrostZone","abstract":"<p>Represents the kind of defrost zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)dualModeEnable":{"name":"dualModeEnable","abstract":"<p>Represents if dual mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acMaxEnable":{"name":"acMaxEnable","abstract":"<p>Represents if ac max is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>Represents the kind of Ventilation zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedSteeringWheelEnable":{"name":"heatedSteeringWheelEnable","abstract":"<p>@abstract value false means disabled/turn off, value true means enabled/turn on.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedWindshieldEnable":{"name":"heatedWindshieldEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedRearWindowEnable":{"name":"heatedRearWindowEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedMirrorsEnable":{"name":"heatedMirrorsEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)climateEnable":{"name":"climateEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:":{"name":"-initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities with all properties.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleName":{"name":"moduleName","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)fanSpeedAvailable":{"name":"fanSpeedAvailable","abstract":"<p>Availability of the control of fan speed.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)desiredTemperatureAvailable":{"name":"desiredTemperatureAvailable","abstract":"<p>Availability of the control of desired temperature.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acEnableAvailable":{"name":"acEnableAvailable","abstract":"<p>Availability of the control of turn on/off AC.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acMaxEnableAvailable":{"name":"acMaxEnableAvailable","abstract":"<p>Availability of the control of enable/disable air conditioning is ON on the maximum level.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)circulateAirEnableAvailable":{"name":"circulateAirEnableAvailable","abstract":"<p>Availability of the control of enable/disable circulate Air mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)autoModeEnableAvailable":{"name":"autoModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable auto mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)dualModeEnableAvailable":{"name":"dualModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable dual mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZoneAvailable":{"name":"defrostZoneAvailable","abstract":"<p>Availability of the control of defrost zones.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZone":{"name":"defrostZone","abstract":"<p>A set of all defrost zones that are controllable.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationModeAvailable":{"name":"ventilationModeAvailable","abstract":"<p>Availability of the control of air ventilation mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>A set of all ventilation modes that are controllable.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedSteeringWheelAvailable":{"name":"heatedSteeringWheelAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Steering Wheel.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedWindshieldAvailable":{"name":"heatedWindshieldAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Windshield.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedRearWindowAvailable":{"name":"heatedRearWindowAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Rear Window.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedMirrorsAvailable":{"name":"heatedMirrorsAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Mirrors.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)climateEnableAvailable":{"name":"climateEnableAvailable","abstract":"<p>@abstract Availability of the control of enable/disable climate control.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 10 seconds. The minimum is 5 seconds, the maximum is 100 seconds. If this is set below the minimum, it will be capped at 5 seconds. If this is set above the maximum, it will be capped at 100 seconds.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultLayout":{"name":"defaultLayout","abstract":"<p>Set this to change the default layout for all choice sets. If a layout is not set on an individual choice set object, then it will use this layout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout\">layout</a></code> for more details. If this is not set by you, it will default to <code>SDLChoiceSetLayoutList</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)title":{"name":"title","abstract":"<p>Maps to PerformInteraction.initialText. The title of the choice set, and/or the initial text on a keyboard prompt.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>Maps to PerformInteraction.initialPrompt. The initial prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout":{"name":"layout","abstract":"<p>Maps to PerformInteraction.interactionLayout. Whether the presented choices are arranged as a set of tiles or a list.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout":{"name":"timeout","abstract":"<p>Maps to PerformInteraction.timeout. Timeout in seconds. Defaults to 0, which will use <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout\">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 5 seconds. Minimum 5 seconds, maximum 100 seconds. If this is set above the maximum, it will be capped at 100 seconds. Defaults to 0.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Maps to PerformInteraction.timeoutPrompt. This text is spoken when a VR interaction times out. If this set is presented in a manual (non-voice) only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Maps to PerformInteraction.helpPrompt. This is the spoken string when a user speaks &ldquo;help&rdquo; when the interaction is occurring.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpList":{"name":"helpList","abstract":"<p>Maps to PerformInteraction.vrHelp. This is a list of help text presented to the user when they are in a voice recognition interaction from your choice set of options. If this set is presented in a touch only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)delegate":{"name":"delegate","abstract":"<p>The delegate of this choice set, called when the user interacts with it.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)choices":{"name":"choices","abstract":"<p>The choices to be displayed to the user within this choice set. These choices could match those already preloaded via <code>SDLScreenManager preloadChoices:withCompletionHandler:</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)init":{"name":"-init","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:choices:":{"name":"-initWithTitle:delegate:choices:","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the choice set. If the choice set has not yet been sent to Core, it will not be sent. If the choice set is already presented on Core, the choice set will be immediately dismissed. Canceling an already presented choice set will only work if connected to Core versions 6.0+. On older versions of Core, the choice set will not be dismissed.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text":{"name":"text","abstract":"<p>Maps to Choice.menuName. The primary text of the cell. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are not permitted and will result in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> failing to initialize.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>Maps to Choice.secondaryText. Optional secondary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Maps to Choice.tertiaryText. Optional tertitary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>Maps to Choice.vrCommands. Optional voice commands the user can speak to activate the cell. If not set and the head unit requires it, this will be set to the number in the list that this item appears. However, this would be a very poor experience for a user if the choice set is presented as a voice only interaction or both interaction mode. Therefore, consider not setting this only when you know the choice set will be presented as a touch only interaction.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)artwork":{"name":"artwork","abstract":"<p>Maps to Choice.image. Optional image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>Maps to Choice.secondaryImage. Optional secondary image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)uniqueText":{"name":"uniqueText","abstract":"<p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text\">text</a></code> but other fields are different. This is autogenerated by the screen manager. Attempting to use cells that are exactly the same (all text and artwork fields are the same) will not cause this to be used. This will not be used when connected to modules supporting RPC 7.1+.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)init":{"name":"-init","abstract":"<p>Initialize the cell with nothing. This is unavailable</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:":{"name":"-initWithText:","abstract":"<p>Initialize the cell with text and nothing else.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:artwork:voiceCommands:":{"name":"-initWithText:artwork:voiceCommands:","abstract":"<p>Initialize the cell with text, optional artwork, and optional voice commands</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:":{"name":"-initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:","abstract":"<p>Initialize the cell with all optional items</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:":{"name":"-initWithId:menuName:vrCommands:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with the required parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:":{"name":"-initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)choiceID":{"name":"choiceID","abstract":"<p>The application-scoped identifier that uniquely identifies this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)menuName":{"name":"menuName","abstract":"<p>Text which appears in menu, representing this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)vrCommands":{"name":"vrCommands","abstract":"<p>VR synonyms for this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)image":{"name":"image","abstract":"<p>The image of the choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryText":{"name":"secondaryText","abstract":"<p>Secondary text to display; e.g. address of POI in a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Tertiary text to display; e.g. distance to POI for a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Secondary image for choice</p>","parent_name":"SDLChoice"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:":{"name":"-initWithLanguage:hmiDisplayLanguage:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with required parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:":{"name":"-initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)language":{"name":"language","abstract":"<p>The language the app wants to change to</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>HMI display language</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)appName":{"name":"appName","abstract":"<p>Request a new app name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ttsName":{"name":"ttsName","abstract":"<p>Request a new TTSName registration.</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Request a new app short name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Request a new VR synonyms registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLCarWindowViewController.html#/c:objc(cs)SDLCarWindowViewController(py)supportedOrientation":{"name":"supportedOrientation","abstract":"<p>The supported interface orientation you wish to use. Defaults to MaskPortrait.</p>","parent_name":"SDLCarWindowViewController"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:":{"name":"-initWithFunctionID:","abstract":"<p>Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interaction).</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:cancelID:":{"name":"-initWithFunctionID:cancelID:","abstract":"<p>Convenience init for dismissing a specific view.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithAlertCancelID:":{"name":"-initWithAlertCancelID:","abstract":"<p>Convenience init for dismissing an alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSliderCancelID:":{"name":"-initWithSliderCancelID:","abstract":"<p>Convenience init for dismissing a slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithScrollableMessageCancelID:":{"name":"-initWithScrollableMessageCancelID:","abstract":"<p>Convenience init for dismissing a scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithPerformInteractionCancelID:":{"name":"-initWithPerformInteractionCancelID:","abstract":"<p>Convenience init for dismissing a perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSubtleAlertCancelID:":{"name":"-initWithSubtleAlertCancelID:","abstract":"<p>Convenience init for dismissing a subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)alert":{"name":"+alert","abstract":"<p>Convenience init for dismissing the currently presented alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)slider":{"name":"+slider","abstract":"<p>Convenience init for dismissing the currently presented slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)scrollableMessage":{"name":"+scrollableMessage","abstract":"<p>Convenience init for dismissing the currently presented scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)performInteraction":{"name":"+performInteraction","abstract":"<p>Convenience init for dismissing the currently presented perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)subtleAlert":{"name":"+subtleAlert","abstract":"<p>Convenience init for dismissing the currently presented subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>The ID of the specific interaction to dismiss. If not set, the most recent of the RPC type set in functionID will be dismissed.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)functionID":{"name":"functionID","abstract":"<p>The ID of the type of interaction to dismiss.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:moduleId:buttonPressMode:":{"name":"-initWithButtonName:moduleType:moduleId:buttonPressMode:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleType":{"name":"moduleType","abstract":"<p>The module where the button should be pressed.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The name of supported RC climate or radio button.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)name":{"name":"name","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a SHORT press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a LONG press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>A NSNumber value indicates whether the button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(im)initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:":{"name":"-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(im)initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:":{"name":"-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)parkBrakeActive":{"name":"parkBrakeActive","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStableStatus":{"name":"ignitionStableStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStatus":{"name":"ignitionStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)driverDoorAjar":{"name":"driverDoorAjar","abstract":"<p>References signal &ldquo;DrStatDrv_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)passengerDoorAjar":{"name":"passengerDoorAjar","abstract":"<p>References signal &ldquo;DrStatPsngr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearLeftDoorAjar":{"name":"rearLeftDoorAjar","abstract":"<p>References signal &ldquo;DrStatRl_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearRightDoorAjar":{"name":"rearRightDoorAjar","abstract":"<p>References signal &ldquo;DrStatRr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)doorStatuses":{"name":"doorStatuses","abstract":"<p>Provides status for doors if Ajar/Closed/Locked","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)gateStatuses":{"name":"gateStatuses","abstract":"<p>Provides status for trunk/hood/etc. if Ajar/Closed/Locked","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)roofStatuses":{"name":"roofStatuses","abstract":"<p>Provides status for roof/convertible roof/sunroof/moonroof etc., if Closed/Ajar/Removed etc.","parent_name":"SDLBodyInformation"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBeltDeployed":{"name":"driverBeltDeployed","abstract":"<p>References signal &ldquo;VedsDrvBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBeltDeployed":{"name":"passengerBeltDeployed","abstract":"<p>References signal &ldquo;VedsPasBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBuckleBelted":{"name":"passengerBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1PasBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBuckleBelted":{"name":"driverBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1DrvBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow2BuckleBelted":{"name":"leftRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerChildDetected":{"name":"passengerChildDetected","abstract":"<p>References signal &ldquo;VedsRw1PasChld_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow2BuckleBelted":{"name":"rightRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow2BuckleBelted":{"name":"middleRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow3BuckleBelted":{"name":"middleRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow3BuckleBelted":{"name":"leftRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow3BuckleBelted":{"name":"rightRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRearInflatableBelted":{"name":"leftRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2lRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRearInflatableBelted":{"name":"rightRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2rRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BeltDeployed":{"name":"middleRow1BeltDeployed","abstract":"<p>References signal &ldquo;VedsRw1mBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BuckleBelted":{"name":"middleRow1BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)delegate":{"name":"delegate","abstract":"<p>The delegate describing when files are done playing or any errors that occur</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)playing":{"name":"playing","abstract":"<p>Whether or not we are currently playing audio</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)queue":{"name":"queue","abstract":"<p>The queue of audio files that will be played in sequence</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)init":{"name":"-init","abstract":"<p>Init should only occur with dependencies. use <code>initWithManager:</code></p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)initWithManager:":{"name":"-initWithManager:","abstract":"<p>Create an audio stream manager with a reference to the parent stream manager.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithFileURL:":{"name":"-pushWithFileURL:","abstract":"<p>Push a new file URL onto the queue after converting it into the correct PCM format for streaming binary data. Call <code>playNextWhenReady</code> to start playing the next completed pushed file.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithData:":{"name":"-pushWithData:","abstract":"<p>Push a new audio buffer onto the queue. Call <code>playNextWhenReady</code> to start playing the pushed audio buffer.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)playNextWhenReady":{"name":"-playNextWhenReady","abstract":"<p>Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)stop":{"name":"-stop","abstract":"<p>Stop playing the queue after the current item completes and clear the queue. If nothing is playing, the queue will be cleared.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)samplingRate":{"name":"samplingRate","abstract":"<p>The sampling rate for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>The sample depth in bit for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)audioType":{"name":"audioType","abstract":"<p>The audiotype for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)inputFileURL":{"name":"inputFileURL","abstract":"<p>If initialized with a file URL, the file URL it came from</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)outputFileURL":{"name":"outputFileURL","abstract":"<p>If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)estimatedDuration":{"name":"estimatedDuration","abstract":"<p>In seconds. UINT32_MAX if unknown.</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)data":{"name":"data","abstract":"<p>The PCM audio data to be transferred and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the PCM audio data in bytes</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithInputFileURL:outputFileURL:estimatedDuration:":{"name":"-initWithInputFileURL:outputFileURL:estimatedDuration:","abstract":"<p>Initialize an audio file to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithData:":{"name":"-initWithData:","abstract":"<p>Initialize a buffer of PCM audio data to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(py)audioData":{"name":"audioData","abstract":"<p>The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithAudioFile:":{"name":"-initWithAudioFile:","abstract":"<p>Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithSpeechSynthesizerString:":{"name":"-initWithSpeechSynthesizerString:","abstract":"<p>Initialize with a string to be spoken by the system speech synthesizer.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithPhoneticSpeechSynthesizerString:phoneticType:":{"name":"-initWithPhoneticSpeechSynthesizerString:phoneticType:","abstract":"<p>Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)init":{"name":"-init","abstract":"<p>Undocumented</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addAudioFiles:":{"name":"-addAudioFiles:","abstract":"<p>Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addSpeechSynthesizerStrings:":{"name":"-addSpeechSynthesizerStrings:","abstract":"<p>Create additional strings to be spoken by the system speech synthesizer.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addPhoneticSpeechSynthesizerStrings:phoneticType:":{"name":"-addPhoneticSpeechSynthesizerStrings:phoneticType:","abstract":"<p>Create additional strings to be spoken by the system speech synthesizer using a phonetic string.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(im)initWithSource:keepContext:volume:equalizerSettings:":{"name":"-initWithSource:keepContext:volume:equalizerSettings:","abstract":"<p>Constructs a newly allocated SDLAudioControlData object with given parameters</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)source":{"name":"source","abstract":"<p>@abstract In a getter response or a notification,","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)keepContext":{"name":"keepContext","abstract":"<p>@abstract This parameter shall not be present in any getter responses or notifications.","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)volume":{"name":"volume","abstract":"<p>@abstract Reflects the volume of audio, from 0%-100%.</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)equalizerSettings":{"name":"equalizerSettings","abstract":"<p>@abstract Defines the list of supported channels (band) and their current/desired settings on HMI</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with audio control module name (max 100 chars)</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with given parameters</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the audio control module.","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)sourceAvailable":{"name":"sourceAvailable","abstract":"<p>@abstract Availability of the control of audio source.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)keepContextAvailable":{"name":"keepContextAvailable","abstract":"<p>Availability of the keepContext parameter.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)volumeAvailable":{"name":"volumeAvailable","abstract":"<p>@abstract Availability of the control of audio volume.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerAvailable":{"name":"equalizerAvailable","abstract":"<p>@abstract Availability of the control of Equalizer Settings.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerMaxChannelId":{"name":"equalizerMaxChannelId","abstract":"<p>@abstract Must be included if equalizerAvailable=true,","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)isTemplate":{"name":"isTemplate","abstract":"<p>Describes whether or not the image is a template that can be (re)colored by the SDL HMI. To make the artwork a template, set the <code>UIImage</code>s rendering mode to <code>UIImageRenderingModeAlwaysTemplate</code>. In order for templates to work successfully, the icon must be one solid color with a clear background. The artwork should be created using the PNG image format.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)imageRPC":{"name":"imageRPC","abstract":"<p>The Image RPC representing this artwork. Generally for use internally, you should instead pass an artwork to a Screen Manager method.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:name:asImageFormat:":{"name":"+artworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:asImageFormat:":{"name":"+artworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithStaticIcon:":{"name":"+artworkWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:name:asImageFormat:":{"name":"+persistentArtworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:asImageFormat:":{"name":"+persistentArtworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:name:persistent:asImageFormat:":{"name":"-initWithImage:name:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:persistent:asImageFormat:":{"name":"-initWithImage:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithStaticIcon:":{"name":"-initWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(im)initWithAppServices:":{"name":"-initWithAppServices:","abstract":"<p>Convenience init.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(py)appServices":{"name":"appServices","abstract":"<p>An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(im)initWithServiceID:serviceManifest:servicePublished:serviceActive:":{"name":"-initWithServiceID:serviceManifest:servicePublished:serviceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceID":{"name":"serviceID","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceManifest":{"name":"serviceManifest","abstract":"<p>Manifest for the service that this record is for.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)servicePublished":{"name":"servicePublished","abstract":"<p>If true, the service is published and available. If false, the service has likely just been unpublished, and should be considered unavailable.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceActive":{"name":"serviceActive","abstract":"<p>If true, the service is the active primary service of the supplied service type. It will receive all potential RPCs that are passed through to that service type. If false, it is not the primary service of the supplied type. See servicePublished for its availability.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for serviceType.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"<p>Convenience init for a media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"<p>Convenience init for a weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"<p>Convenience init for a navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceName":{"name":"serviceName","abstract":"<p>Unique name of this service.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceIcon":{"name":"serviceIcon","abstract":"<p>The file name of the icon to be associated with this service. Most likely the same as the appIcon.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)allowAppConsumers":{"name":"allowAppConsumers","abstract":"<p>If true, app service consumers beyond the IVI system will be able to access this service. If false, only the IVI system will be able consume the service. If not provided, it is assumed to be false.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)maxRPCSpecVersion":{"name":"maxRPCSpecVersion","abstract":"<p>This is the max RPC Spec version the app service understands. This is important during the RPC passthrough functionality. If not included, it is assumed the max version of the module is acceptable.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)handledRPCs":{"name":"handledRPCs","abstract":"<p>This field contains the Function IDs for the RPCs that this service intends to handle correctly. This means the service will provide meaningful responses. See FunctionID for enum equivalent values. This parameter is an integer to allow for new function IDs to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)mediaServiceManifest":{"name":"mediaServiceManifest","abstract":"<p>A media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)weatherServiceManifest":{"name":"weatherServiceManifest","abstract":"<p>A weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)navigationServiceManifest":{"name":"navigationServiceManifest","abstract":"<p>A navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:":{"name":"-initWithAppServiceType:serviceId:","abstract":"<p>Convenience init for service type and service id.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithMediaServiceData:serviceId:":{"name":"-initWithMediaServiceData:serviceId:","abstract":"<p>Convenience init for media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithWeatherServiceData:serviceId:":{"name":"-initWithWeatherServiceData:serviceId:","abstract":"<p>Convenience init for weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithNavigationServiceData:serviceId:":{"name":"-initWithNavigationServiceData:serviceId:","abstract":"<p>Convenience init for navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:":{"name":"-initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceId":{"name":"serviceId","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)mediaServiceData":{"name":"mediaServiceData","abstract":"<p>The media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)weatherServiceData":{"name":"weatherServiceData","abstract":"<p>The weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)navigationServiceData":{"name":"navigationServiceData","abstract":"<p>The navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdatedAppServiceRecord:":{"name":"-initWithUpdatedAppServiceRecord:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdateReason:updatedAppServiceRecord:":{"name":"-initWithUpdateReason:updatedAppServiceRecord:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updateReason":{"name":"updateReason","abstract":"<p>Only included in <code>OnSystemCapbilityUpdated</code>. Update reason for this service record.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updatedAppServiceRecord":{"name":"updatedAppServiceRecord","abstract":"<p>Service record for a specific app service provider.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(cm)currentAppInfo":{"name":"+currentAppInfo","abstract":"<p>Convenience init with no parameters</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appDisplayName":{"name":"appDisplayName","abstract":"<p>The name displayed for the mobile application on the mobile device (can differ from the app name set in the initial RAI request).</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appBundleID":{"name":"appBundleID","abstract":"<p>The AppBundleID of an iOS application or package name of the Android application. This supports App Launch strategies for each platform.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appVersion":{"name":"appVersion","abstract":"<p>Represents the build version number of this particular mobile app.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(im)initWithAppCapabilityType:":{"name":"-initWithAppCapabilityType:","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(im)initWithAppCapabilityType:videoStreamingCapability:":{"name":"-initWithAppCapabilityType:videoStreamingCapability:","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(py)appCapabilityType":{"name":"appCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other param included.</p>","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes supported capabilities for video streaming</p>","parent_name":"SDLAppCapability"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)text":{"name":"text","abstract":"<p>The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)secondaryText":{"name":"secondaryText","abstract":"<p>The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout":{"name":"timeout","abstract":"<p>Timeout in seconds. Defaults to 0, which will use <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout\">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)audio":{"name":"audio","abstract":"<p>Text spoken, file(s) played, and/or tone played when the alert appears</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)showWaitIndicator":{"name":"showWaitIndicator","abstract":"<p>If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)softButtons":{"name":"softButtons","abstract":"<p>Soft buttons the user may select to perform actions. Only one <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonState.html\">SDLSoftButtonState</a></code> per object is supported; if any soft button object contains multiple states, an exception will be thrown.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)icon":{"name":"icon","abstract":"<p>An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)init":{"name":"-init","abstract":"<p>Undocumented</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)initWithText:buttons:":{"name":"-initWithText:buttons:","abstract":"<p>Initialize a basic alert with a message and buttons</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:":{"name":"-initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:","abstract":"<p>Initialize a alert with a text, image, buttons and sound</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertResponse.html#/c:objc(cs)SDLAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in seconds) that an app must wait before resending an alert.</p>","parent_name":"SDLAlertResponse"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTS:softButtons:":{"name":"-initWithTTS:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with required parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTSChunks:softButtons:":{"name":"-initWithTTSChunks:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with all parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)softButtons":{"name":"softButtons","abstract":"<p>An array of soft buttons. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton shall be displayed.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertAudioData.html#/c:objc(cs)SDLAlertAudioData(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.</p>","parent_name":"SDLAlertAudioData"},"Classes/SDLAlertAudioData.html#/c:objc(cs)SDLAlertAudioData(im)init":{"name":"-init","abstract":"<p>Undocumented</p>","parent_name":"SDLAlertAudioData"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:":{"name":"-initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:","abstract":"<p>Convenience init for creating a modal view with text, buttons, and optional sound cues.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:playTone:":{"name":"-initWithTTSChunks:playTone:","abstract":"<p>Convenience init for creating a sound-only alert.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:":{"name":"-initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:","abstract":"<p>Convenience init for setting all alert parameters.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText3":{"name":"alertText3","abstract":"<p>The optional third line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks to be spoken or a prerecorded sound file.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)duration":{"name":"duration","abstract":"<p>The duration of the displayed portion of the alert, in milliseconds. Typical timeouts are 3 - 5 seconds. If omitted, the timeout is set to a default of 5 seconds.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the TTS (if any) is spoken. If omitted or set to false, no tone is played.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)progressIndicator":{"name":"progressIndicator","abstract":"<p>If supported on the given platform, the alert GUI will include some sort of animation indicating that loading of a feature is progressing (e.g. a spinning wheel or hourglass, etc.).</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed alert. If omitted on supported displays, the displayed alert shall not have any buttons.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed in the alert. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLAlert"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverAirbagDeployed":{"name":"driverAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverSideAirbagDeployed":{"name":"driverSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverCurtainAirbagDeployed":{"name":"driverCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerAirbagDeployed":{"name":"passengerAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerCurtainAirbagDeployed":{"name":"passengerCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverKneeAirbagDeployed":{"name":"driverKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneeDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerSideAirbagDeployed":{"name":"passengerSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerKneeAirbagDeployed":{"name":"passengerKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneePasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:":{"name":"-initWithMenuID:menuName:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuID":{"name":"menuID","abstract":"<p>a Menu ID that identifies a sub menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)position":{"name":"position","abstract":"<p>a position of menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuName":{"name":"menuName","abstract":"<p>a menuName which is displayed representing this submenu item","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuIcon":{"name":"menuIcon","abstract":"<p>An image that is displayed alongside this submenu item</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuLayout":{"name":"menuLayout","abstract":"<p>The sub-menu layout. See available menu layouts on SDLWindowCapability.menuLayoutsAvailable. Defaults to LIST.</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)parentID":{"name":"parentID","abstract":"<p>Unique ID of the sub menu the command will be added to. If not provided or 0, it will be provided to the top level of the in application menu.","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)secondaryText":{"name":"secondaryText","abstract":"<p>Optional secondary text to display","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Optional tertiary text to display","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Optional secondary image struct for sub-menu cell</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Constructs a SDLAddCommand with a handler callback when an event occurs.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:handler:":{"name":"-initWithId:vrCommands:handler:","abstract":"<p>Convenience init for creating a voice command menu item.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:handler:":{"name":"-initWithId:vrCommands:menuName:handler:","abstract":"<p>Convenience init for creating a menu item with text.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:icon:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:icon:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithCmdID:":{"name":"-initWithCmdID:","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:":{"name":"-initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you created is subscribed.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdID":{"name":"cmdID","abstract":"<p>A unique id that identifies the command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)menuParams":{"name":"menuParams","abstract":"<p>A <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuParams.html\">SDLMenuParams</a></code> pointer which defines the command and how it is added to the command menu.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)vrCommands":{"name":"vrCommands","abstract":"<p>An array of strings to be used as VR synonyms for this command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdIcon":{"name":"cmdIcon","abstract":"<p>Image struct containing a static or dynamic icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Optional secondary image struct for menu cell</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html":{"name":"SDLAddCommand","abstract":"<p>This class will add a command to the application&rsquo;s Command Menu</p>"},"Classes.html#/c:objc(cs)SDLAddCommandResponse":{"name":"SDLAddCommandResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddCommand.html\">SDLAddCommand</a></code></p>"},"Classes/SDLAddSubMenu.html":{"name":"SDLAddSubMenu","abstract":"<p>Add a SDLSubMenu to the Command Menu"},"Classes.html#/c:objc(cs)SDLAddSubMenuResponse":{"name":"SDLAddSubMenuResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddSubMenu.html\">SDLAddSubMenu</a></code></p>"},"Classes/SDLAirbagStatus.html":{"name":"SDLAirbagStatus","abstract":"<p>A vehicle data status struct for airbags</p>"},"Classes/SDLAlert.html":{"name":"SDLAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. Either <code>alertText1</code>, <code>alertText2</code> or <code>TTSChunks</code> needs to be set or the request will be rejected.</p>"},"Classes/SDLAlertAudioData.html":{"name":"SDLAlertAudioData","abstract":"<p>Undocumented</p>"},"Classes/SDLAlertManeuver.html":{"name":"SDLAlertManeuver","abstract":"<p>Shows a SDLShowConstantTBT message with an optional voice command. This message is shown as an overlay over the display&rsquo;s base screen.</p>"},"Classes.html#/c:objc(cs)SDLAlertManeuverResponse":{"name":"SDLAlertManeuverResponse","abstract":"<p>Response to SDLAlertManeuver</p>"},"Classes/SDLAlertResponse.html":{"name":"SDLAlertResponse","abstract":"<p>Response to SDLAlert</p>"},"Classes/SDLAlertView.html":{"name":"SDLAlertView","abstract":"<p>Undocumented</p>"},"Classes/SDLAppCapability.html":{"name":"SDLAppCapability","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLAppInfo.html":{"name":"SDLAppInfo","abstract":"<p>A struct used in register app interface. Contains detailed information about the registered application.</p>"},"Classes/SDLAppServiceCapability.html":{"name":"SDLAppServiceCapability","abstract":"<p>A currently available service.</p>"},"Classes/SDLAppServiceData.html":{"name":"SDLAppServiceData","abstract":"<p>Contains all the current data of the app service. The serviceType will link to which of the service data objects are included in this object (e.g. if the service type is MEDIA, the mediaServiceData param should be included).</p>"},"Classes/SDLAppServiceManifest.html":{"name":"SDLAppServiceManifest","abstract":"<p>This manifest contains all the information necessary for the service to be published, activated, and allow consumers to interact with it</p>"},"Classes/SDLAppServiceRecord.html":{"name":"SDLAppServiceRecord","abstract":"<p>This is the record of an app service publisher that the module has. It should contain the most up to date information including the service&rsquo;s active state.</p>"},"Classes/SDLAppServicesCapabilities.html":{"name":"SDLAppServicesCapabilities","abstract":"<p>Capabilities of app services including what service types are supported and the current state of services.</p>"},"Classes/SDLArtwork.html":{"name":"SDLArtwork","abstract":"<p>An SDLFile subclass specifically designed for images</p>"},"Classes/SDLAudioControlCapabilities.html":{"name":"SDLAudioControlCapabilities","abstract":"<p>Describes a head unit&rsquo;s audio control capabilities.</p>"},"Classes/SDLAudioControlData.html":{"name":"SDLAudioControlData","abstract":"<p>The audio control data information.</p>"},"Classes/SDLAudioData.html":{"name":"SDLAudioData","abstract":"<p>Undocumented</p>"},"Classes/SDLAudioFile.html":{"name":"SDLAudioFile","abstract":"<p>Includes information about a given audio file</p>"},"Classes/SDLAudioPassThruCapabilities.html":{"name":"SDLAudioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}</p>"},"Classes/SDLAudioStreamManager.html":{"name":"SDLAudioStreamManager","abstract":"<p>The manager to control the audio stream</p>"},"Classes/SDLBeltStatus.html":{"name":"SDLBeltStatus","abstract":"<p>Vehicle data struct for the seat belt status</p>"},"Classes/SDLBodyInformation.html":{"name":"SDLBodyInformation","abstract":"<p>Undocumented</p>"},"Classes/SDLButtonCapabilities.html":{"name":"SDLButtonCapabilities","abstract":"<p>Provides information about the capabilities of a SDL HMI button.</p>"},"Classes/SDLButtonPress.html":{"name":"SDLButtonPress","abstract":"<p>This RPC allows a remote control type mobile application to simulate a hardware button press event.</p>"},"Classes.html#/c:objc(cs)SDLButtonPressResponse":{"name":"SDLButtonPressResponse","abstract":"<p>Response to SDLButtonPress</p>"},"Classes/SDLCancelInteraction.html":{"name":"SDLCancelInteraction","abstract":"<p>Used to dismiss a modal view programmatically without needing to wait for the timeout to complete. Can be used to dismiss alerts, scrollable messages, sliders, and perform interactions (i.e. pop-up menus).</p>"},"Classes.html#/c:objc(cs)SDLCancelInteractionResponse":{"name":"SDLCancelInteractionResponse","abstract":"<p>Response to the request to dismiss a modal view. If no applicable request can be dismissed, the <code>resultCode</code> will be <code>IGNORED</code>.</p>"},"Classes/SDLCarWindowViewController.html":{"name":"SDLCarWindowViewController","abstract":"<p>Note that if this is embedded in a UINavigationController and UITabBarController, it will not lock orientation. You must lock your container controller to a specific orientation.</p>"},"Classes/SDLChangeRegistration.html":{"name":"SDLChangeRegistration","abstract":"<p>If the app recognizes during the app registration that the SDL HMI language (voice/TTS and/or display) does not match the app language, the app will be able (but does not need) to change this registration with changeRegistration prior to app being brought into focus.</p>"},"Classes.html#/c:objc(cs)SDLChangeRegistrationResponse":{"name":"SDLChangeRegistrationResponse","abstract":"<p>Response to SDLChangeRegistrations</p>"},"Classes/SDLChoice.html":{"name":"SDLChoice","abstract":"<p>A choice is an option which a user can select either via the menu or via voice recognition (VR) during an application initiated interaction.</p>"},"Classes/SDLChoiceCell.html":{"name":"SDLChoiceCell","abstract":"<p>A selectable item within an SDLChoiceSet</p>"},"Classes/SDLChoiceSet.html":{"name":"SDLChoiceSet","abstract":"<p>The choice set to be displayed to the user. Contains a list of selectable options.</p>"},"Classes/SDLClimateControlCapabilities.html":{"name":"SDLClimateControlCapabilities","abstract":"<p>Contains information about a climate control module&rsquo;s capabilities.</p>"},"Classes/SDLClimateControlData.html":{"name":"SDLClimateControlData","abstract":"<p>The current information for the Climate Remote Control Module</p>"},"Classes/SDLClimateData.html":{"name":"SDLClimateData","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes.html#/c:objc(cs)SDLCloseApplication":{"name":"SDLCloseApplication","abstract":"<p>Used by an app to set itself to a <code>HMILevel</code> of <code>NONE</code>. The app will close but will still be registered. If the app is a navigation app it will no longer be used as the preferred mobile-navigation application by the module.</p>"},"Classes.html#/c:objc(cs)SDLCloseApplicationResponse":{"name":"SDLCloseApplicationResponse","abstract":"<p>Response to the request to close this app on the module.</p>"},"Classes/SDLCloudAppProperties.html":{"name":"SDLCloudAppProperties","abstract":"<p>The cloud application properties.</p>"},"Classes/SDLClusterModeStatus.html":{"name":"SDLClusterModeStatus","abstract":"<p>A vehicle data struct for the cluster mode and power status</p>"},"Classes/SDLConfiguration.html":{"name":"SDLConfiguration","abstract":"<p>Contains information about the app&rsquo;s configuration, such as lifecycle, lockscreen, encryption, etc.</p>"},"Classes/SDLCreateInteractionChoiceSet.html":{"name":"SDLCreateInteractionChoiceSet","abstract":"<p>Creates a Choice Set which can be used in subsequent <em>SDLPerformInteraction</em> Operations.</p>"},"Classes.html#/c:objc(cs)SDLCreateInteractionChoiceSetResponse":{"name":"SDLCreateInteractionChoiceSetResponse","abstract":"<p>Response to SDLCreateInteractionChoiceSet has been called</p>"},"Classes/SDLCreateWindow.html":{"name":"SDLCreateWindow","abstract":"<p>Create a new window on the display with the specified window type."},"Classes.html#/c:objc(cs)SDLCreateWindowResponse":{"name":"SDLCreateWindowResponse","abstract":"<p>Response to SDLCreateWindow</p>"},"Classes/SDLDIDResult.html":{"name":"SDLDIDResult","abstract":"<p>A vehicle data struct</p>"},"Classes/SDLDateTime.html":{"name":"SDLDateTime","abstract":"<p>A struct referenced in SendLocation for an absolute date</p>"},"Classes/SDLDeleteCommand.html":{"name":"SDLDeleteCommand","abstract":"<p>Removes a command from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteCommandResponse":{"name":"SDLDeleteCommandResponse","abstract":"<p>Response to SDLDeleteCommand</p>"},"Classes/SDLDeleteFile.html":{"name":"SDLDeleteFile","abstract":"<p>Used to delete a file resident on the SDL module in the app&rsquo;s local cache."},"Classes/SDLDeleteFileResponse.html":{"name":"SDLDeleteFileResponse","abstract":"<p>Response to SDLDeleteFile</p>"},"Classes/SDLDeleteInteractionChoiceSet.html":{"name":"SDLDeleteInteractionChoiceSet","abstract":"<p>Deletes an existing Choice Set identified by the parameter"},"Classes.html#/c:objc(cs)SDLDeleteInteractionChoiceSetResponse":{"name":"SDLDeleteInteractionChoiceSetResponse","abstract":"<p>SDLDeleteInteractionChoiceSetResponse is sent, when SDLDeleteInteractionChoiceSet has been called</p>"},"Classes/SDLDeleteSubMenu.html":{"name":"SDLDeleteSubMenu","abstract":"<p>Deletes a submenu from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteSubMenuResponse":{"name":"SDLDeleteSubMenuResponse","abstract":"<p>Response to SDLDeleteSubMenu</p>"},"Classes/SDLDeleteWindow.html":{"name":"SDLDeleteWindow","abstract":"<p>Deletes previously created window of the SDL application.</p>"},"Classes.html#/c:objc(cs)SDLDeleteWindowResponse":{"name":"SDLDeleteWindowResponse","abstract":"<p>Response to DeleteWindow</p>"},"Classes/SDLDeviceInfo.html":{"name":"SDLDeviceInfo","abstract":"<p>Various information about connecting device. Referenced in RegisterAppInterface</p>"},"Classes/SDLDeviceStatus.html":{"name":"SDLDeviceStatus","abstract":"<p>Describes the status related to a connected mobile device or SDL and if or how it is represented in the vehicle.</p>"},"Classes/SDLDiagnosticMessage.html":{"name":"SDLDiagnosticMessage","abstract":"<p>Non periodic vehicle diagnostic request</p>"},"Classes/SDLDiagnosticMessageResponse.html":{"name":"SDLDiagnosticMessageResponse","abstract":"<p>Response to SDLDiagnosticMessage</p>"},"Classes/SDLDialNumber.html":{"name":"SDLDialNumber","abstract":"<p>This RPC is used to tell the head unit to use bluetooth to dial a phone number using the phone.</p>"},"Classes.html#/c:objc(cs)SDLDialNumberResponse":{"name":"SDLDialNumberResponse","abstract":"<p>The response to SDLDialNumber</p>"},"Classes/SDLDisplayCapabilities.html":{"name":"SDLDisplayCapabilities","abstract":"<p>Contains information about the display for the SDL system to which the application is currently connected.</p>"},"Classes/SDLDisplayCapability.html":{"name":"SDLDisplayCapability","abstract":"<p>Contain the display related information and all windows related to that display.</p>"},"Classes/SDLDoorStatus.html":{"name":"SDLDoorStatus","abstract":"<p>Describes the status of a parameter of door.</p>"},"Classes/SDLDriverDistractionCapability.html":{"name":"SDLDriverDistractionCapability","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLDynamicUpdateCapabilities.html":{"name":"SDLDynamicUpdateCapabilities","abstract":"<p>@since SDL 7.0</p>"},"Classes/SDLECallInfo.html":{"name":"SDLECallInfo","abstract":"<p>A vehicle data struct for emergency call information</p>"},"Classes/SDLEmergencyEvent.html":{"name":"SDLEmergencyEvent","abstract":"<p>A vehicle data struct for an emergency event</p>"},"Classes/SDLEncodedSyncPData.html":{"name":"SDLEncodedSyncPData","abstract":"<p>Allows encoded data in the form of SyncP packets to be sent to the SYNC module. Legacy / v1 Protocol implementation; use SyncPData instead.</p>"},"Classes.html#/c:objc(cs)SDLEncodedSyncPDataResponse":{"name":"SDLEncodedSyncPDataResponse","abstract":"<p>The response to SDLEncodedSyncPData</p>"},"Classes/SDLEncryptionConfiguration.html":{"name":"SDLEncryptionConfiguration","abstract":"<p>The encryption configuration data</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThru":{"name":"SDLEndAudioPassThru","abstract":"<p>When this request is invoked, the audio capture stops</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThruResponse":{"name":"SDLEndAudioPassThruResponse","abstract":"<p>Response to SDLEndAudioPassThru</p>"},"Classes/SDLEqualizerSettings.html":{"name":"SDLEqualizerSettings","abstract":"<p>Defines the each Equalizer channel settings.</p>"},"Classes/SDLFile.html":{"name":"SDLFile","abstract":"<p>Crates an SDLFile from a file</p>"},"Classes/SDLFileManager.html":{"name":"SDLFileManager","abstract":"<p>The SDLFileManager is an RPC manager for the remote file system. After it starts, it will attempt to communicate with the remote file system to get the names of all files. Deleting and Uploading will them queue these changes as transactions. If a delete succeeds, the local list of remote files will remove that file name, and likewise, if an upload succeeds, the local list of remote files will now include that file name.</p>"},"Classes/SDLFileManagerConfiguration.html":{"name":"SDLFileManagerConfiguration","abstract":"<p>File manager configuration information</p>"},"Classes/SDLFuelRange.html":{"name":"SDLFuelRange","abstract":"<p>Describes the distance a vehicle can travel with the current level of fuel.</p>"},"Classes/SDLFunctionID.html":{"name":"SDLFunctionID","abstract":"<p>A function ID for an SDL RPC</p>"},"Classes/SDLGPSData.html":{"name":"SDLGPSData","abstract":"<p>Describes the GPS data. Not all data will be available on all carlines.</p>"},"Classes/SDLGateStatus.html":{"name":"SDLGateStatus","abstract":"<p>Describes the status of a parameter of trunk/hood/etc.</p>"},"Classes/SDLGearStatus.html":{"name":"SDLGearStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLGenericResponse":{"name":"SDLGenericResponse","abstract":"<p>Generic Response is sent when the name of a received request is unknown. It is only used in case of an error. It will have an INVALID_DATA result code.</p>"},"Classes/SDLGetAppServiceData.html":{"name":"SDLGetAppServiceData","abstract":"<p>This request asks the module for current data related to the specific service. It also includes an option to subscribe to that service for future updates.</p>"},"Classes/SDLGetAppServiceDataResponse.html":{"name":"SDLGetAppServiceDataResponse","abstract":"<p>This response includes the data that was requested from the specific service.</p>"},"Classes/SDLGetCloudAppProperties.html":{"name":"SDLGetCloudAppProperties","abstract":"<p>RPC used to get the current properties of a cloud application.</p>"},"Classes/SDLGetCloudAppPropertiesResponse.html":{"name":"SDLGetCloudAppPropertiesResponse","abstract":"<p>The response to GetCloudAppProperties</p>"},"Classes/SDLGetDTCs.html":{"name":"SDLGetDTCs","abstract":"<p>This RPC allows to request diagnostic module trouble codes from a certain"},"Classes/SDLGetDTCsResponse.html":{"name":"SDLGetDTCsResponse","abstract":"<p>Response to SDLGetDTCs</p>"},"Classes/SDLGetFile.html":{"name":"SDLGetFile","abstract":"<p>This request is sent to the module to retrieve a file.</p>"},"Classes/SDLGetFileResponse.html":{"name":"SDLGetFileResponse","abstract":"<p>Response to GetFiles</p>"},"Classes/SDLGetInteriorVehicleData.html":{"name":"SDLGetInteriorVehicleData","abstract":"<p>Reads the current status value of specified remote control module (type)."},"Classes/SDLGetInteriorVehicleDataConsent.html":{"name":"SDLGetInteriorVehicleDataConsent","abstract":"<p>This RPC allows you to get consent to control a certain module</p>"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html":{"name":"SDLGetInteriorVehicleDataConsentResponse","abstract":"<p>Response to GetInteriorVehicleDataConsent</p>"},"Classes/SDLGetInteriorVehicleDataResponse.html":{"name":"SDLGetInteriorVehicleDataResponse","abstract":"<p>A response to SDLGetInteriorVehicleData</p>"},"Classes/SDLGetSystemCapability.html":{"name":"SDLGetSystemCapability","abstract":"<p>SDL RPC Request for expanded information about a supported system/HMI capability</p>"},"Classes/SDLGetSystemCapabilityResponse.html":{"name":"SDLGetSystemCapabilityResponse","abstract":"<p>Response to SDLGetSystemCapability</p>"},"Classes/SDLGetVehicleData.html":{"name":"SDLGetVehicleData","abstract":"<p>Requests current values of specific published vehicle data items.</p>"},"Classes/SDLGetVehicleDataResponse.html":{"name":"SDLGetVehicleDataResponse","abstract":"<p>Response to SDLGetVehicleData</p>"},"Classes/SDLGetWayPoints.html":{"name":"SDLGetWayPoints","abstract":"<p>This RPC allows you to get navigation waypoint data</p>"},"Classes/SDLGetWayPointsResponse.html":{"name":"SDLGetWayPointsResponse","abstract":"<p>Response to SDLGetWayPoints</p>"},"Classes/SDLGrid.html":{"name":"SDLGrid","abstract":"<p>Describes a location (origin coordinates and span) of a vehicle component.</p>"},"Classes/SDLHMICapabilities.html":{"name":"SDLHMICapabilities","abstract":"<p>Contains information about the HMI capabilities.</p>"},"Classes/SDLHMIPermissions.html":{"name":"SDLHMIPermissions","abstract":"<p>Defining sets of HMI levels, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLHMISettingsControlCapabilities.html":{"name":"SDLHMISettingsControlCapabilities","abstract":"<p>HMI data struct for HMI control settings</p>"},"Classes/SDLHMISettingsControlData.html":{"name":"SDLHMISettingsControlData","abstract":"<p>Corresponds to &ldquo;HMI_SETTINGS&rdquo; ModuleType</p>"},"Classes/SDLHapticRect.html":{"name":"SDLHapticRect","abstract":"<p>Defines spatial for each user control object for video streaming application</p>"},"Classes/SDLHeadLampStatus.html":{"name":"SDLHeadLampStatus","abstract":"<p>Vehicle data struct for status of head lamps</p>"},"Classes/SDLImage.html":{"name":"SDLImage","abstract":"<p>Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.</p>"},"Classes/SDLImageField.html":{"name":"SDLImageField","abstract":"<p>A struct used in DisplayCapabilities describing the capability of an image field</p>"},"Classes/SDLImageResolution.html":{"name":"SDLImageResolution","abstract":"<p>The resolution of an image</p>"},"Classes/SDLKeyboardCapabilities.html":{"name":"SDLKeyboardCapabilities","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLKeyboardLayoutCapability.html":{"name":"SDLKeyboardLayoutCapability","abstract":"<p>Describes the capabilities of a single keyboard layout.</p>"},"Classes/SDLKeyboardProperties.html":{"name":"SDLKeyboardProperties","abstract":"<p>Configuration of on-screen keyboard (if available)</p>"},"Classes/SDLLifecycleConfiguration.html":{"name":"SDLLifecycleConfiguration","abstract":"<p>Configuration options for SDLManager</p>"},"Classes/SDLLifecycleConfigurationUpdate.html":{"name":"SDLLifecycleConfigurationUpdate","abstract":"<p>Configuration update options for SDLManager. This class can be used to update the lifecycle configuration in"},"Classes/SDLLightCapabilities.html":{"name":"SDLLightCapabilities","abstract":"<p>Current Light capabilities.</p>"},"Classes/SDLLightControlCapabilities.html":{"name":"SDLLightControlCapabilities","abstract":"<p>Current light control capabilities.</p>"},"Classes/SDLLightControlData.html":{"name":"SDLLightControlData","abstract":"<p>Data about the current light controls</p>"},"Classes/SDLLightState.html":{"name":"SDLLightState","abstract":"<p>Current light control state</p>"},"Classes.html#/c:objc(cs)SDLListFiles":{"name":"SDLListFiles","abstract":"<p>Requests the current list of resident filenames for the registered app. Not"},"Classes/SDLListFilesResponse.html":{"name":"SDLListFilesResponse","abstract":"<p>Response to SDLListFiles</p>"},"Classes/SDLLocationCoordinate.html":{"name":"SDLLocationCoordinate","abstract":"<p>Describes a coordinate on earth</p>"},"Classes/SDLLocationDetails.html":{"name":"SDLLocationDetails","abstract":"<p>Describes a location, including its coordinate, name, etc. Used in WayPoints.</p>"},"Classes/SDLLockScreenConfiguration.html":{"name":"SDLLockScreenConfiguration","abstract":"<p>A configuration describing how the lock screen should be used by the internal SDL system for your application. This configuration is provided before SDL starts and will govern the entire SDL lifecycle of your application.</p>"},"Classes/SDLLockScreenViewController.html":{"name":"SDLLockScreenViewController","abstract":"<p>The view controller for the lockscreen.</p>"},"Classes/SDLLogConfiguration.html":{"name":"SDLLogConfiguration","abstract":"<p>Information about the current logging configuration</p>"},"Classes/SDLLogFileModule.html":{"name":"SDLLogFileModule","abstract":"<p>A log file module is a collection of source code files that form a cohesive unit and that logs can all use to describe themselves. E.g. a &ldquo;transport&rdquo; module, or a &ldquo;Screen Manager&rdquo; module.</p>"},"Classes/SDLLogFilter.html":{"name":"SDLLogFilter","abstract":"<p>Represents a filter over which SDL logs should be logged</p>"},"Classes/SDLLogManager.html":{"name":"SDLLogManager","abstract":"<p>This is the central manager of logging. A developer should not have to interact with this class, it is exclusively used internally.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetAppleSystemLog":{"name":"SDLLogTargetAppleSystemLog","abstract":"<p>The Apple System Log target is an iOS 2.0+ compatible log target that logs to both the Console and to the System Log.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetFile":{"name":"SDLLogTargetFile","abstract":"<p>The File log will log to a text file on the iPhone in Documents/smartdevicelink/log/#appName##datetime##.log. It will log up to 3 logs which will rollover.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetOSLog":{"name":"SDLLogTargetOSLog","abstract":"<p>OS_LOG is an iOS 10+ only logging system that logs to the Console and the Apple system console. This is an improved replacement for Apple SysLog (SDLLogTargetAppleSystemLog). </p>"},"Classes/SDLManager.html":{"name":"SDLManager","abstract":"<p>The top level manager object for all of SDL&rsquo;s interactions with the app and the head unit</p>"},"Classes/SDLMassageCushionFirmness.html":{"name":"SDLMassageCushionFirmness","abstract":"<p>The intensity or firmness of a cushion.</p>"},"Classes/SDLMassageModeData.html":{"name":"SDLMassageModeData","abstract":"<p>Specify the mode of a massage zone.</p>"},"Classes/SDLMediaServiceData.html":{"name":"SDLMediaServiceData","abstract":"<p>This data is related to what a media service should provide.</p>"},"Classes.html#/c:objc(cs)SDLMediaServiceManifest":{"name":"SDLMediaServiceManifest","abstract":"<p>A media service manifest.</p>"},"Classes/SDLMenuCell.html":{"name":"SDLMenuCell","abstract":"<p>A menu cell item for the main menu or sub-menu.</p>"},"Classes/SDLMenuConfiguration.html":{"name":"SDLMenuConfiguration","abstract":"<p>Defines how the menu is configured</p>"},"Classes/SDLMenuParams.html":{"name":"SDLMenuParams","abstract":"<p>Used when adding a sub menu to an application menu or existing sub menu.</p>"},"Classes/SDLMetadataTags.html":{"name":"SDLMetadataTags","abstract":"<p>Metadata for Show fields</p>"},"Classes/SDLModuleData.html":{"name":"SDLModuleData","abstract":"<p>Describes a remote control module&rsquo;s data</p>"},"Classes/SDLModuleInfo.html":{"name":"SDLModuleInfo","abstract":"<p>Contains information about a RC module.</p>"},"Classes/SDLMsgVersion.html":{"name":"SDLMsgVersion","abstract":"<p>Specifies the version number of the SDL V4 interface. This is used by both the application and SDL to declare what interface version each is using.</p>"},"Classes/SDLMyKey.html":{"name":"SDLMyKey","abstract":"<p>Vehicle Data struct</p>"},"Classes/SDLNavigationCapability.html":{"name":"SDLNavigationCapability","abstract":"<p>Extended capabilities for an onboard navigation system</p>"},"Classes/SDLNavigationInstruction.html":{"name":"SDLNavigationInstruction","abstract":"<p>A navigation instruction.</p>"},"Classes/SDLNavigationServiceData.html":{"name":"SDLNavigationServiceData","abstract":"<p>This data is related to what a navigation service would provide.</p>"},"Classes/SDLNavigationServiceManifest.html":{"name":"SDLNavigationServiceManifest","abstract":"<p>A navigation service manifest.</p>"},"Classes/SDLNotificationConstants.html":{"name":"SDLNotificationConstants","abstract":"<p>This class defines methods for getting groups of notifications</p>"},"Classes/SDLOasisAddress.html":{"name":"SDLOasisAddress","abstract":"<p>Struct used in SendLocation describing an address</p>"},"Classes/SDLOnAppCapabilityUpdated.html":{"name":"SDLOnAppCapabilityUpdated","abstract":"<p>A notification to inform SDL Core that a specific app capability has changed.</p>"},"Classes/SDLOnAppInterfaceUnregistered.html":{"name":"SDLOnAppInterfaceUnregistered","abstract":"<p>Notifies an application that its interface registration has been terminated. This means that all SDL resources associated with the application are discarded, including the Command Menu, Choice Sets, button subscriptions, etc.</p>"},"Classes/SDLOnAppServiceData.html":{"name":"SDLOnAppServiceData","abstract":"<p>This notification includes the data that is updated from the specific service.</p>"},"Classes.html#/c:objc(cs)SDLOnAudioPassThru":{"name":"SDLOnAudioPassThru","abstract":"<p>Binary data is in binary part of hybrid msg.</p>"},"Classes/SDLOnButtonEvent.html":{"name":"SDLOnButtonEvent","abstract":"<p>Notifies application that user has depressed or released a button to which"},"Classes/SDLOnButtonPress.html":{"name":"SDLOnButtonPress","abstract":"<p>Notifies application of button press events for buttons to which the application is subscribed. SDL supports two button press events defined as follows:</p>"},"Classes/SDLOnCommand.html":{"name":"SDLOnCommand","abstract":"<p>This is called when a command was selected via VR after pressing the PTT button, or selected from the menu after pressing the MENU button.</p>"},"Classes/SDLOnDriverDistraction.html":{"name":"SDLOnDriverDistraction","abstract":"<p>Notifies the application of the current driver distraction state (whether driver distraction rules are in effect, or not).</p>"},"Classes/SDLOnEncodedSyncPData.html":{"name":"SDLOnEncodedSyncPData","abstract":"<p>Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED ***</p>"},"Classes/SDLOnHMIStatus.html":{"name":"SDLOnHMIStatus"},"Classes/SDLOnHashChange.html":{"name":"SDLOnHashChange","abstract":"<p>Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of all persisted app data.</p>"},"Classes/SDLOnInteriorVehicleData.html":{"name":"SDLOnInteriorVehicleData","abstract":"<p>Notifications when subscribed vehicle data changes.</p>"},"Classes/SDLOnKeyboardInput.html":{"name":"SDLOnKeyboardInput","abstract":"<p>Sent when a keyboard presented by a PerformInteraction has a keyboard input.</p>"},"Classes/SDLOnLanguageChange.html":{"name":"SDLOnLanguageChange","abstract":"<p>Provides information to what language the SDL HMI language was changed</p>"},"Classes/SDLOnPermissionsChange.html":{"name":"SDLOnPermissionsChange","abstract":"<p>Provides update to app of which sets of functions are available</p>"},"Classes/SDLOnRCStatus.html":{"name":"SDLOnRCStatus","abstract":"<p>OnRCStatus notifications to all registered mobile applications and the HMI whenever"},"Classes.html#/c:objc(cs)SDLOnSubtleAlertPressed":{"name":"SDLOnSubtleAlertPressed","abstract":"<p>Sent when the alert itself is touched (outside of a soft button). Touching (or otherwise selecting) the alert should open the app before sending this notification.</p>"},"Classes/SDLOnSyncPData.html":{"name":"SDLOnSyncPData","abstract":"<p>DEPRECATED</p>"},"Classes/SDLOnSystemCapabilityUpdated.html":{"name":"SDLOnSystemCapabilityUpdated","abstract":"<p>A notification to inform the connected device that a specific system capability has changed.</p>"},"Classes/SDLOnSystemRequest.html":{"name":"SDLOnSystemRequest","abstract":"<p>An asynchronous request from the system for specific data from the device or the cloud or response to a request from the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication request responses)</p>"},"Classes/SDLOnTBTClientState.html":{"name":"SDLOnTBTClientState","abstract":"<p>Provides applications with notifications specific to the current TBT client status on the module</p>"},"Classes/SDLOnTouchEvent.html":{"name":"SDLOnTouchEvent","abstract":"<p>Notifies about touch events on the screen&rsquo;s prescribed area during video streaming</p>"},"Classes/SDLOnUpdateFile.html":{"name":"SDLOnUpdateFile","abstract":"<p>This notification tells an app to upload and update a file with a given name.</p>"},"Classes/SDLOnUpdateSubMenu.html":{"name":"SDLOnUpdateSubMenu","abstract":"<p>This notification tells an app to update the AddSubMenu or its &lsquo;sub&rsquo; AddCommand and AddSubMenus with the requested data</p>"},"Classes/SDLOnVehicleData.html":{"name":"SDLOnVehicleData","abstract":"<p>Callback for the periodic and non periodic vehicle data read function.</p>"},"Classes/SDLOnWayPointChange.html":{"name":"SDLOnWayPointChange","abstract":"<p>Notification which provides the entire LocationDetails when there is a change to any waypoints or destination.</p>"},"Classes/SDLParameterPermissions.html":{"name":"SDLParameterPermissions","abstract":"<p>Defining sets of parameters, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLPerformAppServiceInteraction.html":{"name":"SDLPerformAppServiceInteraction","abstract":"<p>App service providers will likely have different actions exposed to the module and app service consumers. It will be difficult to standardize these actions by RPC versions and can easily become stale. Therefore, we introduce a best-effort attempt to take actions on a service.</p>"},"Classes/SDLPerformAppServiceInteractionResponse.html":{"name":"SDLPerformAppServiceInteractionResponse","abstract":"<p>Response to the request to request an app service.</p>"},"Classes/SDLPerformAudioPassThru.html":{"name":"SDLPerformAudioPassThru","abstract":"<p>This will open an audio pass thru session. By doing so the app can receive"},"Classes.html#/c:objc(cs)SDLPerformAudioPassThruResponse":{"name":"SDLPerformAudioPassThruResponse","abstract":"<p>Response to SDLPerformAudioPassThru</p>"},"Classes/SDLPerformInteraction.html":{"name":"SDLPerformInteraction","abstract":"<p>Performs an application-initiated interaction in which the user can select a choice from the passed choice set.</p>"},"Classes/SDLPerformInteractionResponse.html":{"name":"SDLPerformInteractionResponse","abstract":"<p>PerformInteraction Response is sent, when SDLPerformInteraction has been called</p>"},"Classes/SDLPermissionElement.html":{"name":"SDLPermissionElement","abstract":"<p>An object containing the RPC name and its parameter names that should be checked when checking permissions</p>"},"Classes/SDLPermissionItem.html":{"name":"SDLPermissionItem","abstract":"<p>Permissions for a given set of RPCs</p>"},"Classes/SDLPermissionManager.html":{"name":"SDLPermissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>"},"Classes/SDLPhoneCapability.html":{"name":"SDLPhoneCapability","abstract":"<p>Extended capabilities of the module&rsquo;s phone feature</p>"},"Classes/SDLPinchGesture.html":{"name":"SDLPinchGesture","abstract":"<p>Pinch Gesture information</p>"},"Classes/SDLPresetBankCapabilities.html":{"name":"SDLPresetBankCapabilities","abstract":"<p>Contains information about on-screen preset capabilities.</p>"},"Classes/SDLPublishAppService.html":{"name":"SDLPublishAppService","abstract":"<p>Registers a service offered by this app on the module."},"Classes/SDLPublishAppServiceResponse.html":{"name":"SDLPublishAppServiceResponse","abstract":"<p>Response to the request to register a service offered by this app on the module.</p>"},"Classes/SDLPutFile.html":{"name":"SDLPutFile","abstract":"<p>Used to push a binary data onto the SDL module from a mobile device, such as icons and album art.</p>"},"Classes/SDLPutFileResponse.html":{"name":"SDLPutFileResponse","abstract":"<p>Response to SDLPutFile</p>"},"Classes/SDLRDSData.html":{"name":"SDLRDSData","abstract":"<p>Include the data defined in Radio Data System, which is a communications protocol standard for embedding small amounts of digital information in conventional FM radio broadcasts.</p>"},"Classes/SDLRGBColor.html":{"name":"SDLRGBColor","abstract":"<p>Represents an RGB color</p>"},"Classes/SDLRPCMessage.html":{"name":"SDLRPCMessage","abstract":"<p>Parent class of all RPC messages.</p>"},"Classes.html#/c:objc(cs)SDLRPCNotification":{"name":"SDLRPCNotification","abstract":"<p>An RPC sent from the head unit to the app about some data change, such as a button was pressed</p>"},"Classes/SDLRPCNotificationNotification.html":{"name":"SDLRPCNotificationNotification","abstract":"<p>An NSNotification object that makes retrieving internal SDLRPCNotification data easier</p>"},"Classes/SDLRPCPermissionStatus.html":{"name":"SDLRPCPermissionStatus","abstract":"<p>An object containing the result status of a permission element request</p>"},"Classes/SDLRPCRequest.html":{"name":"SDLRPCRequest","abstract":"<p>Superclass of RPC requests</p>"},"Classes/SDLRPCRequestNotification.html":{"name":"SDLRPCRequestNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCRequest data easier</p>"},"Classes/SDLRPCResponse.html":{"name":"SDLRPCResponse","abstract":"<p>Superclass of RPC responses</p>"},"Classes/SDLRPCResponseNotification.html":{"name":"SDLRPCResponseNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCResponse data easier</p>"},"Classes/SDLRPCStruct.html":{"name":"SDLRPCStruct","abstract":"<p>Superclass of all RPC-related structs and messages</p>"},"Classes/SDLRadioControlCapabilities.html":{"name":"SDLRadioControlCapabilities","abstract":"<p>Contains information about a radio control module&rsquo;s capabilities.</p>"},"Classes/SDLRadioControlData.html":{"name":"SDLRadioControlData","abstract":"<p>Include information (both read-only and changeable data) about a remote control radio module.</p>"},"Classes/SDLReadDID.html":{"name":"SDLReadDID","abstract":"<p>Non periodic vehicle data read request. This is an RPC to get diagnostics"},"Classes/SDLReadDIDResponse.html":{"name":"SDLReadDIDResponse","abstract":"<p>A response to ReadDID</p>"},"Classes/SDLRectangle.html":{"name":"SDLRectangle","abstract":"<p>A struct describing a rectangle</p>"},"Classes/SDLRegisterAppInterface.html":{"name":"SDLRegisterAppInterface","abstract":"<p>Registers the application&rsquo;s interface with SDL. The <code>RegisterAppInterface</code> RPC declares the properties of the app, including the messaging interface version, the app name, etc. The mobile application must establish its interface registration with SDL before any other interaction with SDL can take place. The registration lasts until it is terminated either by the application calling the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses.html#/c:objc(cs)SDLUnregisterAppInterface\">SDLUnregisterAppInterface</a></code> method, or by SDL sending an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnAppInterfaceUnregistered.html\">SDLOnAppInterfaceUnregistered</a></code> notification, or by loss of the underlying transport connection, or closing of the underlying message transmission protocol RPC session.</p>"},"Classes/SDLRegisterAppInterfaceResponse.html":{"name":"SDLRegisterAppInterfaceResponse","abstract":"<p>Response to SDLRegisterAppInterface</p>"},"Classes/SDLReleaseInteriorVehicleDataModule.html":{"name":"SDLReleaseInteriorVehicleDataModule","abstract":"<p>Releases a controlled remote control module so others can take control</p>"},"Classes.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModuleResponse":{"name":"SDLReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Response to ReleaseInteriorVehicleDataModule</p>"},"Classes/SDLRemoteControlCapabilities.html":{"name":"SDLRemoteControlCapabilities","abstract":"<p>Capabilities of the remote control feature</p>"},"Classes/SDLResetGlobalProperties.html":{"name":"SDLResetGlobalProperties","abstract":"<p>Resets the passed global properties to their default values as defined by"},"Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse":{"name":"SDLResetGlobalPropertiesResponse","abstract":"<p>Response to ResetGlobalProperties</p>"},"Classes/SDLRoofStatus.html":{"name":"SDLRoofStatus","abstract":"<p>Describes the status of a parameter of roof/convertible roof/sunroof/moonroof etc. If roof is open (AJAR), state will determine percentage of roof open.</p>"},"Classes/SDLSISData.html":{"name":"SDLSISData","abstract":"<p>HD radio Station Information Service (SIS) data.</p>"},"Classes/SDLScreenManager.html":{"name":"SDLScreenManager","abstract":"<p>The SDLScreenManager is a manager to control SDL UI features. Use the screen manager for setting up the UI of the template, creating a menu for your users, creating softbuttons, setting textfields, etc..</p>"},"Classes/SDLScreenParams.html":{"name":"SDLScreenParams","abstract":"<p>A struct in DisplayCapabilities describing parameters related to a video / touch input area</p>"},"Classes/SDLScrollableMessage.html":{"name":"SDLScrollableMessage","abstract":"<p>Creates a full screen overlay containing a large block of formatted text that can be scrolled with buttons available.</p>"},"Classes.html#/c:objc(cs)SDLScrollableMessageResponse":{"name":"SDLScrollableMessageResponse","abstract":"<p>Response to SDLScrollableMessage</p>"},"Classes/SDLSeatControlCapabilities.html":{"name":"SDLSeatControlCapabilities","abstract":"<p>Include information about a seat control capabilities.</p>"},"Classes/SDLSeatControlData.html":{"name":"SDLSeatControlData","abstract":"<p>Seat control data corresponds to &ldquo;SEAT&rdquo; ModuleType.</p>"},"Classes/SDLSeatLocation.html":{"name":"SDLSeatLocation","abstract":"<p>Describes the location of a seat</p>"},"Classes/SDLSeatLocationCapability.html":{"name":"SDLSeatLocationCapability","abstract":"<p>Contains information about the locations of each seat.</p>"},"Classes/SDLSeatMemoryAction.html":{"name":"SDLSeatMemoryAction","abstract":"<p>Specify the action to be performed.</p>"},"Classes/SDLSeatOccupancy.html":{"name":"SDLSeatOccupancy","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLSeatStatus.html":{"name":"SDLSeatStatus","abstract":"<p>Describes the status of a parameter of seat.</p>"},"Classes/SDLSeekStreamingIndicator.html":{"name":"SDLSeekStreamingIndicator","abstract":"<p>The seek next / skip previous subscription buttons&rsquo; content</p>"},"Classes/SDLSendHapticData.html":{"name":"SDLSendHapticData","abstract":"<p>Sends the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by the HMI to determine how and when haptic events should occur.</p>"},"Classes.html#/c:objc(cs)SDLSendHapticDataResponse":{"name":"SDLSendHapticDataResponse","abstract":"<p>Response to SDLSendHapticData</p>"},"Classes/SDLSendLocation.html":{"name":"SDLSendLocation","abstract":"<p>SendLocation is used to send a location to the navigation system for navigation</p>"},"Classes.html#/c:objc(cs)SDLSendLocationResponse":{"name":"SDLSendLocationResponse","abstract":"<p>Response to SDLSendLocation</p>"},"Classes/SDLSetAppIcon.html":{"name":"SDLSetAppIcon","abstract":"<p>Used to set existing local file on SDL as the app&rsquo;s icon. Not supported on"},"Classes.html#/c:objc(cs)SDLSetAppIconResponse":{"name":"SDLSetAppIconResponse","abstract":"<p>Response to SDLSetAppIcon</p>"},"Classes/SDLSetCloudAppProperties.html":{"name":"SDLSetCloudAppProperties","abstract":"<p>RPC used to enable/disable a cloud application and set authentication data</p>"},"Classes.html#/c:objc(cs)SDLSetCloudAppPropertiesResponse":{"name":"SDLSetCloudAppPropertiesResponse","abstract":"<p>The response to SetCloudAppProperties</p>"},"Classes/SDLSetDisplayLayout.html":{"name":"SDLSetDisplayLayout","abstract":"<p>Used to set an alternate display layout. If not sent, default screen for"},"Classes/SDLSetDisplayLayoutResponse.html":{"name":"SDLSetDisplayLayoutResponse","abstract":"<p>Response to SDLSetDisplayLayout</p>"},"Classes/SDLSetGlobalProperties.html":{"name":"SDLSetGlobalProperties","abstract":"<p>Sets global property values</p>"},"Classes.html#/c:objc(cs)SDLSetGlobalPropertiesResponse":{"name":"SDLSetGlobalPropertiesResponse","abstract":"<p>Response to SDLSetGlobalProperties</p>"},"Classes/SDLSetInteriorVehicleData.html":{"name":"SDLSetInteriorVehicleData","abstract":"<p>This RPC allows a remote control type mobile application to"},"Classes/SDLSetInteriorVehicleDataResponse.html":{"name":"SDLSetInteriorVehicleDataResponse","abstract":"<p>Response to SDLSetInteriorVehicleData</p>"},"Classes/SDLSetMediaClockTimer.html":{"name":"SDLSetMediaClockTimer","abstract":"<p>Sets the media clock/timer value and the update method (e.g.count-up,"},"Classes.html#/c:objc(cs)SDLSetMediaClockTimerResponse":{"name":"SDLSetMediaClockTimerResponse","abstract":"<p>Response to SDLSetMediaClockTimer</p>"},"Classes/SDLShow.html":{"name":"SDLShow","abstract":"<p>Updates the application&rsquo;s display text area, regardless of whether or not"},"Classes/SDLShowAppMenu.html":{"name":"SDLShowAppMenu","abstract":"<p>Used by an app to show the app&rsquo;s menu, typically this is used by a navigation app if the menu button is hidden.</p>"},"Classes.html#/c:objc(cs)SDLShowAppMenuResponse":{"name":"SDLShowAppMenuResponse","abstract":"<p>Response to the request to show the app menu.</p>"},"Classes/SDLShowConstantTBT.html":{"name":"SDLShowConstantTBT","abstract":"<p>This RPC is used to update the user with navigation information for the constantly shown screen (base screen), but also for the alert maneuver screen.</p>"},"Classes.html#/c:objc(cs)SDLShowConstantTBTResponse":{"name":"SDLShowConstantTBTResponse","abstract":"<p>Response to SDLShowConstantTBT</p>"},"Classes.html#/c:objc(cs)SDLShowResponse":{"name":"SDLShowResponse","abstract":"<p>Response to SDLShow</p>"},"Classes/SDLSingleTireStatus.html":{"name":"SDLSingleTireStatus","abstract":"<p>Tire pressure status of a single tire.</p>"},"Classes/SDLSlider.html":{"name":"SDLSlider","abstract":"<p>Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider.</p>"},"Classes/SDLSliderResponse.html":{"name":"SDLSliderResponse","abstract":"<p>Response to SDLSlider</p>"},"Classes/SDLSoftButton.html":{"name":"SDLSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>"},"Classes/SDLSoftButtonCapabilities.html":{"name":"SDLSoftButtonCapabilities","abstract":"<p>Contains information about a SoftButton&rsquo;s capabilities.</p>"},"Classes/SDLSoftButtonObject.html":{"name":"SDLSoftButtonObject","abstract":"<p>A soft button wrapper object that is capable of storing and switching between states</p>"},"Classes/SDLSoftButtonState.html":{"name":"SDLSoftButtonState","abstract":"<p>A soft button state including data such as text, name and artwork</p>"},"Classes/SDLSpeak.html":{"name":"SDLSpeak","abstract":"<p>Speaks a phrase over the vehicle audio system using SDL&rsquo;s TTS (text-to-speech) engine. The provided text to be spoken can be simply a text phrase, or it can consist of phoneme specifications to direct SDL&rsquo;s TTS engine to speak a &ldquo;speech-sculpted&rdquo; phrase.</p>"},"Classes.html#/c:objc(cs)SDLSpeakResponse":{"name":"SDLSpeakResponse","abstract":"<p>Response to SDLSpeak</p>"},"Classes/SDLStabilityControlsStatus.html":{"name":"SDLStabilityControlsStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLStartTime.html":{"name":"SDLStartTime","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStationIDNumber.html":{"name":"SDLStationIDNumber","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStreamingMediaConfiguration.html":{"name":"SDLStreamingMediaConfiguration","abstract":"<p>The streaming media configuration. Use this class to configure streaming media information.</p>"},"Classes/SDLStreamingMediaManager.html":{"name":"SDLStreamingMediaManager","abstract":"<p>Manager to help control streaming (video and audio) media services.</p>"},"Classes/SDLStreamingVideoScaleManager.html":{"name":"SDLStreamingVideoScaleManager","abstract":"<p>This class consolidates the logic of scaling between the view controller&rsquo;s coordinate system and the display&rsquo;s coordinate system.</p>"},"Classes/SDLSubscribeButton.html":{"name":"SDLSubscribeButton","abstract":"<p>Establishes a subscription to button notifications for HMI buttons. Buttons"},"Classes.html#/c:objc(cs)SDLSubscribeButtonResponse":{"name":"SDLSubscribeButtonResponse","abstract":"<p>Response to SDLSubscribeButton</p>"},"Classes/SDLSubscribeVehicleData.html":{"name":"SDLSubscribeVehicleData","abstract":"<p>Subscribes to specific published vehicle data items. The data will be only sent if it has changed. The application will be notified by the <code>onVehicleData</code> notification whenever new data is available. The update rate is dependent on sensors, vehicle architecture and vehicle type.</p>"},"Classes/SDLSubscribeVehicleDataResponse.html":{"name":"SDLSubscribeVehicleDataResponse","abstract":"<p>Response to SDLSubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLSubscribeWayPoints":{"name":"SDLSubscribeWayPoints","abstract":"<p>A SDLSubscribeWaypoints can be sent to subscribe"},"Classes.html#/c:objc(cs)SDLSubscribeWayPointsResponse":{"name":"SDLSubscribeWayPointsResponse","abstract":"<p>Response to SubscribeWayPoints</p>"},"Classes/SDLSubtleAlert.html":{"name":"SDLSubtleAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. At least either alertText1, alertText2 or TTSChunks need to be provided.</p>"},"Classes/SDLSubtleAlertResponse.html":{"name":"SDLSubtleAlertResponse","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLSyncPData":{"name":"SDLSyncPData","abstract":"<p>Allows binary data in the form of SyncP packets to be sent to the SYNC module. Binary data is in binary part of hybrid msg.</p>"},"Classes.html#/c:objc(cs)SDLSyncPDataResponse":{"name":"SDLSyncPDataResponse","abstract":"<p>Response to SyncPData</p>"},"Classes/SDLSystemCapability.html":{"name":"SDLSystemCapability","abstract":"<p>The systemCapabilityType indicates which type of data should be changed and identifies which data object exists in this struct. For example, if the SystemCapability Type is NAVIGATION then a &ldquo;navigationCapability&rdquo; should exist.</p>"},"Classes/SDLSystemCapabilityManager.html":{"name":"SDLSystemCapabilityManager","abstract":"<p>A manager that handles updating and subscribing to SDL capabilities.</p>"},"Classes/SDLSystemInfo.html":{"name":"SDLSystemInfo","abstract":"<p>Undocumented</p>"},"Classes/SDLSystemRequest.html":{"name":"SDLSystemRequest","abstract":"<p>An asynchronous request from the device; binary data can be included in hybrid part of message for some requests (such as HTTP, Proprietary, or Authentication requests)</p>"},"Classes.html#/c:objc(cs)SDLSystemRequestResponse":{"name":"SDLSystemRequestResponse","abstract":"<p>Response to SystemRequest</p>"},"Classes/SDLTTSChunk.html":{"name":"SDLTTSChunk","abstract":"<p>Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).</p>"},"Classes/SDLTemperature.html":{"name":"SDLTemperature","abstract":"<p>Struct representing a temperature.</p>"},"Classes/SDLTemplateColorScheme.html":{"name":"SDLTemplateColorScheme","abstract":"<p>A color scheme for all display layout templates.</p>"},"Classes/SDLTemplateConfiguration.html":{"name":"SDLTemplateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>"},"Classes/SDLTextField.html":{"name":"SDLTextField","abstract":"<p>Struct defining the characteristics of a displayed field on the HMI.</p>"},"Classes/SDLTireStatus.html":{"name":"SDLTireStatus","abstract":"<p>Struct used in Vehicle Data; the status and pressure of the tires.</p>"},"Classes/SDLTouch.html":{"name":"SDLTouch","abstract":"<p>Describes a touch location</p>"},"Classes/SDLTouchCoord.html":{"name":"SDLTouchCoord","abstract":"<p>The coordinate of a touch, used in a touch event</p>"},"Classes/SDLTouchEvent.html":{"name":"SDLTouchEvent","abstract":"<p>A touch which occurred on the IVI system during projection</p>"},"Classes/SDLTouchEventCapabilities.html":{"name":"SDLTouchEventCapabilities","abstract":"<p>The capabilities of touches during projection applications</p>"},"Classes/SDLTouchManager.html":{"name":"SDLTouchManager","abstract":"<p>Touch Manager responsible for processing touch event notifications.</p>"},"Classes/SDLTurn.html":{"name":"SDLTurn","abstract":"<p>A struct used in UpdateTurnList for Turn-by-Turn navigation applications</p>"},"Classes/SDLUnpublishAppService.html":{"name":"SDLUnpublishAppService","abstract":"<p>Unpublish an existing service published by this application.</p>"},"Classes.html#/c:objc(cs)SDLUnpublishAppServiceResponse":{"name":"SDLUnpublishAppServiceResponse","abstract":"<p>The response to UnpublishAppService</p>"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterface":{"name":"SDLUnregisterAppInterface","abstract":"<p>Terminates an application&rsquo;s interface registration. This causes SDL&reg; to"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterfaceResponse":{"name":"SDLUnregisterAppInterfaceResponse","abstract":"<p>Response to UnregisterAppInterface</p>"},"Classes/SDLUnsubscribeButton.html":{"name":"SDLUnsubscribeButton","abstract":"<p>Deletes a subscription to button notifications for the specified button. For"},"Classes.html#/c:objc(cs)SDLUnsubscribeButtonResponse":{"name":"SDLUnsubscribeButtonResponse","abstract":"<p>Response to UnsubscribeButton</p>"},"Classes/SDLUnsubscribeVehicleData.html":{"name":"SDLUnsubscribeVehicleData","abstract":"<p>This function is used to unsubscribe the notifications from the"},"Classes/SDLUnsubscribeVehicleDataResponse.html":{"name":"SDLUnsubscribeVehicleDataResponse","abstract":"<p>Response to UnsubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPoints":{"name":"SDLUnsubscribeWayPoints","abstract":"<p>Request to unsubscribe from navigation WayPoints and Destination</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPointsResponse":{"name":"SDLUnsubscribeWayPointsResponse","abstract":"<p>Response to UnsubscribeWayPoints</p>"},"Classes/SDLUpdateTurnList.html":{"name":"SDLUpdateTurnList","abstract":"<p>Updates the list of next maneuvers, which can be requested by the user pressing the softbutton<br></p>"},"Classes.html#/c:objc(cs)SDLUpdateTurnListResponse":{"name":"SDLUpdateTurnListResponse","abstract":"<p>Response to UpdateTurnList</p>"},"Classes/SDLVehicleDataResult.html":{"name":"SDLVehicleDataResult","abstract":"<p>Individual published data request result</p>"},"Classes/SDLVehicleType.html":{"name":"SDLVehicleType","abstract":"<p>Describes the type of vehicle the mobile phone is connected with.</p>"},"Classes/SDLVersion.html":{"name":"SDLVersion","abstract":"<p>Specifies a major / minor / patch version number for semantic versioning purposes and comparisons</p>"},"Classes/SDLVideoStreamingCapability.html":{"name":"SDLVideoStreamingCapability","abstract":"<p>Contains information about this system&rsquo;s video streaming capabilities</p>"},"Classes/SDLVideoStreamingFormat.html":{"name":"SDLVideoStreamingFormat","abstract":"<p>An available format for video streaming in projection applications</p>"},"Classes/SDLVideoStreamingRange.html":{"name":"SDLVideoStreamingRange","abstract":"<p>Undocumented</p>"},"Classes/SDLVoiceCommand.html":{"name":"SDLVoiceCommand","abstract":"<p>Voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>"},"Classes/SDLVRHelpItem.html":{"name":"SDLVRHelpItem","abstract":"<p>A help item for voice commands, used locally in interaction lists and globally</p>"},"Classes/SDLWeatherAlert.html":{"name":"SDLWeatherAlert","abstract":"<p>Contains information about a weather alert</p>"},"Classes/SDLWeatherData.html":{"name":"SDLWeatherData","abstract":"<p>Contains information about the current weather</p>"},"Classes/SDLWeatherServiceData.html":{"name":"SDLWeatherServiceData","abstract":"<p>This data is related to what a weather service would provide.</p>"},"Classes/SDLWeatherServiceManifest.html":{"name":"SDLWeatherServiceManifest","abstract":"<p>A weather service manifest.</p>"},"Classes/SDLWindowCapability.html":{"name":"SDLWindowCapability","abstract":"<p>Reflects content of DisplayCapabilities, ButtonCapabilities and SoftButtonCapabilities</p>"},"Classes/SDLWindowState.html":{"name":"SDLWindowState","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLWindowStatus.html":{"name":"SDLWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Classes/SDLWindowTypeCapabilities.html":{"name":"SDLWindowTypeCapabilities","abstract":"<p>Used to inform an app how many window instances per type that can be created.</p>"},"Categories/NSString%28SDLEnum%29.html#/c:objc(cs)NSString(im)isEqualToEnum:":{"name":"-isEqualToEnum:","abstract":"<p>Returns whether or not two enums are equal.</p>","parent_name":"NSString(SDLEnum)"},"Categories/NSString%28SDLEnum%29.html":{"name":"NSString(SDLEnum)","abstract":"<p>Extensions to NSString specifically for SDL string enums</p>"},"Categories.html":{"name":"Categories","abstract":"<p>The following categories are available globally.</p>"},"Classes.html":{"name":"Classes","abstract":"<p>The following classes are available globally.</p>"},"Constants.html":{"name":"Constants","abstract":"<p>The following constants are available globally.</p>"},"Enums.html":{"name":"Enumerations","abstract":"<p>The following enumerations are available globally.</p>"},"Protocols.html":{"name":"Protocols","abstract":"<p>The following protocols are available globally.</p>"},"Type%20Definitions.html":{"name":"Type Definitions","abstract":"<p>The following type definitions are available globally.</p>"}} \ No newline at end of file
diff --git a/docs/undocumented.json b/docs/undocumented.json
index eedb39d58..39185f602 100644
--- a/docs/undocumented.json
+++ b/docs/undocumented.json
@@ -1,6 +1,292 @@
{
"warnings": [
-
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAlertAudioData.h",
+ "line": 13,
+ "symbol": "SDLAlertAudioData",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAlertAudioData.h",
+ "line": 18,
+ "symbol": "SDLAlertAudioData.-init",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAlertView.h",
+ "line": 22,
+ "symbol": "SDLAlertView",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAlertView.h",
+ "line": 53,
+ "symbol": "SDLAlertView.-init",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAppCapabilityType.h",
+ "line": 42,
+ "symbol": "SDLAppCapabilityTypeVideoStreaming",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAudioData.h",
+ "line": 18,
+ "symbol": "SDLAudioData",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLAudioData.h",
+ "line": 38,
+ "symbol": "SDLAudioData.-init",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLBodyInformation.h",
+ "line": 16,
+ "symbol": "SDLBodyInformation",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLDoorStatus.h",
+ "line": 54,
+ "symbol": "SDLDoorStatus.location",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLDoorStatus.h",
+ "line": 56,
+ "symbol": "SDLDoorStatus.status",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
+ "line": 40,
+ "symbol": "SDLDoorStatusTypeClosed",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
+ "line": 42,
+ "symbol": "SDLDoorStatusTypeLocked",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
+ "line": 44,
+ "symbol": "SDLDoorStatusTypeAjar",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
+ "line": 46,
+ "symbol": "SDLDoorStatusTypeRemoved",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLGateStatus.h",
+ "line": 54,
+ "symbol": "SDLGateStatus.location",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLGateStatus.h",
+ "line": 56,
+ "symbol": "SDLGateStatus.status",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLKeyboardInputMask.h",
+ "line": 42,
+ "symbol": "SDLKeyboardInputMaskEnableInputKeyMask",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLKeyboardInputMask.h",
+ "line": 44,
+ "symbol": "SDLKeyboardInputMaskDisableInputKeyMask",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLKeyboardInputMask.h",
+ "line": 46,
+ "symbol": "SDLKeyboardInputMaskUserChoiceInputKeyMask",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h",
+ "line": 52,
+ "symbol": "SDLKeyboardLayoutCapability.keyboardLayout",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLRoofStatus.h",
+ "line": 63,
+ "symbol": "SDLRoofStatus.location",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLRoofStatus.h",
+ "line": 65,
+ "symbol": "SDLRoofStatus.status",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLRoofStatus.h",
+ "line": 67,
+ "symbol": "SDLRoofStatus.state",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLSeatStatus.h",
+ "line": 53,
+ "symbol": "SDLSeatStatus.seatLocation",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLSeatStatus.h",
+ "line": 55,
+ "symbol": "SDLSeatStatus.conditionActive",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLSeekIndicatorType.h",
+ "line": 40,
+ "symbol": "SDLSeekIndicatorTypeTrack",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLSeekIndicatorType.h",
+ "line": 41,
+ "symbol": "SDLSeekIndicatorTypeTime",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLSeekStreamingIndicator.h",
+ "line": 64,
+ "symbol": "SDLSeekStreamingIndicator.type",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLStreamingVideoDelegate.h",
+ "line": 12,
+ "symbol": "SDLStreamingVideoDelegate",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.protocol",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLStreamingVideoDelegate.h",
+ "line": 14,
+ "symbol": "SDLStreamingVideoDelegate.-videoStreamingSizeDidUpdate:",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLSystemInfo.h",
+ "line": 15,
+ "symbol": "SDLSystemInfo",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 14,
+ "symbol": "SDLVideoStreamingRange",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 17,
+ "symbol": "SDLVideoStreamingRange.minimumAspectRatio",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 20,
+ "symbol": "SDLVideoStreamingRange.maximumAspectRatio",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 23,
+ "symbol": "SDLVideoStreamingRange.minimumDiagonal",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 26,
+ "symbol": "SDLVideoStreamingRange.minimumResolution",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 29,
+ "symbol": "SDLVideoStreamingRange.maximumResolution",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 32,
+ "symbol": "SDLVideoStreamingRange.-isImageResolutionInRange:",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 35,
+ "symbol": "SDLVideoStreamingRange.-isAspectRatioInRange:",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 37,
+ "symbol": "SDLVideoStreamingRange.-initWithMinimumResolution:maximumResolution:",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/joelfischer/Developer/livio/sdl/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
+ "line": 40,
+ "symbol": "SDLVideoStreamingRange.+disabled",
+ "symbol_kind": "sourcekitten.source.lang.objc.decl.method.class",
+ "warning": "undocumented"
+ }
],
- "source_directory": "/Users/joelfischer/Development/livio/sdl/sdl_ios"
+ "source_directory": "/Users/joelfischer/Developer/livio/sdl/sdl_ios"
} \ No newline at end of file
diff --git a/generator/generator.py b/generator/generator.py
index 2dda4129f..f7ccb4368 100644
--- a/generator/generator.py
+++ b/generator/generator.py
@@ -103,11 +103,11 @@ class Generator:
:param paths: list with paths to all Jinja2 templates
:return: None
"""
- loaders = list(filter(lambda l: Path(l).exists(), paths))
+ loaders = list(filter(lambda lambdaList: Path(lambdaList).exists(), paths))
if not loaders:
self.logger.error('Directory with templates not found %s', str(paths))
sys.exit(1)
- loaders = [FileSystemLoader(l) for l in loaders]
+ loaders = [FileSystemLoader(lambdaList) for lambdaList in loaders]
self._env = Environment(loader=ChoiceLoader(loaders))
self._env.filters['title'] = self.title
diff --git a/generator/rpc_spec b/generator/rpc_spec
-Subproject 762489ca140f246923e8bb8f54e96364e9d0101
+Subproject 72632f946941d63a57ee5e99896e3eae3627f7d
diff --git a/generator/templates/SDLRPCFunctionNames.h.jinja2 b/generator/templates/SDLRPCFunctionNames.h.jinja2
index 5e13b735b..419081b51 100644
--- a/generator/templates/SDLRPCFunctionNames.h.jinja2
+++ b/generator/templates/SDLRPCFunctionNames.h.jinja2
@@ -6,7 +6,7 @@
/**
* All RPC request / response / notification names
*/
-typedef SDLEnum SDLRPCFunctionName SDL_SWIFT_ENUM;
+typedef SDLEnum SDLRPCFunctionName NS_TYPED_ENUM;
{% for param in params %}
{#- description if exist in source xml, will be putted here
since if exist in source xml, will be putted here -#}
diff --git a/generator/templates/SDLRPCParameterNames.h.jinja2 b/generator/templates/SDLRPCParameterNames.h.jinja2
index 7a5bbb746..93bf39c88 100644
--- a/generator/templates/SDLRPCParameterNames.h.jinja2
+++ b/generator/templates/SDLRPCParameterNames.h.jinja2
@@ -6,7 +6,7 @@
NS_ASSUME_NONNULL_BEGIN
-typedef NSString* SDLRPCParameterName SDL_SWIFT_ENUM;
+typedef NSString* SDLRPCParameterName NS_TYPED_ENUM;
{% for param in params %}
extern SDLRPCParameterName const SDLRPCParameterName{{ param.name }};
{%- endfor %}
diff --git a/generator/templates/enums/template.h.jinja2 b/generator/templates/enums/template.h.jinja2
index fb811fcd8..3d26960ec 100644
--- a/generator/templates/enums/template.h.jinja2
+++ b/generator/templates/enums/template.h.jinja2
@@ -7,7 +7,7 @@
{%- endblock -%}
{%- block body %}
{% include 'description.jinja2' %}
-typedef SDLEnum {{ name }} SDL_SWIFT_ENUM{{ending}};
+typedef SDLEnum {{ name }} NS_TYPED_ENUM{{ending}};
{%- for param in params %}
{%- include 'description_param.jinja2' %}
extern {{ name }} const {{ name }}{{param.name}}{{ " __deprecated" if param.deprecated and param.deprecated }};
diff --git a/generator/templates/enums/template.m.jinja2 b/generator/templates/enums/template.m.jinja2
index e434bf758..fa82a9e44 100644
--- a/generator/templates/enums/template.m.jinja2
+++ b/generator/templates/enums/template.m.jinja2
@@ -3,7 +3,7 @@
#import "{{name}}.h"
{%- block body %}
{% if add_typedef %}
-typedef SDLEnum {{name}} SDL_SWIFT_ENUM;
+typedef SDLEnum {{name}} NS_TYPED_ENUM;
{% endif -%}
{%- for param in params %}
{{ name }} const {{ name }}{{param.name}} = @"{{param.origin}}";
diff --git a/generator/test/runner.py b/generator/test/runner.py
index 2cb413227..3c2a8231e 100644
--- a/generator/test/runner.py
+++ b/generator/test/runner.py
@@ -57,7 +57,12 @@ def main():
suite.addTests(TestLoader().loadTestsFromTestCase(CodeFormatAndQuality))
runner = TextTestRunner(verbosity=2)
- runner.run(suite)
+ test_results = runner.run(suite)
+
+ if test_results.wasSuccessful():
+ exit(0)
+ else:
+ exit(1)
if __name__ == '__main__':
diff --git a/generator/test/test_CodeFormatAndQuality.py b/generator/test/test_CodeFormatAndQuality.py
index c9b34e06f..affc4affe 100755
--- a/generator/test/test_CodeFormatAndQuality.py
+++ b/generator/test/test_CodeFormatAndQuality.py
@@ -23,7 +23,7 @@ class CodeFormatAndQuality(unittest.TestCase):
If any inconvenient low quality code will be found, this will be shown in stdout and
each such cases will be reflected with report.total_errors number
"""
- style_guide = flake8.get_style_guide(max_line_length=120)
+ style_guide = flake8.get_style_guide(max_line_length=2048)
report = style_guide.check_files(self.list_of_files)
self.assertEqual(report.total_errors, 0)
diff --git a/generator/test/test_enums.py b/generator/test/test_enums.py
index 22650ce67..4e6b52490 100644
--- a/generator/test/test_enums.py
+++ b/generator/test/test_enums.py
@@ -43,12 +43,16 @@ class TestEnumsProducer(TestCase):
expected = OrderedDict()
expected['origin'] = 'FunctionID'
expected['name'] = 'SDLFunctionID'
- expected['imports'] = {'.h': {'SDLEnum'}, '.m': {'SDLEnum'}}
+ expected['imports'] = {
+ '.h': {'SDLEnum'},
+ '.m': ['SDLEnum']
+ }
+ expected['history'] = None
expected['params'] = (
- self.producer.param_named(description=[], name='Reserved', origin='RESERVED', since=None, deprecated=False),
- self.producer.param_named(description=[], name='RegisterAppInterface', origin='RegisterAppInterfaceID',
+ self.producer.param_named(history=None, description=[], name='Reserved', origin='RESERVED', since=None, deprecated=False),
+ self.producer.param_named(history=None, description=[], name='RegisterAppInterface', origin='RegisterAppInterfaceID',
since=None, deprecated=False),
- self.producer.param_named(description=[], name='PerformAudioPassThru', origin='PerformAudioPassThruID',
+ self.producer.param_named(history=None, description=[], name='PerformAudioPassThru', origin='PerformAudioPassThruID',
since=None, deprecated=False),)
actual = self.producer.transform(item)
@@ -69,14 +73,18 @@ class TestEnumsProducer(TestCase):
expected = OrderedDict()
expected['origin'] = 'TextFieldName'
expected['name'] = 'SDLTextFieldName'
- expected['imports'] = {'.h': {'SDLEnum'}, '.m': {'SDLEnum'}}
+ expected['imports'] = {
+ '.h': {'SDLEnum'},
+ '.m': ['SDLEnum']
+ }
+ expected['history'] = None
expected['params'] = (
- self.producer.param_named(description=[], name='Success', origin='SUCCESS', since=None,
+ self.producer.param_named(history=None, description=[], name='Success', origin='SUCCESS', since=None,
deprecated=False),
- self.producer.param_named(description=[], name='MainField1', origin='mainField1', since=None,
+ self.producer.param_named(history=None, description=[], name='MainField1', origin='mainField1', since=None,
deprecated=False),
- self.producer.param_named(description=[], name='H264', origin='H264', since=None, deprecated=False),
- self.producer.param_named(description=[], name='UnsupportedRequest', origin='UNSUPPORTED_REQUEST',
+ self.producer.param_named(history=None, description=[], name='H264', origin='H264', since=None, deprecated=False),
+ self.producer.param_named(history=None, description=[], name='UnsupportedRequest', origin='UNSUPPORTED_REQUEST',
since=None, deprecated=False))
actual = self.producer.transform(item)
diff --git a/generator/test/test_functions.py b/generator/test/test_functions.py
index a271fa23a..ad4dcc6cb 100644
--- a/generator/test/test_functions.py
+++ b/generator/test/test_functions.py
@@ -68,7 +68,8 @@ class TestFunctionsProducer(TestCase):
structs = {
'SoftButton': Struct(name='SoftButton', members={
'image': Param(name='image', param_type=String(), since='1.0.0', description=['image description']),
- 'ignore': Param(name='ignore', param_type=Struct(name='ignore'))}),
+ 'dayColorScheme': Param(name='dayColorScheme', param_type=Struct(name='TemplateColorScheme', description=[
+ '\nA color scheme for all display layout templates.\n']))}),
'PresetBankCapabilities': Struct(name='PresetBankCapabilities', members={
'availableHdChannelsAvailable': Param(name='availableHdChannelsAvailable', param_type=Boolean(),
since='2.0.0',
@@ -89,11 +90,8 @@ class TestFunctionsProducer(TestCase):
self.producer.common_names(description=['availableHDChannelsAvailable description'],
since='2.0.0', name='AvailableHdChannelsAvailable',
origin='availableHdChannelsAvailable'),
- self.producer.common_names(description=[], name='Ignore', origin='ignore', since=None),
+ self.producer.common_names(description=[], name='DayColorScheme', origin='dayColorScheme', since=None),
self.producer.common_names(description=['image description'], name='Image', origin='image', since='1.0.0'),
- self.producer.common_names(description=[], name='PresetBankCapabilities', origin='PresetBankCapabilities',
- since=None),
- self.producer.common_names(description=[], name='SoftButton', origin='SoftButton', since=None),
self.producer.common_names(description=['syncMsgVersion description'], name='SdlMsgVersion',
origin='syncMsgVersion', since='3.5.0')]
actual = self.producer.get_simple_params(functions, structs)
@@ -130,37 +128,58 @@ class TestFunctionsProducer(TestCase):
expected['name'] = 'SDLRegisterAppInterface'
expected['extends_class'] = 'SDLRPCRequest'
expected['imports'] = {
- '.h': {'enum': {'SDLRPCRequest'}, 'struct': {'SDLTemplateColorScheme', 'SDLTTSChunk', 'SDLSdlMsgVersion'}},
- '.m': {'SDLTemplateColorScheme', 'SDLTTSChunk', 'SDLSdlMsgVersion'}}
+ '.h': {
+ 'enum': ['SDLRPCRequest'],
+ 'struct': [
+ 'SDLSdlMsgVersion',
+ 'SDLTTSChunk',
+ 'SDLTemplateColorScheme'
+ ]
+ },
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLRPCFunctionNames',
+ 'SDLRPCParameterNames',
+ 'SDLRegisterAppInterface',
+ 'SDLSdlMsgVersion',
+ 'SDLTTSChunk',
+ 'SDLTemplateColorScheme'
+ ]
+ }
+ expected['history'] = None
expected['description'] = ['Establishes an interface with a mobile application. Before registerAppInterface no '
- 'other commands will be', 'accepted/executed.']
+ 'other commands will be accepted/executed.']
expected['since'] = '1.0.0'
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='sdlMsgVersion', constructor_argument_override=None,
constructor_prefix='SdlMsgVersion', deprecated=False, description=['See SyncMsgVersion'],
for_name='object', mandatory=True, method_suffix='SdlMsgVersion', modifier='strong',
of_class='SDLSdlMsgVersion.class', origin='sdlMsgVersion', since=None,
type_native='SDLSdlMsgVersion *', type_sdl='SDLSdlMsgVersion *'),
self.producer.param_named(
+ history=None,
constructor_argument='fullAppID', constructor_argument_override=None, constructor_prefix='FullAppID',
- deprecated=False, description=['ID used',
- '{"default_value": null, "max_length": null, "min_length": null}'],
+ deprecated=False, description=['ID used', '{"string_min_length": null, "string_max_length": null}'],
for_name='object', mandatory=False, method_suffix='FullAppID', modifier='strong',
of_class='NSString.class', origin='fullAppID', since=None, type_native='NSString *',
type_sdl='NSString *'),
self.producer.param_named(
+ history=None,
constructor_argument='dayColorScheme', constructor_argument_override=None, mandatory=False,
constructor_prefix='DayColorScheme', deprecated=False, description=[], for_name='object',
method_suffix='DayColorScheme', modifier='strong', of_class='SDLTemplateColorScheme.class',
origin='dayColorScheme', since=None, type_native='SDLTemplateColorScheme *',
type_sdl='SDLTemplateColorScheme *'),
self.producer.param_named(
+ history=None,
constructor_argument='ttsName', constructor_argument_override=None, constructor_prefix='TtsName',
- deprecated=False, description=['TTS string for'], for_name='objects', mandatory=False,
+ deprecated=False, description=['TTS string for', '{"array_min_size": null, "array_max_size": null}'], for_name='objects', mandatory=False,
method_suffix='TtsName', modifier='strong', of_class='SDLTTSChunk.class', origin='ttsName', since=None,
type_native='NSArray<SDLTTSChunk *> *', type_sdl='NSArray<SDLTTSChunk *> *'),
self.producer.param_named(
+ history=None,
constructor_argument='isMediaApplication', constructor_argument_override=None,
constructor_prefix='IsMediaApplication', deprecated=False,
description=['Indicates if the application is a media or a'], for_name='object', mandatory=True,
@@ -184,10 +203,10 @@ class TestFunctionsProducer(TestCase):
expected['constructors'] = (
self.producer.constructor_named(
- all=mandatory_arguments, arguments=mandatory_arguments, deprecated=False,
+ all=mandatory_arguments, arguments=mandatory_arguments,
init=mandatory_init, self=True),
self.producer.constructor_named(
- all=mandatory_arguments + not_mandatory_arguments, arguments=not_mandatory_arguments, deprecated=False,
+ all=mandatory_arguments + not_mandatory_arguments, arguments=not_mandatory_arguments,
init=mandatory_init + ' fullAppID:(nullable NSString *)fullAppID dayColorScheme:(nullable '
'SDLTemplateColorScheme *)dayColorScheme ttsName:(nullable NSArray<SDLTTSChunk '
'*> *)ttsName',
@@ -219,24 +238,41 @@ class TestFunctionsProducer(TestCase):
expected['origin'] = 'RegisterAppInterface'
expected['name'] = 'SDLRegisterAppInterfaceResponse'
expected['extends_class'] = 'SDLRPCResponse'
- expected['imports'] = {'.h': {'enum': {'SDLRPCResponse', 'SDLLanguage'}, 'struct': set()},
- '.m': {'SDLLanguage'}}
+ expected['imports'] = {
+ '.h': {
+ 'enum': [
+ 'SDLLanguage',
+ 'SDLRPCResponse'
+ ],
+ 'struct': []},
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLLanguage',
+ 'SDLRPCFunctionNames',
+ 'SDLRPCParameterNames',
+ 'SDLRegisterAppInterface'
+ ]
+ }
+ expected['history'] = None
expected['description'] = ['The response']
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='language', constructor_argument_override=None, constructor_prefix='Language',
deprecated=False, description=['The currently'], for_name='enum', mandatory=False,
method_suffix='Language', modifier='strong', of_class='', origin='language',
since=None, type_native='SDLLanguage ', type_sdl='SDLLanguage '),
self.producer.param_named(
+ history=None,
constructor_argument='supportedDiagModes', constructor_argument_override=None,
- constructor_prefix='SupportedDiagModes', deprecated=False, description=['Specifies the'],
+ constructor_prefix='SupportedDiagModes', deprecated=False, description=['Specifies the', '{"array_min_size": 1, "array_max_size": 100, "num_min_value": 0, "num_max_value": 255}'],
for_name='objects', mandatory=False, method_suffix='SupportedDiagModes', modifier='strong',
of_class='NSNumber.class', origin='supportedDiagModes', since=None,
type_native='NSArray<NSNumber<SDLUInt> *> *', type_sdl='NSArray<NSNumber<SDLUInt> *> *'),
self.producer.param_named(
+ history=None,
constructor_argument='hmiZoneCapabilities', constructor_argument_override=None,
- constructor_prefix='HmiZoneCapabilities', deprecated=False, description=[], for_name='enums',
+ constructor_prefix='HmiZoneCapabilities', deprecated=False, description=['{"array_min_size": 1, "array_max_size": 100}'], for_name='enums',
mandatory=False, method_suffix='HmiZoneCapabilities', modifier='strong',
of_class='', origin='hmiZoneCapabilities', since=None,
type_native='NSArray<SDLHmiZoneCapabilities> *', type_sdl='NSArray<SDLHmiZoneCapabilities> *'))
@@ -252,7 +288,7 @@ class TestFunctionsProducer(TestCase):
expected['constructors'] = (
self.producer.constructor_named(
- all=arguments, arguments=arguments, deprecated=False,
+ all=arguments, arguments=arguments,
init='Language:(nullable SDLLanguage)language supportedDiagModes:(nullable NSArray<NSNumber<SDLUInt> *>'
' *)supportedDiagModes hmiZoneCapabilities:(nullable NSArray<SDLHmiZoneCapabilities> *)'
'hmiZoneCapabilities',
@@ -275,11 +311,20 @@ class TestFunctionsProducer(TestCase):
expected['name'] = 'SDLOnHMIStatus'
expected['extends_class'] = 'SDLRPCNotification'
expected['imports'] = {
- ".h": {'enum': {'SDLRPCNotification'}, 'struct': set()},
- ".m": set()
+ ".h": {
+ 'enum': ['SDLRPCNotification'],
+ 'struct': []},
+ ".m": [
+ 'NSMutableDictionary+Store',
+ 'SDLOnHMIStatus',
+ 'SDLRPCFunctionNames',
+ 'SDLRPCParameterNames'
+ ]
}
+ expected['history'] = None
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='hmiLevel', constructor_argument_override=None, constructor_prefix='HmiLevel',
deprecated=False, description=[], for_name='enum', mandatory=True, method_suffix='HmiLevel',
modifier='strong', of_class='', origin='hmiLevel', since=None,
@@ -289,7 +334,7 @@ class TestFunctionsProducer(TestCase):
constructor_argument='hmiLevel')]
expected['constructors'] = (self.producer.constructor_named(
- all=arguments, arguments=arguments, deprecated=False, self=True, init='HmiLevel:(SDLHMILevel)hmiLevel'),)
+ all=arguments, arguments=arguments, self=True, init='HmiLevel:(SDLHMILevel)hmiLevel'),)
actual = self.producer.transform(item)
self.assertDictEqual(expected, actual)
@@ -314,39 +359,56 @@ class TestFunctionsProducer(TestCase):
expected['origin'] = 'CreateWindow'
expected['name'] = 'SDLCreateWindow'
expected['extends_class'] = 'SDLRPCRequest'
- expected['imports'] = {'.m': set(), '.h': {'struct': set(), 'enum': {'SDLRPCRequest'}}}
+ expected['imports'] = {
+ '.h': {
+ 'struct': [],
+ 'enum': ['SDLRPCRequest']},
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLCreateWindow',
+ 'SDLRPCFunctionNames',
+ 'SDLRPCParameterNames'
+ ]
+ }
+ expected['history'] = None
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='windowID', constructor_argument_override=None, constructor_prefix='WindowID',
- deprecated=False, description=['{"default_value": null, "max_value": null, "min_value": null}'],
+ deprecated=False, description=['{"num_min_value": null, "num_max_value": null}'],
for_name='object', mandatory=True, method_suffix='WindowID', modifier='strong',
of_class='NSNumber.class', origin='windowID', since=None, type_native='UInt32',
type_sdl='NSNumber<SDLInt> *'),
self.producer.param_named(
+ history=None,
constructor_argument='cmdID', constructor_argument_override=None, constructor_prefix='CmdID',
- deprecated=False, description=['{"default_value": null, "max_value": 2000000000, "min_value": 0}'],
+ deprecated=False, description=['{"num_min_value": 0, "num_max_value": 2000000000}'],
for_name='object', mandatory=True, method_suffix='CmdID', modifier='strong', of_class='NSNumber.class',
origin='cmdID', since=None, type_native='UInt32', type_sdl='NSNumber<SDLUInt> *'),
self.producer.param_named(
+ history=None,
constructor_argument='position', constructor_argument_override=None, constructor_prefix='Position',
- deprecated=False, description=['{"default_value": 1000, "max_value": 1000, "min_value": 0}'],
+ deprecated=False, description=['{"num_min_value": 0, "num_max_value": 1000, "default_value": 1000}'],
for_name='object', mandatory=True, method_suffix='Position', modifier='strong',
of_class='NSNumber.class', origin='position', since=None, type_native='UInt16',
type_sdl='NSNumber<SDLUInt> *'),
self.producer.param_named(
+ history=None,
constructor_argument='speed', constructor_argument_override=None, constructor_prefix='Speed',
- deprecated=False, description=['{"default_value": null, "max_value": 700.0, "min_value": 0.0}'],
+ deprecated=False, description=['{"num_min_value": 0.0, "num_max_value": 700.0}'],
for_name='object', mandatory=True, method_suffix='Speed', modifier='strong', of_class='NSNumber.class',
origin='speed', since=None, type_native='float', type_sdl='NSNumber<SDLFloat> *'),
self.producer.param_named(
+ history=None,
constructor_argument='offset', constructor_argument_override=None, constructor_prefix='Offset',
- deprecated=False, description=['{"default_value": null, "max_value": 100000000000, "min_value": 0}'],
+ deprecated=False, description=['{"num_min_value": 0, "num_max_value": 100000000000}'],
for_name='object', mandatory=True, method_suffix='Offset', modifier='strong', of_class='NSNumber.class',
origin='offset', since=None, type_native='UInt64', type_sdl='NSNumber<SDLUInt> *'),
self.producer.param_named(
+ history=None,
constructor_argument='duplicateUpdatesFromWindowID', constructor_argument_override=None,
constructor_prefix='DuplicateUpdatesFromWindowID', deprecated=False,
- description=['{"default_value": null, "max_value": null, "min_value": null}'], for_name='object',
+ description=['{"num_min_value": null, "num_max_value": null}'], for_name='object',
mandatory=False, method_suffix='DuplicateUpdatesFromWindowID', modifier='strong',
of_class='NSNumber.class', origin='duplicateUpdatesFromWindowID', since=None,
type_native='NSNumber<SDLInt> *', type_sdl='NSNumber<SDLInt> *'))
@@ -368,12 +430,12 @@ class TestFunctionsProducer(TestCase):
expected['constructors'] = (
self.producer.constructor_named(
- all=not_mandatory_arguments, arguments=not_mandatory_arguments, deprecated=False, self=True,
+ all=not_mandatory_arguments, arguments=not_mandatory_arguments, self=True,
init='WindowID:(UInt32)windowID cmdID:(UInt32)cmdID position:(UInt16)position speed:(float)speed '
'offset:(UInt64)offset'),
self.producer.constructor_named(
all=not_mandatory_arguments + mandatory_arguments, arguments=mandatory_arguments,
- deprecated=False, self='WindowID:windowID cmdID:cmdID position:position speed:speed offset:offset',
+ self='WindowID:windowID cmdID:cmdID position:position speed:speed offset:offset',
init='WindowID:(UInt32)windowID cmdID:(UInt32)cmdID position:(UInt16)position speed:(float)speed '
'offset:(UInt64)offset duplicateUpdatesFromWindowID:(nullable NSNumber<SDLInt> *)'
'duplicateUpdatesFromWindowID'))
@@ -395,11 +457,24 @@ class TestFunctionsProducer(TestCase):
expected['origin'] = 'CreateInteractionChoiceSet'
expected['name'] = 'SDLCreateInteractionChoiceSet'
expected['extends_class'] = 'SDLRPCRequest'
- expected['imports'] = {'.m': {'SDLChoice'}, '.h': {'struct': {'SDLChoice'}, 'enum': {'SDLRPCRequest'}}}
+ expected['imports'] = {
+ '.h': {
+ 'struct': ['SDLChoice'],
+ 'enum': ['SDLRPCRequest']},
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLChoice',
+ 'SDLCreateInteractionChoiceSet',
+ 'SDLRPCFunctionNames',
+ 'SDLRPCParameterNames'
+ ]
+ }
+ expected['history'] = None
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='choiceSet', constructor_argument_override=None,
- constructor_prefix='ChoiceSet', deprecated=False, description=[], for_name='objects', mandatory=True,
+ constructor_prefix='ChoiceSet', deprecated=False, description=['{"array_min_size": null, "array_max_size": null}'], for_name='objects', mandatory=True,
method_suffix='ChoiceSet', modifier='strong', of_class='SDLChoice.class', origin='choiceSet',
since=None, type_native='NSArray<SDLChoice *> *', type_sdl='NSArray<SDLChoice *> *'),)
@@ -408,7 +483,7 @@ class TestFunctionsProducer(TestCase):
origin='choiceSet')]
expected['constructors'] = (self.producer.constructor_named(
- all=argument, arguments=argument, deprecated=False, self=True,
+ all=argument, arguments=argument, self=True,
init='ChoiceSet:(NSArray<SDLChoice *> *)choiceSet'),)
actual = self.producer.transform(item)
@@ -432,15 +507,26 @@ class TestFunctionsProducer(TestCase):
expected['origin'] = 'SetDisplayLayout'
expected['name'] = 'SDLSetDisplayLayout'
expected['extends_class'] = 'SDLRPCRequest'
- expected['imports'] = {'.h': {'enum': {'SDLRPCRequest'}, 'struct': set()}, '.m': set()}
- expected['since'] = '6.0.0'
+ expected['imports'] = {
+ '.h': {
+ 'enum': ['SDLRPCRequest'],
+ 'struct': []},
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLRPCFunctionNames',
+ 'SDLRPCParameterNames',
+ 'SDLSetDisplayLayout'
+ ]
+ }
expected['history'] = '3.0.0'
+ expected['since'] = '6.0.0'
expected['deprecated'] = True
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='displayLayout', constructor_argument_override=None,
constructor_prefix='DisplayLayout', deprecated=False,
- description=['{"default_value": null, "max_length": 500, "min_length": 1}'], for_name='object',
+ description=['{"string_min_length": 1, "string_max_length": 500}'], for_name='object',
mandatory=True, method_suffix='DisplayLayout', modifier='strong', of_class='NSString.class',
origin='displayLayout', since=None, type_native='NSString *', type_sdl='NSString *'),)
@@ -449,7 +535,7 @@ class TestFunctionsProducer(TestCase):
constructor_argument='displayLayout', origin='displayLayout')]
expected['constructors'] = (self.producer.constructor_named(
- all=argument, arguments=argument, deprecated=False, self=True,
+ all=argument, arguments=argument, self=True,
init='DisplayLayout:(NSString *)displayLayout'),)
actual = self.producer.transform(item)
diff --git a/generator/test/test_structs.py b/generator/test/test_structs.py
index 61ea23702..0c33ebf3f 100644
--- a/generator/test/test_structs.py
+++ b/generator/test/test_structs.py
@@ -44,16 +44,29 @@ class TestStructsProducer(TestCase):
expected['origin'] = 'CloudAppProperties'
expected['name'] = 'SDLCloudAppProperties'
expected['extends_class'] = 'SDLRPCStruct'
- expected['imports'] = {'.m': set(), '.h': {'enum': {'SDLRPCStruct'}, 'struct': set()}}
+ expected['imports'] = {
+ '.h': {
+ 'enum': ['SDLRPCStruct'],
+ 'struct': []
+ },
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLCloudAppProperties',
+ 'SDLRPCParameterNames'
+ ]
+ }
+ expected['history'] = None
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='appID', constructor_argument_override=None, constructor_prefix='AppID',
- deprecated=False, description=['{"default_value": null, "max_length": null, "min_length": null}'],
+ deprecated=False, description=['{"string_min_length": null, "string_max_length": null}'],
for_name='object', mandatory=True, method_suffix='AppID', modifier='strong', of_class='NSString.class',
origin='appID', since=None, type_native='NSString *', type_sdl='NSString *'),
self.producer.param_named(
+ history=None,
constructor_argument='valueParam', constructor_argument_override=None, constructor_prefix='ValueParam',
- deprecated=False, description=['{"default_value": null, "max_length": null, "min_length": null}'],
+ deprecated=False, description=['{"string_min_length": null, "string_max_length": null}'],
for_name='object', mandatory=True, method_suffix='ValueParam', modifier='strong',
of_class='NSString.class', origin='valueParam', since=None, type_native='NSString *',
type_sdl='NSString *')
@@ -67,7 +80,7 @@ class TestStructsProducer(TestCase):
]
expected['constructors'] = (self.producer.constructor_named(
- all=argument, arguments=argument, deprecated=False, self='',
+ all=argument, arguments=argument, self='',
init='AppID:(NSString *)appID valueParam:(NSString *)valueParam'),)
actual = self.producer.transform(item)
@@ -85,12 +98,24 @@ class TestStructsProducer(TestCase):
expected['origin'] = 'TouchEvent'
expected['name'] = 'SDLTouchEvent'
expected['extends_class'] = 'SDLRPCStruct'
- expected['imports'] = {'.h': {'enum': {'SDLRPCStruct'}, 'struct': set()}, '.m': set()}
+ expected['imports'] = {
+ '.h': {
+ 'enum': ['SDLRPCStruct'],
+ 'struct': []
+ },
+ '.m': [
+ 'NSMutableDictionary+Store',
+ 'SDLRPCParameterNames',
+ 'SDLTouchEvent'
+ ]
+ }
+ expected['history'] = None
expected['params'] = (
self.producer.param_named(
+ history=None,
constructor_argument='idParam', constructor_argument_override=None,
constructor_prefix='IdParam', deprecated=False,
- description=['{"default_value": null, "max_value": 9, "min_value": 0}'], for_name='object',
+ description=['{"num_min_value": 0, "num_max_value": 9}'], for_name='object',
mandatory=True, method_suffix='IdParam', modifier='strong', of_class='NSNumber.class',
origin='idParam', since=None, type_native='UInt8', type_sdl='NSNumber<SDLUInt> *'),)
@@ -99,7 +124,7 @@ class TestStructsProducer(TestCase):
constructor_argument='@(idParam)', origin='idParam')]
expected['constructors'] = (self.producer.constructor_named(
- all=argument, arguments=argument, deprecated=False, self='',
+ all=argument, arguments=argument, self='',
init='IdParam:(UInt8)idParam'),)
actual = self.producer.transform(item)
diff --git a/generator/transformers/common_producer.py b/generator/transformers/common_producer.py
index 63a7134bb..3a591a05d 100644
--- a/generator/transformers/common_producer.py
+++ b/generator/transformers/common_producer.py
@@ -69,11 +69,11 @@ class InterfaceProducerCommon(ABC):
render['params'][param.name] = self.extract_param(param, item.name)
if isinstance(item, (Struct, Function)):
self.extract_imports(param, render['imports'])
-
+
# Add additional known imports to the import list
if isinstance(item, (Struct, Function)):
name = 'SDL' + item.name
- render[importsKey]['.m'].add( "NSMutableDictionary+Store" )
+ render[importsKey]['.m'].add("NSMutableDictionary+Store")
render[importsKey]['.m'].add(name)
render[importsKey]['.h'][enumKey] = list(render[importsKey]['.h'][enumKey])
(render[importsKey]['.h'][enumKey]).sort()
@@ -82,11 +82,11 @@ class InterfaceProducerCommon(ABC):
if isinstance(item, Struct):
name = 'SDL' + item.name
- render[importsKey]['.m'].add( "SDLRPCParameterNames" )
+ render[importsKey]['.m'].add("SDLRPCParameterNames")
if isinstance(item, Function):
- render[importsKey]['.m'].add( "SDLRPCFunctionNames" )
- render[importsKey]['.m'].add( "SDLRPCParameterNames" )
+ render[importsKey]['.m'].add("SDLRPCFunctionNames")
+ render[importsKey]['.m'].add("SDLRPCParameterNames")
# Sort the import list to ensure they appear in alphabetical order in the template
render[importsKey]['.m'] = list(render[importsKey]['.m'])
@@ -364,20 +364,28 @@ class InterfaceProducerCommon(ABC):
'mandatory': param.is_mandatory,
'deprecated': json.loads(param.deprecated.lower()) if param.deprecated else False,
'modifier': 'strong',
- 'history' : param.history }
+ 'history': param.history}
+
+ parameterItems = OrderedDict()
if isinstance(param.param_type, (Integer, Float, String, Array)):
- data['description'].append(self.create_param_descriptor(param.param_type, OrderedDict()))
+ self.create_param_type_descriptor(param.param_type, parameterItems)
+
+ if isinstance(param.param_type, (Boolean, Enum)):
+ self.create_param_default_value_descriptor(param, parameterItems)
+
+ if len(parameterItems) > 0:
+ data['description'].append(json.dumps(parameterItems, sort_keys=False))
data.update(self.extract_type(param))
data.update(self.param_origin_change(param.name))
return self.param_named(**data)
- def create_param_descriptor(self, param_type, parameterItems):
+ def create_param_type_descriptor(self, param_type, parameterItems):
"""
- Recursively creates a documentation string of all the descriptors for a parameter (e.g. {"string_min_length": 1, string_max_length": 500}). The parameters should be returned in the same order they were added to the parameterItems dictionary
+ Gets all the descriptors for a parameter to be used in parameter's documentation (e.g. {"string_min_length": 1, string_max_length": 500}). The parameters should be returned in the same order they were added to the parameterItems dictionary
:param param_type: param_type from the initial Model
:param parameterItems: Ordered dictionary that stores each of the parameter's descriptors
- :return: All the descriptor params from param_type concatenated into one string
+ :return: All the descriptor params
"""
# The key is a descriptor (i.e. max_value) and value is the associated value (i.e. 100). Some values will be dictionaries that have to be parsed to get additional descriptors (e.g. the value for an array of strings' data type will be sub-dictionary describing the min_length, max_length, and default value for the strings used in the array)
for key, value in param_type.__dict__.items():
@@ -387,7 +395,7 @@ class InterfaceProducerCommon(ABC):
# Skip adding documentation for the data type if it is a struct or enum. This is unnecessary as each enum or struct has its own documentation
continue
else:
- self.create_param_descriptor(value, parameterItems)
+ self.create_param_type_descriptor(value, parameterItems)
else:
if key == 'default_value' and value is None:
# Do not add the default_value key/value pair unless it has been explicitly set in the RPC Spec
@@ -396,7 +404,24 @@ class InterfaceProducerCommon(ABC):
parameterDescriptor = self.update_param_descriptor(key)
parameterItems[parameterDescriptor] = value
- return json.dumps(parameterItems, sort_keys=False)
+ return parameterItems
+
+ def create_param_default_value_descriptor(self, param, parameterItems):
+ """
+ Extracts the default value for a parameter to be used in parameter's documentation (HAX: The default_value for Ints and Floats is save to both the param and param_type but is only saved to the param_type for Enums and Bools for some reason)
+ :param param: param from the initial Model
+ :param parameterItems: Ordered dictionary that stores each of the parameter's descriptors
+ :return: All the descriptor params
+ """
+ if param.default_value is None:
+ return parameterItems
+
+ if isinstance(param.param_type, Enum):
+ parameterItems['default_value'] = param.default_value.name
+ else:
+ parameterItems['default_value'] = param.default_value
+
+ return parameterItems
def update_param_descriptor(self, parameterName):
"""
@@ -418,4 +443,3 @@ class InterfaceProducerCommon(ABC):
return 'num_min_value'
else:
return parameterName
-
diff --git a/generator/transformers/functions_producer.py b/generator/transformers/functions_producer.py
index 73091fe12..eaf84bf55 100644
--- a/generator/transformers/functions_producer.py
+++ b/generator/transformers/functions_producer.py
@@ -88,17 +88,15 @@ class FunctionsProducer(InterfaceProducerCommon):
"""
origin = element.name
name = self._replace_sync(element.name)
- # if isinstance(element.param_type, (Integer, Float, Boolean, String)):
return {name: self.common_names(**{
'name': self.title(name),
'origin': origin,
'description': self.extract_description(element.description),
'since': element.since})}
- # return OrderedDict()
def get_simple_params(self, functions: dict, structs: dict) -> dict:
"""
- Standalone method used for preparing SDLRPCParameterNames collection ready to be applied to Jinja2 template
+ Creates a list of all parameter names used in functions and structs. This list is used by a Jinja2 template to generate the SDLRPCParameterNames class.
:param functions: collection with all functions from initial Model
:param structs: collection with all structs from initial Model
:return: collection with transformed element ready to be applied to Jinja2 template
@@ -110,8 +108,8 @@ class FunctionsProducer(InterfaceProducerCommon):
render.update(self.evaluate(param))
for struct in structs.values():
- render.update(self.evaluate(struct))
for param in struct.members.values():
render.update(self.evaluate(param))
+
unique = dict(zip(list(map(lambda l: l.name, render.values())), render.values()))
return {'params': sorted(unique.values(), key=lambda a: a.name)}