summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleonid lokhmatov, Luxoft <zaqqqqqqqq@gmail.com>2020-08-14 12:42:01 +0300
committerleonid lokhmatov, Luxoft <zaqqqqqqqq@gmail.com>2020-08-14 12:42:01 +0300
commit34da0b939a64c8ead92b1b46a4100a5e1eda5037 (patch)
tree39df7ec63245e667a524e6e69a60879a22098309
parent9de7356914ad6250d57a809bfd78848bdc8dde6e (diff)
downloadsdl_ios-34da0b939a64c8ead92b1b46a4100a5e1eda5037.tar.gz
Merge branch 'feature/0266_vehicle_data_GearStatus' into develop, resolve conflicts. (w tmp branch _0266_tmp)
-rw-r--r--.github/workflows/test.yml15
-rw-r--r--CHANGELOG.md52
-rw-r--r--Example Apps/Example ObjC/ProxyManager.m71
-rw-r--r--Example Apps/Example ObjC/RPCPermissionsManager.m41
-rw-r--r--Example Apps/Example ObjC/VehicleDataManager.m10
-rw-r--r--Example Apps/Example Swift/ProxyManager.swift82
-rw-r--r--Example Apps/Example Swift/RPCPermissionsManager.swift56
-rw-r--r--README.md162
-rw-r--r--SmartDeviceLink-iOS.podspec32
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj336
-rw-r--r--SmartDeviceLink.podspec8
-rw-r--r--SmartDeviceLink/SDLAddSubMenu.h65
-rw-r--r--SmartDeviceLink/SDLAddSubMenu.m62
-rw-r--r--SmartDeviceLink/SDLAppHMIType.h8
-rw-r--r--SmartDeviceLink/SDLAppHMIType.m1
-rw-r--r--SmartDeviceLink/SDLAppInterfaceUnregisteredReason.h6
-rw-r--r--SmartDeviceLink/SDLAppInterfaceUnregisteredReason.m1
-rw-r--r--SmartDeviceLink/SDLCapacityUnit.h48
-rw-r--r--SmartDeviceLink/SDLCapacityUnit.m37
-rw-r--r--SmartDeviceLink/SDLCharacterSet.h89
-rw-r--r--SmartDeviceLink/SDLCharacterSet.m53
-rw-r--r--SmartDeviceLink/SDLChoiceSetManager.m33
-rw-r--r--SmartDeviceLink/SDLConfiguration.h55
-rw-r--r--SmartDeviceLink/SDLConfiguration.m28
-rw-r--r--SmartDeviceLink/SDLConnectionManagerType.h15
-rw-r--r--SmartDeviceLink/SDLDriverDistractionCapability.h63
-rw-r--r--SmartDeviceLink/SDLDriverDistractionCapability.m69
-rw-r--r--SmartDeviceLink/SDLEncryptionConfiguration.h2
-rw-r--r--SmartDeviceLink/SDLEncryptionLifecycleManager.h8
-rw-r--r--SmartDeviceLink/SDLEncryptionLifecycleManager.m119
-rw-r--r--SmartDeviceLink/SDLError.h6
-rw-r--r--SmartDeviceLink/SDLError.m18
-rw-r--r--SmartDeviceLink/SDLErrorConstants.h22
-rw-r--r--SmartDeviceLink/SDLFuelRange.h37
-rw-r--r--SmartDeviceLink/SDLFuelRange.m49
-rw-r--r--SmartDeviceLink/SDLGetVehicleData.h27
-rw-r--r--SmartDeviceLink/SDLGetVehicleData.m42
-rw-r--r--SmartDeviceLink/SDLGetVehicleDataResponse.h16
-rw-r--r--SmartDeviceLink/SDLGetVehicleDataResponse.m14
-rw-r--r--SmartDeviceLink/SDLGlobals.h5
-rw-r--r--SmartDeviceLink/SDLGlobals.m11
-rw-r--r--SmartDeviceLink/SDLH264VideoEncoder.m168
-rw-r--r--SmartDeviceLink/SDLHMICapabilities.h54
-rw-r--r--SmartDeviceLink/SDLHMICapabilities.m58
-rw-r--r--SmartDeviceLink/SDLIAPControlSession.m80
-rw-r--r--SmartDeviceLink/SDLIAPDataSession.m140
-rw-r--r--SmartDeviceLink/SDLIAPSession.h7
-rw-r--r--SmartDeviceLink/SDLIAPSession.m2
-rw-r--r--SmartDeviceLink/SDLIAPTransport.m73
-rw-r--r--SmartDeviceLink/SDLImageField+ScreenManagerExtensions.h2
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.h6
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.m256
-rw-r--r--SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.h28
-rw-r--r--SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.m94
-rw-r--r--SmartDeviceLink/SDLLifecycleProtocolHandler.h38
-rw-r--r--SmartDeviceLink/SDLLifecycleProtocolHandler.m215
-rw-r--r--SmartDeviceLink/SDLLifecycleRPCAdapter.h29
-rw-r--r--SmartDeviceLink/SDLLifecycleRPCAdapter.m164
-rw-r--r--SmartDeviceLink/SDLLifecycleSyncPDataHandler.h29
-rw-r--r--SmartDeviceLink/SDLLifecycleSyncPDataHandler.m153
-rw-r--r--SmartDeviceLink/SDLLifecycleSystemRequestHandler.h29
-rw-r--r--SmartDeviceLink/SDLLifecycleSystemRequestHandler.m336
-rw-r--r--SmartDeviceLink/SDLLockScreenManager.h4
-rw-r--r--SmartDeviceLink/SDLLockScreenManager.m11
-rw-r--r--SmartDeviceLink/SDLLockScreenStatusManager.h4
-rw-r--r--SmartDeviceLink/SDLLockScreenStatusManager.m51
-rw-r--r--SmartDeviceLink/SDLLogFileModuleMap.m14
-rw-r--r--SmartDeviceLink/SDLManager.h9
-rw-r--r--SmartDeviceLink/SDLManager.m9
-rw-r--r--SmartDeviceLink/SDLMenuManager.m2
-rw-r--r--SmartDeviceLink/SDLMenuParams.m4
-rw-r--r--SmartDeviceLink/SDLNotificationConstants.h20
-rw-r--r--SmartDeviceLink/SDLNotificationConstants.m303
-rw-r--r--SmartDeviceLink/SDLNotificationDispatcher.h4
-rw-r--r--SmartDeviceLink/SDLNotificationDispatcher.m677
-rw-r--r--SmartDeviceLink/SDLOnVehicleData.h20
-rw-r--r--SmartDeviceLink/SDLOnVehicleData.m14
-rw-r--r--SmartDeviceLink/SDLPermissionConstants.h18
-rw-r--r--SmartDeviceLink/SDLPermissionElement.h42
-rw-r--r--SmartDeviceLink/SDLPermissionElement.m41
-rw-r--r--SmartDeviceLink/SDLPermissionFilter.h40
-rw-r--r--SmartDeviceLink/SDLPermissionFilter.m41
-rw-r--r--SmartDeviceLink/SDLPermissionManager.h29
-rw-r--r--SmartDeviceLink/SDLPermissionManager.m143
-rw-r--r--SmartDeviceLink/SDLPolicyDataParser.h35
-rw-r--r--SmartDeviceLink/SDLPolicyDataParser.m143
-rw-r--r--SmartDeviceLink/SDLPredefinedLayout.h9
-rw-r--r--SmartDeviceLink/SDLPredefinedLayout.m1
-rw-r--r--SmartDeviceLink/SDLProtocol.h39
-rw-r--r--SmartDeviceLink/SDLProtocol.m279
-rw-r--r--SmartDeviceLink/SDLProtocolDelegate.h98
-rw-r--r--SmartDeviceLink/SDLProtocolListener.h97
-rw-r--r--SmartDeviceLink/SDLProtocolReceivedMessageRouter.h6
-rw-r--r--SmartDeviceLink/SDLProtocolReceivedMessageRouter.m48
-rw-r--r--SmartDeviceLink/SDLProxy.h141
-rw-r--r--SmartDeviceLink/SDLProxy.m1083
-rw-r--r--SmartDeviceLink/SDLProxyListener.h1261
-rw-r--r--SmartDeviceLink/SDLPutFile.h9
-rw-r--r--SmartDeviceLink/SDLPutFile.m11
-rw-r--r--SmartDeviceLink/SDLRPCMessageType.h14
-rw-r--r--SmartDeviceLink/SDLRPCMessageType.m13
-rw-r--r--SmartDeviceLink/SDLRPCParameterNames.h44
-rw-r--r--SmartDeviceLink/SDLRPCParameterNames.m41
-rw-r--r--SmartDeviceLink/SDLRPCPermissionStatus.h48
-rw-r--r--SmartDeviceLink/SDLRPCPermissionStatus.m34
-rw-r--r--SmartDeviceLink/SDLResponseDispatcher.m24
-rw-r--r--SmartDeviceLink/SDLScreenManager.h56
-rw-r--r--SmartDeviceLink/SDLScreenManager.m29
-rw-r--r--SmartDeviceLink/SDLSecondaryTransportManager.h12
-rw-r--r--SmartDeviceLink/SDLSecondaryTransportManager.m253
-rw-r--r--SmartDeviceLink/SDLSoftButtonReplaceOperation.m125
-rw-r--r--SmartDeviceLink/SDLStreamingAudioLifecycleManager.h9
-rw-r--r--SmartDeviceLink/SDLStreamingAudioLifecycleManager.m27
-rw-r--r--SmartDeviceLink/SDLStreamingMediaManager.h16
-rw-r--r--SmartDeviceLink/SDLStreamingMediaManager.m64
-rw-r--r--SmartDeviceLink/SDLStreamingProtocolDelegate.h9
-rw-r--r--SmartDeviceLink/SDLStreamingVideoLifecycleManager.h9
-rw-r--r--SmartDeviceLink/SDLStreamingVideoLifecycleManager.m29
-rw-r--r--SmartDeviceLink/SDLSubscribeButtonManager.h75
-rw-r--r--SmartDeviceLink/SDLSubscribeButtonManager.m298
-rw-r--r--SmartDeviceLink/SDLSubscribeButtonObserver.h42
-rw-r--r--SmartDeviceLink/SDLSubscribeButtonObserver.m45
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleData.h24
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleData.m37
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleDataResponse.h16
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleDataResponse.m14
-rwxr-xr-xSmartDeviceLink/SDLSystemCapability.h57
-rwxr-xr-xSmartDeviceLink/SDLSystemCapability.m67
-rw-r--r--SmartDeviceLink/SDLSystemCapabilityManager.h27
-rw-r--r--SmartDeviceLink/SDLSystemCapabilityManager.m305
-rwxr-xr-xSmartDeviceLink/SDLSystemCapabilityType.h43
-rwxr-xr-xSmartDeviceLink/SDLSystemCapabilityType.m1
-rw-r--r--SmartDeviceLink/SDLTCPTransport.m100
-rw-r--r--SmartDeviceLink/SDLTextField+ScreenManagerExtensions.m2
-rw-r--r--SmartDeviceLink/SDLTextField.h6
-rw-r--r--SmartDeviceLink/SDLTimer.h6
-rw-r--r--SmartDeviceLink/SDLTimer.m2
-rw-r--r--SmartDeviceLink/SDLTouch.h4
-rw-r--r--SmartDeviceLink/SDLTouchManager.m1
-rw-r--r--SmartDeviceLink/SDLTransportType.h2
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleData.h20
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleData.m47
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h16
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m14
-rw-r--r--SmartDeviceLink/SDLVehicleDataType.h10
-rw-r--r--SmartDeviceLink/SDLVehicleDataType.m1
-rw-r--r--SmartDeviceLink/SDLWindowCapability.h4
-rw-r--r--SmartDeviceLink/SmartDeviceLink.h3
-rw-r--r--SmartDeviceLink/TestSubscribeButtonObserver.h34
-rw-r--r--SmartDeviceLink/TestSubscribeButtonObserver.m70
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m24
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m6
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFakeSecurityManager.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m8
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m80
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m88
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m233
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleRPCAdapterSpec.m306
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSyncPDataHandlerSpec.m78
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m235
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m66
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m176
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m262
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonStateSpec.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m43
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m72
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m2
-rw-r--r--SmartDeviceLinkTests/Notifications/SDLNotificationDispatcherSpec.m140
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m297
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m223
-rw-r--r--SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m154
-rw-r--r--SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m773
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppHMITypeSpec.m1
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppInterfaceUnregisteredReasonSpec.m1
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCapacityUnitSpec.m21
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCharacterSetSpec.m6
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLPredefinedLayoutSpec.m1
-rwxr-xr-xSmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSystemCapabilityTypeSpec.m3
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m6
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m68
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m217
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m45
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m150
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m64
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m6
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m273
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m258
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m188
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m307
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m295
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDriverDistractionCapabilitySpec.m60
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m76
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m69
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m4
-rwxr-xr-xSmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m45
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m2
-rw-r--r--SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m76
-rw-r--r--SmartDeviceLinkTests/SDLPermissionElementSpec.m59
-rw-r--r--SmartDeviceLinkTests/SDLRPCPermissionStatusSpec.m43
-rw-r--r--SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m246
-rw-r--r--SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m204
-rw-r--r--SmartDeviceLinkTests/SDLSubscribeButtonManagerSpec.m787
-rw-r--r--SmartDeviceLinkTests/SDLSubscribeButtonObserverSpec.m64
-rw-r--r--SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m5
-rw-r--r--SmartDeviceLinkTests/TestMultipleFilesConnectionManager.m2
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m4
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/TCP/SDLTCPTransportSpec.m98
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m2
-rw-r--r--SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m42
-rw-r--r--SmartDeviceLink_Example/SubscribeButtonManager.h25
-rw-r--r--SmartDeviceLink_Example/SubscribeButtonManager.m69
-rw-r--r--SmartDeviceLink_Example/SubscribeButtonManager.swift53
-rw-r--r--docs/Classes.html40
-rw-r--r--docs/Classes/SDLAppServiceManifest.html4
-rw-r--r--docs/Classes/SDLButtonPress.html38
-rw-r--r--docs/Classes/SDLConfiguration.html190
-rw-r--r--docs/Classes/SDLDiagnosticMessage.html4
-rw-r--r--docs/Classes/SDLDiagnosticMessageResponse.html4
-rw-r--r--docs/Classes/SDLEncryptionConfiguration.html4
-rw-r--r--docs/Classes/SDLGetInteriorVehicleDataConsentResponse.html6
-rw-r--r--docs/Classes/SDLManager.html20
-rw-r--r--docs/Classes/SDLPerformInteraction.html4
-rw-r--r--docs/Classes/SDLPermissionElement.html85
-rw-r--r--docs/Classes/SDLPermissionManager.html179
-rw-r--r--docs/Classes/SDLPutFile.html23
-rw-r--r--docs/Classes/SDLRPCPermissionStatus.html109
-rw-r--r--docs/Classes/SDLReadDID.html22
-rw-r--r--docs/Classes/SDLRegisterAppInterfaceResponse.html4
-rw-r--r--docs/Classes/SDLScreenManager.html105
-rw-r--r--docs/Classes/SDLStreamingMediaManager.html38
-rw-r--r--docs/Classes/SDLTouchEvent.html4
-rw-r--r--docs/Classes/SDLTouchManager.html43
-rw-r--r--docs/Constants.html195
-rw-r--r--docs/Enums.html99
-rw-r--r--docs/Enums/SDLAudioStreamManagerError.html2
-rw-r--r--docs/Enums/SDLCacheFileManagerError.html2
-rw-r--r--docs/Enums/SDLSoftButtonManagerError.html2
-rw-r--r--docs/Enums/SDLSubscribeButtonManagerError.html33
-rw-r--r--docs/Enums/SDLSystemCapabilityManagerError.html8
-rw-r--r--docs/Enums/SDLTouchIdentifier.html (renamed from docs/Type Definitions/SDLTouchIdentifier/.html)8
-rw-r--r--docs/Protocols/SDLManagerDelegate.html32
-rw-r--r--docs/Type Definitions.html102
-rw-r--r--docs/Type Definitions/SDLTouchIdentifier.html34
-rw-r--r--docs/badge.svg16
-rw-r--r--docs/index.html32
-rw-r--r--docs/search.json2
-rw-r--r--docs/undocumented.json57
-rw-r--r--generator/templates/base_struct_function.m.jinja22
-rw-r--r--generator/transformers/common_producer.py2
251 files changed, 11850 insertions, 7767 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 04b9bbea6..d30dcd7e5 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -1,12 +1,7 @@
name: SmartDeviceLink Tests
# This workflow is triggered on a push or pull request.
-on:
- push:
- # Runs the workflow when someone pushes to any repository branch.
- pull_request:
- # Runs the workflow only when someone opens a pull request (there are a bunch of activity types that can trigger a workflow that we don't want - like labeling, assigning, and locking the PR). The "push" trigger will generate a new workflow if a push is made to a pull request branch.
- types: [opened]
+on: [push, pull_request]
env:
PROJECT: 'SmartDeviceLink-iOS.xcodeproj'
@@ -22,7 +17,7 @@ jobs:
scheme: ['SmartDeviceLink-Example-ObjC', 'SmartDeviceLink-Example-Swift']
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v2.3.1
with:
submodules: true
@@ -46,7 +41,7 @@ jobs:
scheme: ['SmartDeviceLink']
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v2.3.1
with:
submodules: true
@@ -79,4 +74,6 @@ jobs:
# Upload coverage reports to Codecov
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@v1
+ uses: codecov/codecov-action@v1.0.10
+ with:
+ yml: ./codecov.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a2e167eeb..f56e58b27 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,56 @@
# Changelog
+## 6.7.0
+### Versions
+* Supports [SDL RPC Spec 6.0.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/6.0.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0).
+
+### Testing
+* Tested with Xcode 11.6
+* iOS 13.5 and 13.6
+* Core:
+ * Manticore (Core v6.1.1, Generic HMI v0.8.1)
+ * Ford Sync 3.4 (19353_DEVTEST)
+ * Ford Sync 3.0 (17276_DEVTEST)
+ * Ford Sync 4.0 (20016_DEVTEST)
+ * Core v5.1.0 with sdl_hmi v5.2.0
+ * Core v6.1.1
+
+### Enhancements
+* Added subscribe button features to the screen manager (https://github.com/smartdevicelink/sdl_ios/issues/1563).
+* Added a new `SDLManager` delegate method for updating the HMI and VR language separately (https://github.com/smartdevicelink/sdl_ios/issues/1593).
+* Added a new initializer to `SDLButtonPress` because the existing ones were missing a mandatory parameter (https://github.com/smartdevicelink/sdl_ios/issues/1635).
+* Aligned `SDLPermissionManager` methods with Java Suite and JavaScript Suite libraries, adding methods for parameter permissions and more (https://github.com/smartdevicelink/sdl_ios/issues/1661, https://github.com/smartdevicelink/sdl_ios/issues/1667, https://github.com/smartdevicelink/sdl_ios/issues/1682).
+
+### Bug Fixes
+* Fix the video background when the app goes into the background not always showing when it should (https://github.com/smartdevicelink/sdl_ios/issues/1620).
+* Improved `SDLAudioStreamManager` error messages (https://github.com/smartdevicelink/sdl_ios/issues/1622).
+* Better handling of head units sending a `nil` `displayCapabilities` in the `SystemCapabilityManager` (https://github.com/smartdevicelink/sdl_ios/issues/1623).
+* Fixed a deadlock that could happen on the lock screen due to some calls being asynchronous but handled synchronously (https://github.com/smartdevicelink/sdl_ios/issues/1629).
+* Stop and start `SDLFocusableItemLocator` when the video stream starts and stops (https://github.com/smartdevicelink/sdl_ios/issues/1631).
+* Fixed turning wifi off and back on causing secondary transport to fail (https://github.com/smartdevicelink/sdl_ios/issues/1631, https://github.com/smartdevicelink/sdl_ios/issues/1639).
+* Fixed using the permission manager in Swift would sometimes crash (https://github.com/smartdevicelink/sdl_ios/issues/1636).
+* Fixed Travis tests failing and moved to Github Actions CI (https://github.com/smartdevicelink/sdl_ios/issues/1640, https://github.com/smartdevicelink/sdl_ios/issues/1642, https://github.com/smartdevicelink/sdl_ios/issues/1678).
+* Fixed sending an empty VR array in an `SDLMenuCell` would fail (https://github.com/smartdevicelink/sdl_ios/issues/1648).
+* Fix a launch app should only happen on the main thread (https://github.com/smartdevicelink/sdl_ios/issues/1662).
+* Fixed some documentation for a permission manager method to be more specific (https://github.com/smartdevicelink/sdl_ios/issues/1665).
+* Fix the encryption manager not being shut down correctly after a disconnect / reconnect (https://github.com/smartdevicelink/sdl_ios/issues/1675).
+* Refactor the protocol layer and merge the proxy and lifecycle layers (https://github.com/smartdevicelink/sdl_ios/issues/1680).
+* Fix video session properties not being re-set upon reconnection (https://github.com/smartdevicelink/sdl_ios/issues/1683).
+* Fix soft button image uploads failing if the first state has no images but other states do (https://github.com/smartdevicelink/sdl_ios/issues/1698).
+* Fix a potential race condition in `SystemCapabilityManager` (https://github.com/smartdevicelink/sdl_ios/issues/1709).
+* Fix a deadlock that would occur when restarting the `SDLManager` in the `managerDidDisconnect` callback (https://github.com/smartdevicelink/sdl_ios/issues/1710).
+* Fix a crash that would occur when receiving an unknown RPC (https://github.com/smartdevicelink/sdl_ios/issues/1713).
+* Fix the secondary transport timer starting when a primary transport connects (https://github.com/smartdevicelink/sdl_ios/issues/1716).
+* Fix protocol delegates not always receiving an `EndServiceNAK` (https://github.com/smartdevicelink/sdl_ios/issues/1718).
+
+### Other
+* Use an `NSTimer` wrapper everywhere internally instead of the raw `NSTimer` (https://github.com/smartdevicelink/sdl_ios/issues/1611).
+* Add security manager tests to secondary transport unit tests (https://github.com/smartdevicelink/sdl_ios/issues/1653).
+* Fixed documentation for permission manager subscribe callbacks (https://github.com/smartdevicelink/sdl_ios/issues/1724).
+
+### Example Apps
+* Add icons to example app vehicle data menus (https://github.com/smartdevicelink/sdl_ios/issues/1580).
+* Fixed some small icons and replaced a few icons (https://github.com/smartdevicelink/sdl_ios/issues/1581).
+
## 6.6.0
### Versions
* Supports [SDL RPC Spec 6.0.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/6.0.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0).
diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m
index 2c5c05357..68e27ee2f 100644
--- a/Example Apps/Example ObjC/ProxyManager.m
+++ b/Example Apps/Example ObjC/ProxyManager.m
@@ -11,6 +11,7 @@
#import "ProxyManager.h"
#import "RPCPermissionsManager.h"
#import "SmartDeviceLink.h"
+#import "SubscribeButtonManager.h"
#import "VehicleDataManager.h"
NS_ASSUME_NONNULL_BEGIN
@@ -24,6 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) VehicleDataManager *vehicleDataManager;
@property (strong, nonatomic) PerformInteractionManager *performManager;
@property (strong, nonatomic) ButtonManager *buttonManager;
+@property (strong, nonatomic) SubscribeButtonManager *subscribeButtonManager;
@property (nonatomic, copy, nullable) RefreshUIHandler refreshUIHandler;
@end
@@ -66,6 +68,7 @@ NS_ASSUME_NONNULL_BEGIN
self.vehicleDataManager = [[VehicleDataManager alloc] initWithManager:self.sdlManager refreshUIHandler:self.refreshUIHandler];
self.performManager = [[PerformInteractionManager alloc] initWithManager:self.sdlManager];
self.buttonManager = [[ButtonManager alloc] initWithManager:self.sdlManager refreshUIHandler:self.refreshUIHandler];
+ self.subscribeButtonManager = [[SubscribeButtonManager alloc] initWithManager:self.sdlManager];
[weakSelf sdlex_updateProxyState:ProxyStateConnected];
[RPCPermissionsManager setupPermissionsCallbacksWithManager:weakSelf.sdlManager];
@@ -145,7 +148,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (SDLLogConfiguration *)sdlex_logConfiguration {
SDLLogConfiguration *logConfig = [SDLLogConfiguration debugConfiguration];
- SDLLogFileModule *sdlExampleModule = [SDLLogFileModule moduleWithName:@"SDL Obj-C Example App" files:[NSSet setWithArray:@[@"ProxyManager", @"AlertManager", @"AudioManager", @"ButtonManager", @"MenuManager", @"PerformInteractionManager", @"RPCPermissionsManager", @"VehicleDataManager"]]];
+ SDLLogFileModule *sdlExampleModule = [SDLLogFileModule moduleWithName:@"SDL Obj-C Example App" files:[NSSet setWithArray:@[@"ProxyManager", @"AlertManager", @"AudioManager", @"ButtonManager", @"SubscribeButtonManager", @"MenuManager", @"PerformInteractionManager", @"RPCPermissionsManager", @"VehicleDataManager"]]];
logConfig.modules = [logConfig.modules setByAddingObject:sdlExampleModule];
logConfig.targets = [logConfig.targets setByAddingObject:[SDLLogTargetFile logger]];
logConfig.globalLogLevel = SDLLogLevelDebug;
@@ -225,6 +228,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - SDLManagerDelegate
+/// Called when the connection beween this app and the module has closed.
- (void)managerDidDisconnect {
if (self.state != ProxyStateStopped) {
[self sdlex_updateProxyState:ProxyStateSearchingForConnection];
@@ -233,83 +237,68 @@ NS_ASSUME_NONNULL_BEGIN
self.firstHMILevel = SDLHMILevelNone;
}
+/// Called when the state of the SDL app has changed. The state limits the type of RPC that can be sent. Refer to the class documentation for each RPC to determine what state(s) the RPC can be sent.
+/// @param oldLevel The old HMI Level
+/// @param newLevel The new HMI Level
- (void)hmiLevel:(SDLHMILevel)oldLevel didChangeToLevel:(SDLHMILevel)newLevel {
if (![newLevel isEqualToEnum:SDLHMILevelNone] && ([self.firstHMILevel isEqualToEnum:SDLHMILevelNone])) {
// This is our first time in a non-NONE state
self.firstHMILevel = newLevel;
- // Send AddCommands
+ // Send static menu items.
[self sdlex_createMenus];
+
+ // Subscribe to vehicle data.
[self.vehicleDataManager subscribeToVehicleOdometer];
}
if ([newLevel isEqualToEnum:SDLHMILevelFull]) {
- // The SDL app is in the foreground
- SDLLogD(@"The HMI level is 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.
+ [self sdlex_showInitialData];
+ [self.subscribeButtonManager subscribeToAllPresetButtons];
} else if ([newLevel isEqualToEnum:SDLHMILevelLimited]) {
// An active NAV or MEDIA SDL app is in the background
- SDLLogD(@"The HMI level is limited");
} else if ([newLevel isEqualToEnum:SDLHMILevelBackground]) {
// The SDL app is not in the foreground
- SDLLogD(@"The HMI level is background");
} else if ([newLevel isEqualToEnum:SDLHMILevelNone]) {
// The SDL app is not yet running
- SDLLogD(@"The HMI level is none");
- }
-
- if ([newLevel isEqualToEnum:SDLHMILevelFull]) {
- // We're always going to try to show the initial state. because if we've already shown it, it won't be shown, and we need to guard against some possible weird states
- [self sdlex_showInitialData];
}
}
+/// Called when the SDL app's HMI context changes.
+/// @param oldContext The old HMI context
+/// @param newContext The new HMI context
- (void)systemContext:(nullable SDLSystemContext)oldContext didChangeToContext:(SDLSystemContext)newContext {
if ([newContext isEqualToEnum:SDLSystemContextAlert]) {
- SDLLogD(@"The System Context is Alert");
+ // The SDL app's screen is obscured by an alert
} else if ([newContext isEqualToEnum:SDLSystemContextHMIObscured]) {
- SDLLogD(@"The System Context is HMI Obscured");
+ // The SDL app's screen is obscured
} else if ([newContext isEqualToEnum:SDLSystemContextMain]) {
- SDLLogD(@"The System Context is Main");
+ // The SDL app's main screen is open
} else if ([newContext isEqualToEnum:SDLSystemContextMenu]) {
- SDLLogD(@"The System Context is Menu");
+ // The SDL app's menu is open
} else if ([newContext isEqualToEnum:SDLSystemContextVoiceRecognitionSession]) {
- SDLLogD(@"The System Context is Voice Recognition Session");
+ // A voice recognition session is in progress
}
}
+/// Called when the audio state of the SDL app has changed. The audio state only needs to be monitored if the app is streaming audio.
+/// @param oldState The old audio streaming state
+/// @param newState The new audio streaming state
- (void)audioStreamingState:(nullable SDLAudioStreamingState)oldState didChangeToState:(SDLAudioStreamingState)newState {
if ([newState isEqualToEnum:SDLAudioStreamingStateAudible]) {
// The SDL app's audio can be heard
- SDLLogD(@"The Audio Streaming State is Audible");
} else if ([newState isEqualToEnum:SDLAudioStreamingStateNotAudible]) {
// The SDL app's audio cannot be heard
- SDLLogD(@"The Audio Streaming State is Not Audible");
} else if ([newState isEqualToEnum:SDLAudioStreamingStateAttenuated]) {
// The SDL app's audio volume has been lowered to let the system speak over the audio. This usually happens with voice recognition commands.
- SDLLogD(@"The Audio Streaming State is Not Attenuated");
- }
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (nullable SDLLifecycleConfigurationUpdate *)managerShouldUpdateLifecycleToLanguage:(SDLLanguage)language {
- SDLLifecycleConfigurationUpdate *update = [[SDLLifecycleConfigurationUpdate alloc] init];
-
- if ([language isEqualToEnum:SDLLanguageEnUs]) {
- update.appName = ExampleAppName;
- } else if ([language isEqualToString:SDLLanguageEsMx]) {
- update.appName = ExampleAppNameSpanish;
- } else if ([language isEqualToString:SDLLanguageFrCa]) {
- update.appName = ExampleAppNameFrench;
- } else {
- return nil;
}
-
- update.ttsName = [SDLTTSChunk textChunksFromString:update.appName];
- return update;
}
-#pragma clang diagnostic pop
+/// Called when the car's head unit language is different from the default langage set in the SDLConfiguration AND the head unit language is supported by the app (as set in `languagesSupported` of SDLConfiguration). This method is only called when a connection to Core is first established. If desired, you can update the app's name and text-to-speech name to reflect the head unit's language.
+/// @param language The head unit's current VR+TTS language
+/// @param hmiLanguage The head unit's current HMI language
+/// @return A SDLLifecycleConfigurationUpdate object
- (nullable SDLLifecycleConfigurationUpdate *)managerShouldUpdateLifecycleToLanguage:(SDLLanguage)language hmiLanguage:(SDLLanguage)hmiLanguage {
SDLLifecycleConfigurationUpdate *update = [[SDLLifecycleConfigurationUpdate alloc] init];
@@ -323,7 +312,7 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
- update.ttsName = @[[SDLTTSChunk textChunksFromString:update.appName]];
+ update.ttsName = [SDLTTSChunk textChunksFromString:update.appName];
return update;
}
diff --git a/Example Apps/Example ObjC/RPCPermissionsManager.m b/Example Apps/Example ObjC/RPCPermissionsManager.m
index d79bde3e2..93d2755e6 100644
--- a/Example Apps/Example ObjC/RPCPermissionsManager.m
+++ b/Example Apps/Example ObjC/RPCPermissionsManager.m
@@ -24,18 +24,23 @@ NS_ASSUME_NONNULL_BEGIN
[self sdlex_checkCurrentPermissionWithManager:manager rpcName:showRPCName];
// Checks if all the RPCs need to create menus are allowed right at this moment
- NSArray<SDLRPCFunctionName> *menuRPCNames = @[SDLRPCFunctionNameAddCommand, SDLRPCFunctionNameCreateInteractionChoiceSet, SDLRPCFunctionNamePerformInteraction];
- [self sdlex_checkCurrentGroupPermissionsWithManager:manager rpcNames:menuRPCNames];
-
- // Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to all allowed, this block is called when the group permissions changes from all allowed. This block is called immediately when created.
- NSArray<SDLRPCFunctionName> *mediaTemplateRPCs = @[SDLRPCFunctionNameSetMediaClockTimer, SDLRPCFunctionNameSubscribeButton];
- SDLPermissionObserverIdentifier allAllowedObserverId = [self sdlex_subscribeGroupPermissionsWithManager:manager rpcNames:mediaTemplateRPCs groupType:SDLPermissionGroupTypeAllAllowed];
+ SDLPermissionElement *addCommandPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameAddCommand parameterPermissions:nil];
+ SDLPermissionElement *createInteractionPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameCreateInteractionChoiceSet parameterPermissions:nil];
+ SDLPermissionElement *performInteractionPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNamePerformInteraction parameterPermissions:nil];
+ NSArray<SDLPermissionElement *> *menuRPCPermissions = @[addCommandPermissionElement, createInteractionPermissionElement, performInteractionPermissionElement];
+ [self sdlex_checkCurrentGroupPermissionsWithManager:manager permissionElements:menuRPCPermissions];
+
+ // Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to all allowed, this block is called when the group permissions changes to all-allowed or from all-allowed to some-not-allowed.
+ SDLPermissionElement *setMediaClockPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameSetMediaClockTimer parameterPermissions:nil];
+ SDLPermissionElement *subscribeButtonPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:SDLRPCFunctionNameSubscribeButton parameterPermissions:nil];
+ NSArray<SDLPermissionElement *> *mediaTemplateRPCPermissions = @[setMediaClockPermissionElement, subscribeButtonPermissionElement];
+ SDLPermissionObserverIdentifier allAllowedObserverId = [self sdlex_subscribeGroupPermissionsWithManager:manager permissionElements:mediaTemplateRPCPermissions groupType:SDLPermissionGroupTypeAllAllowed];
// Stop observing permissions changes for the media template releated RPCs
[self sdlex_unsubscribeGroupPermissionsWithManager:manager observerId:allAllowedObserverId];
// Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to any, this block is called when the permission status changes for any of the RPCs being observed. This block is called immediately when created.
- [self sdlex_subscribeGroupPermissionsWithManager:manager rpcNames:mediaTemplateRPCs groupType:SDLPermissionGroupTypeAny];
+ [self sdlex_subscribeGroupPermissionsWithManager:manager permissionElements:mediaTemplateRPCPermissions groupType:SDLPermissionGroupTypeAny];
}
/**
@@ -73,26 +78,26 @@ NS_ASSUME_NONNULL_BEGIN
* @param rpcNames The names of the RPCs
* @return The current permission status for all the RPCs in the group
*/
-+ (SDLPermissionGroupStatus)sdlex_checkCurrentGroupPermissionsWithManager:(SDLManager *)manager rpcNames:(NSArray<SDLRPCFunctionName> *)rpcNames {
- SDLPermissionGroupStatus groupPermissionStatus = [manager.permissionManager groupStatusOfRPCNames:rpcNames];
- NSDictionary<NSString *, NSNumber *> *individualPermissionStatuses = [manager.permissionManager statusesOfRPCNames:rpcNames];
- [self sdlex_logRPCGroupPermissions:rpcNames groupPermissionStatus:groupPermissionStatus individualPermissionStatuses:individualPermissionStatuses];
++ (SDLPermissionGroupStatus)sdlex_checkCurrentGroupPermissionsWithManager:(SDLManager *)manager permissionElements:(NSArray<SDLPermissionElement *> *)permissionElements {
+ SDLPermissionGroupStatus groupPermissionStatus = [manager.permissionManager groupStatusOfRPCPermissions:permissionElements];
+ NSDictionary<NSString *, SDLRPCPermissionStatus *> *individualPermissionStatuses = [manager.permissionManager statusesOfRPCPermissions:permissionElements];
+ [self sdlex_logRPCGroupPermissions:permissionElements groupPermissionStatus:groupPermissionStatus individualPermissionStatuses:individualPermissionStatuses];
return groupPermissionStatus;
}
#pragma mark Subscribe Permissions
/**
- * Sets up a block for observing permission changes for a group of RPCs. This block is called immediately when created and when the permission status changes for the group of RPCs being observed.
+ * Sets up a block for observing permission changes for a group of RPCs. This block is called when the group permissions become all-allowed or from all-allowed to some-not-allowed.
*
* @param manager The SDL Manager
* @param rpcNames The names of the RPCs to be subscribed
* @param groupType The type of changes you want to be notified about for the group
* @return A unique identifier for the subscription. This can be used to later to unsubscribe from the notifications.
*/
-+ (SDLPermissionObserverIdentifier)sdlex_subscribeGroupPermissionsWithManager:(SDLManager *)manager rpcNames:(NSArray<SDLRPCFunctionName> *)rpcNames groupType:(SDLPermissionGroupType)groupType {
- SDLPermissionObserverIdentifier observerId = [manager.permissionManager subscribeToRPCNames:rpcNames groupType:groupType withHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
- [self sdlex_logRPCGroupPermissions:rpcNames groupPermissionStatus:status individualPermissionStatuses:change];
++ (SDLPermissionObserverIdentifier)sdlex_subscribeGroupPermissionsWithManager:(SDLManager *)manager permissionElements:(NSArray<SDLPermissionElement *> *)permissionElements groupType:(SDLPermissionGroupType)groupType {
+ SDLPermissionObserverIdentifier observerId = [manager.permissionManager subscribeToRPCPermissions:permissionElements groupType:groupType withHandler:^(NSDictionary<SDLPermissionRPCName,SDLRPCPermissionStatus *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ [self sdlex_logRPCGroupPermissions:permissionElements groupPermissionStatus:status individualPermissionStatuses:change];
}];
return observerId;
}
@@ -126,10 +131,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param groupPermissionStatus The permission status for all RPCs in the group
* @param individualPermissionStatuses The permission status for each of the RPCs in the group
*/
-+ (void)sdlex_logRPCGroupPermissions:(NSArray<NSString *> *)rpcNames groupPermissionStatus:(SDLPermissionGroupStatus)groupPermissionStatus individualPermissionStatuses:(NSDictionary<NSString *, NSNumber *> *)individualPermissionStatuses {
++ (void)sdlex_logRPCGroupPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupPermissionStatus:(SDLPermissionGroupStatus)groupPermissionStatus individualPermissionStatuses:(NSDictionary<NSString *, SDLRPCPermissionStatus *> *)individualPermissionStatuses {
SDLLogD(@"The group status for %@ has changed to: %lu", rpcNames, (unsigned long)groupPermissionStatus);
- [individualPermissionStatuses enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSNumber * _Nonnull obj, BOOL * _Nonnull stop) {
- [self sdlex_logRPCPermission:key isRPCAllowed:obj.boolValue];
+ [individualPermissionStatuses enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, SDLRPCPermissionStatus * _Nonnull obj, BOOL * _Nonnull stop) {
+ [self sdlex_logRPCPermission:key isRPCAllowed:obj.rpcAllowed];
}];
}
diff --git a/Example Apps/Example ObjC/VehicleDataManager.m b/Example Apps/Example ObjC/VehicleDataManager.m
index bd1a2fd3a..b4032cd27 100644
--- a/Example Apps/Example ObjC/VehicleDataManager.m
+++ b/Example Apps/Example ObjC/VehicleDataManager.m
@@ -144,9 +144,11 @@ 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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLGetVehicleData *getAllVehicleData = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation: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];
+ getAllVehicleData.fuelLevel = @YES;
+ getAllVehicleData.fuelLevel_State = @YES;
#pragma clang diagnostic pop
[manager sendRequest:getAllVehicleData withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
@@ -219,9 +221,15 @@ NS_ASSUME_NONNULL_BEGIN
} else if ([vehicleDataType isEqualToString:ACExternalTemperatureMenuName]) {
vehicleDataDescription = vehicleData.externalTemperature.description;
} else if ([vehicleDataType isEqualToString:ACFuelLevelMenuName]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
vehicleDataDescription = vehicleData.fuelLevel.description;
+#pragma clang diagnostic pop
} else if ([vehicleDataType isEqualToString:ACFuelLevelStateMenuName]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
vehicleDataDescription = vehicleData.fuelLevel_State.description;
+#pragma clang diagnostic pop
} else if ([vehicleDataType isEqualToString:ACFuelRangeMenuName]) {
vehicleDataDescription = vehicleData.fuelRange.description;
} else if ([vehicleDataType isEqualToString:ACGearStatusMenuName]) {
diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift
index 3b7ed1ef5..fdad60360 100644
--- a/Example Apps/Example Swift/ProxyManager.swift
+++ b/Example Apps/Example Swift/ProxyManager.swift
@@ -21,13 +21,15 @@ enum ProxyState {
}
class ProxyManager: NSObject {
- fileprivate var sdlManager: SDLManager!
- fileprivate var buttonManager: ButtonManager!
- fileprivate var vehicleDataManager: VehicleDataManager!
- fileprivate var performInteractionManager: PerformInteractionManager!
- fileprivate var firstHMILevelState: SDLHMILevel
+ private var sdlManager: SDLManager!
+ private var buttonManager: ButtonManager!
+ private var subscribeButtonManager: SubscribeButtonManager!
+ private var vehicleDataManager: VehicleDataManager!
+ private var performInteractionManager: PerformInteractionManager!
+ private var firstHMILevelState: SDLHMILevel
weak var delegate: ProxyManagerDelegate?
+
// Singleton
static let sharedManager = ProxyManager()
private override init() {
@@ -43,12 +45,6 @@ extension ProxyManager {
///
/// - Parameter connectionType: The type of transport layer to use.
func start(with proxyTransportType: ProxyTransportType) {
- guard sdlManager == nil else {
- // Manager already created, just start it again.
- startManager()
- return
- }
-
delegate?.didChangeProxyState(ProxyState.searching)
sdlManager = SDLManager(configuration: proxyTransportType == .iap ? ProxyManager.connectIAP() : ProxyManager.connectTCP(), delegate: self)
startManager()
@@ -117,7 +113,7 @@ private extension ProxyManager {
/// - Returns: A SDLLogConfiguration object
class func logConfiguration() -> SDLLogConfiguration {
let logConfig = SDLLogConfiguration.default()
- let exampleLogFileModule = SDLLogFileModule(name: "SDL Swift Example App", files: ["ProxyManager", "AlertManager", "AudioManager", "ButtonManager", "MenuManager", "PerformInteractionManager", "RPCPermissionsManager", "VehicleDataManager"])
+ let exampleLogFileModule = SDLLogFileModule(name: "SDL Swift Example App", files: ["ProxyManager", "AlertManager", "AudioManager", "ButtonManager", "SubscribeButtonManager", "MenuManager", "PerformInteractionManager", "RPCPermissionsManager", "VehicleDataManager"])
logConfig.modules.insert(exampleLogFileModule)
_ = logConfig.targets.insert(SDLLogTargetFile()) // Logs to file
logConfig.globalLogLevel = .debug // Filters the logs
@@ -136,6 +132,7 @@ private extension ProxyManager {
self.delegate?.didChangeProxyState(ProxyState.connected)
self.buttonManager = ButtonManager(sdlManager: self.sdlManager, updateScreenHandler: self.refreshUIHandler)
+ self.subscribeButtonManager = SubscribeButtonManager(sdlManager: self.sdlManager)
self.vehicleDataManager = VehicleDataManager(sdlManager: self.sdlManager, refreshUIHandler: self.refreshUIHandler)
self.performInteractionManager = PerformInteractionManager(sdlManager: self.sdlManager)
@@ -149,8 +146,8 @@ private extension ProxyManager {
// MARK: - SDLManagerDelegate
extension ProxyManager: SDLManagerDelegate {
- /// Called when the connection beween this app and SDL Core has closed.
- func managerDidDisconnect() {
+ /// Called when the connection beween this app and the module has closed.
+ func managerDidDisconnect() {
if delegate?.proxyState != .some(.stopped) {
delegate?.didChangeProxyState(ProxyState.searching)
}
@@ -161,36 +158,43 @@ extension ProxyManager: SDLManagerDelegate {
/// Called when the state of the SDL app has changed. The state limits the type of RPC that can be sent. Refer to the class documentation for each RPC to determine what state(s) the RPC can be sent.
///
/// - Parameters:
- /// - oldLevel: The old SDL HMI Level
- /// - newLevel: The new SDL HMI Level
+ /// - oldLevel: The old HMI Level
+ /// - newLevel: The new HMI Level
func hmiLevel(_ oldLevel: SDLHMILevel, didChangeToLevel newLevel: SDLHMILevel) {
if newLevel != .none && firstHMILevelState == .none {
// This is our first time in a non-NONE state
firstHMILevelState = newLevel
- // Send static menu items. Menu related RPCs can be sent at all `hmiLevel`s except `NONE`
+ // Send static menu items.
createMenuAndGlobalVoiceCommands()
+
+ // Subscribe to vehicle data.
vehicleDataManager.subscribeToVehicleOdometer()
}
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.
+ 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()
- 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
+ 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
default: break
}
}
+ /// Called when the SDL app's HMI context changes.
+ /// - Parameters:
+ /// - oldContext: The old HMI context
+ /// - newContext: The new HMI context
func systemContext(_ oldContext: SDLSystemContext?, didChangeToContext newContext: SDLSystemContext) {
switch newContext {
- case SDLSystemContext.alert: break
- case SDLSystemContext.hmiObscured: break
- case SDLSystemContext.main: break
- case SDLSystemContext.menu: break
- case SDLSystemContext.voiceRecognitionSession: break
+ case SDLSystemContext.alert: break // The SDL app's screen is obscured by an alert
+ case SDLSystemContext.hmiObscured: break // The SDL app's screen is obscured
+ case SDLSystemContext.main: break // The SDL app's main screen is open
+ case SDLSystemContext.menu: break // The SDL app's menu is open
+ case SDLSystemContext.voiceRecognitionSession: break // A voice recognition session is in progress
default: break
}
}
@@ -198,8 +202,8 @@ extension ProxyManager: SDLManagerDelegate {
/// Called when the audio state of the SDL app has changed. The audio state only needs to be monitored if the app is streaming audio.
///
/// - Parameters:
- /// - oldState: The old SDL audio streaming state
- /// - newState: The new SDL audio streaming state
+ /// - oldState: The old audio streaming state
+ /// - newState: The new audio streaming state
func audioStreamingState(_ oldState: SDLAudioStreamingState?, didChangeToState newState: SDLAudioStreamingState) {
switch newState {
case .audible: break // The SDL app's audio can be heard
@@ -211,26 +215,6 @@ extension ProxyManager: SDLManagerDelegate {
/// Called when the car's head unit language is different from the default langage set in the SDLConfiguration AND the head unit language is supported by the app (as set in `languagesSupported` of SDLConfiguration). This method is only called when a connection to Core is first established. If desired, you can update the app's name and text-to-speech name to reflect the head unit's language.
///
- /// - Parameter language: The head unit's current language
- /// - Returns: A SDLLifecycleConfigurationUpdate object
- func managerShouldUpdateLifecycle(toLanguage language: SDLLanguage) -> SDLLifecycleConfigurationUpdate? {
- var appName = ""
- switch language {
- case .enUs:
- appName = ExampleAppName
- case .esMx:
- appName = ExampleAppNameSpanish
- case .frCa:
- appName = ExampleAppNameFrench
- default:
- return nil
- }
-
- return SDLLifecycleConfigurationUpdate(appName: appName, shortAppName: nil, ttsName: [SDLTTSChunk(text: appName, type: .text)], voiceRecognitionCommandNames: nil)
- }
-
- /// Called when the car's head unit language is different from the default langage set in the SDLConfiguration AND the head unit language is supported by the app (as set in `languagesSupported` of SDLConfiguration). This method is only called when a connection to Core is first established. If desired, you can update the app's name and text-to-speech name to reflect the head unit's language.
- ///
/// - Parameter language: The head unit's current VR+TTS language
/// - Parameter hmiLanguage: The head unit's current HMI language
/// - Returns: A SDLLifecycleConfigurationUpdate object
diff --git a/Example Apps/Example Swift/RPCPermissionsManager.swift b/Example Apps/Example Swift/RPCPermissionsManager.swift
index 1efcbe129..144a636f6 100644
--- a/Example Apps/Example Swift/RPCPermissionsManager.swift
+++ b/Example Apps/Example Swift/RPCPermissionsManager.swift
@@ -20,18 +20,23 @@ class RPCPermissionsManager {
_ = checkCurrentPermission(with: manager, rpcName: showRPCName)
// Checks if all the RPCs need to create menus are allowed right at this moment
- let menuRPCNames = [SDLRPCFunctionName.addCommand, SDLRPCFunctionName.createInteractionChoiceSet, SDLRPCFunctionName.performInteraction]
- _ = checkCurrentGroupPermissions(with: manager, rpcNames: menuRPCNames)
-
- // Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to all allowed, this block is called when the group permissions changes from all allowed. This block is called immediately when created.
- let mediaTemplateRPCs = [SDLRPCFunctionName.setMediaClockTimer, SDLRPCFunctionName.subscribeButton]
- let allAllowedObserverId = subscribeGroupPermissions(with: manager, rpcNames: mediaTemplateRPCs, groupType: .allAllowed)
+ let addCommandPermissionElement = SDLPermissionElement(rpcName: SDLRPCFunctionName.addCommand, parameterPermissions: nil)
+ let createInteractionPermissionElement = SDLPermissionElement(rpcName: SDLRPCFunctionName.createInteractionChoiceSet, parameterPermissions: nil)
+ let performInteractionPermissionElement = SDLPermissionElement(rpcName: SDLRPCFunctionName.performInteraction, parameterPermissions: nil)
+ let menuRPCPermissions = [addCommandPermissionElement, createInteractionPermissionElement, performInteractionPermissionElement]
+ _ = checkCurrentGroupPermissions(with: manager, permissionElements: menuRPCPermissions)
+
+ // Set up an observer for permissions changes to media template releated RPCs. Since the `groupType` is set to all allowed, this block is called when the group permissions changes to all-allowed or from all-allowed to some-not-allowed.
+ let setMediaClockPermissionElement = SDLPermissionElement(rpcName: SDLRPCFunctionName.setMediaClockTimer, parameterPermissions: nil)
+ let subscribeButtonPermissionElement = SDLPermissionElement(rpcName: SDLRPCFunctionName.subscribeButton, parameterPermissions: nil)
+ let mediaTemplatePermissions = [setMediaClockPermissionElement, subscribeButtonPermissionElement]
+ let allAllowedObserverId = subscribeGroupPermissions(with: manager, permissionElements: mediaTemplatePermissions, groupType: .allAllowed)
// Stop observing permissions changes for the media template releated RPCs
unsubscribeGroupPermissions(with: manager, observerId: allAllowedObserverId)
// Sets up a block for observing permission changes for a group of RPCs. Since the `groupType` is set to any, this block is called when the permission status changes for any of the RPCs being observed. This block is called immediately when created.
- _ = subscribeGroupPermissions(with: manager, rpcNames: mediaTemplateRPCs, groupType: .any)
+ _ = subscribeGroupPermissions(with: manager, permissionElements: mediaTemplatePermissions, groupType: .any)
}
/// Checks if the `DialNumber` RPC is allowed
@@ -47,24 +52,26 @@ class RPCPermissionsManager {
// MARK: - Check Permissions
private extension RPCPermissionsManager {
- /// Checks if the `Show` RPC is allowed right at this moment
+ /// Checks if the RPC is allowed at the time of the call
///
/// - Parameter manager: The SDL Manager
+ /// - Parameter rpcName: The name of the RPC to check
/// - Returns: true if allowed, false if not
class func checkCurrentPermission(with manager: SDLManager, rpcName: SDLRPCFunctionName) -> Bool {
let isRPCAllowed = manager.permissionManager.isRPCNameAllowed(rpcName)
- logRPCPermission(rpcName: rpcName, isRPCAllowed: isRPCAllowed)
+ SDLLog.d("\(rpcName.rawValue.rawValue) RPC can be sent to SDL Core? \(isRPCAllowed ? "YES" : "NO")")
return isRPCAllowed
}
- /// Checks if all the RPCs need to create menus are allowed right at this moment
+ /// Checks if all the given RPCs are allowed or not at the time of the call
///
/// - Parameter manager: The SDL Manager
- /// - Returns: The rpc names, the group permission status and the permission status for each rpc in the group
- class func checkCurrentGroupPermissions(with manager: SDLManager, rpcNames: [SDLRPCFunctionName]) -> SDLPermissionGroupStatus {
- let groupPermissionStatus = manager.permissionManager.groupStatus(ofRPCNames: rpcNames)
- let individualPermissionStatuses = manager.permissionManager.statuses(ofRPCNames: rpcNames)
- logRPCGroupPermissions(rpcNames: rpcNames, groupPermissionStatus: groupPermissionStatus, individualPermissionStatuses: individualPermissionStatuses)
+ /// - Parameter permissionElements: The RPCs and parameters to be checked
+ /// - Returns: The group permission status
+ class func checkCurrentGroupPermissions(with manager: SDLManager, permissionElements: [SDLPermissionElement]) -> SDLPermissionGroupStatus {
+ let groupPermissionStatus = manager.permissionManager.groupStatus(ofRPCPermissions: permissionElements)
+ let individualPermissionStatuses = manager.permissionManager.statuses(ofRPCPermissions: permissionElements)
+ logRPCGroupPermissions(permissionElements: permissionElements, groupPermissionStatus: groupPermissionStatus, individualPermissionStatuses: individualPermissionStatuses)
return groupPermissionStatus
}
@@ -73,10 +80,11 @@ private extension RPCPermissionsManager {
/// - Parameters:
/// - manager: The SDL Manager
/// - groupType: The type of changes to get notified about
+ /// - permissionElements: The RPCs and parameters to be checked
/// - Returns: A unique id assigned to observer. Use the id to unsubscribe to notifications
- class func subscribeGroupPermissions(with manager: SDLManager, rpcNames: [SDLRPCFunctionName], groupType: SDLPermissionGroupType) -> UUID {
- let permissionAllAllowedObserverId = manager.permissionManager.subscribe(toRPCNames: rpcNames, groupType: groupType, withHandler: { (individualStatuses, groupStatus) in
- self.logRPCGroupPermissions(rpcNames: rpcNames, groupPermissionStatus: groupStatus, individualPermissionStatuses: individualStatuses)
+ class func subscribeGroupPermissions(with manager: SDLManager, permissionElements: [SDLPermissionElement], groupType: SDLPermissionGroupType) -> UUID {
+ let permissionAllAllowedObserverId = manager.permissionManager.subscribe(toRPCPermissions: permissionElements, groupType: groupType, withHandler: { (individualStatuses, groupStatus) in
+ self.logRPCGroupPermissions(permissionElements: permissionElements, groupPermissionStatus: groupStatus, individualPermissionStatuses: individualStatuses)
})
return permissionAllAllowedObserverId
@@ -100,8 +108,8 @@ private extension RPCPermissionsManager {
/// - Parameters:
/// - rpcName: The name of the RPC
/// - isRPCAllowed: The permission status for the RPC
- class func logRPCPermission(rpcName: SDLRPCFunctionName, isRPCAllowed: Bool) {
- SDLLog.d("\(rpcName.rawValue.rawValue) RPC can be sent to SDL Core? \(isRPCAllowed ? "yes" : "no")")
+ class func logRPCPermission(status: SDLRPCPermissionStatus) {
+ SDLLog.d("\(status.rpcName.rawValue.rawValue) RPC can be sent to SDL Core? \(status.isRPCAllowed ? "YES" : "NO"), parameters: \(status.rpcParameters ?? [:])")
}
/// Logs permissions for a group of RPCs
@@ -110,10 +118,10 @@ private extension RPCPermissionsManager {
/// - rpcNames: The names of the RPCs
/// - groupPermissionStatus: The permission status for all RPCs in the group
/// - individualPermissionStatuses: The permission status for each of the RPCs in the group
- class func logRPCGroupPermissions(rpcNames: [SDLRPCFunctionName], groupPermissionStatus: SDLPermissionGroupStatus, individualPermissionStatuses: [SDLRPCFunctionName:NSNumber]) {
- SDLLog.d("The group status for \(rpcNames.map { $0.rawValue.rawValue } ) has changed to: \(groupPermissionStatus.rawValue)")
- for (rpcName, rpcAllowed) in individualPermissionStatuses {
- logRPCPermission(rpcName: rpcName, isRPCAllowed: rpcAllowed.boolValue)
+ class func logRPCGroupPermissions(permissionElements: [SDLPermissionElement], groupPermissionStatus: SDLPermissionGroupStatus, individualPermissionStatuses: [SDLRPCFunctionName: SDLRPCPermissionStatus]) {
+ SDLLog.d("The group status for \(permissionElements.map { $0.rpcName.rawValue } ) has changed to: \(groupPermissionStatus.rawValue)")
+ for (_, status) in individualPermissionStatuses {
+ logRPCPermission(status: status)
}
}
}
diff --git a/README.md b/README.md
index 55b24f4ac..b8b66babe 100644
--- a/README.md
+++ b/README.md
@@ -7,144 +7,68 @@
[![Documentation](docs/badge.svg)](https://smartdevicelink.com/en/guides/iOS/getting-started/installation/)
[![Slack Status](http://sdlslack.herokuapp.com/badge.svg)](http://slack.smartdevicelink.com)
-# SmartDeviceLink (SDL)
+# What is SmartDeviceLink (SDL)
[SmartDeviceLink (SDL)](https://www.smartdevicelink.com) is a standard set of protocols and messages that connect applications on a smartphone to a vehicle head unit. This messaging enables a consumer to interact with their application using common in-vehicle interfaces such as a touch screen display, embedded voice recognition, steering wheel controls and various vehicle knobs and buttons. There are three main components that make up the SDL ecosystem.
* The [Core](https://github.com/smartdevicelink/sdl_core) component is the software which Vehicle Manufacturers (OEMs) implement in their vehicle head units. Integrating this component into their head unit and HMI based on a set of guidelines and templates enables access to various smartphone applications.
* The optional [SDL Server](https://github.com/smartdevicelink/sdl_server) can be used by Vehicle OEMs to update application policies and gather usage information for connected applications.
-* The [iOS](https://github.com/smartdevicelink/sdl_ios) and [Android](https://github.com/smartdevicelink/sdl_android) libraries are implemented by app developers into their applications to enable command and control via the connected head unit.
+* The [iOS](https://github.com/smartdevicelink/sdl_ios), [Android / Java Suite](https://github.com/smartdevicelink/sdl_android), and [JavaScript](https://github.com/smartdevicelink/sdl_javascript_suite) libraries are implemented by app developers into their applications to enable command and control via the connected head unit.
* To suggest new features to SDL, including the iOS library, go to the [SDL Evolution](https://github.com/smartdevicelink/sdl_evolution) github project.
* To understand if a contribution should be entered as an iOS Pull Request or Issue, or an SDL Evolution Proposal, please reference [this document](https://github.com/smartdevicelink/sdl_evolution/blob/master/proposals_versus_issues.md).
-<a href="http://www.youtube.com/watch?feature=player_embedded&v=AzdQdSCS24M" target="_blank"><img src="http://i.imgur.com/nm8UujD.png?1" alt="SmartDeviceLink" border="10" /></a>
+## SDL iOS App Library
+The mobile library component of SDL is meant to run on the end user’s smart-device from within SDL enabled apps. The library allows the apps to connect to SDL enabled head-units and hardware through Bluetooth, USB, and TCP. Once the library establishes a connection between the smart device and head-unit through the preferred method of transport, the two devices are able to communicate using the SDL defined protocol. The app integrating this library project is then able to expose its functionality to the head-unit through text, media, and other interactive elements.
-## Mobile Proxy
-
-The mobile library component of SDL is meant to run on the end user’s smart-device from within SDL enabled apps. The library allows the apps to connect to SDL enabled head-units and hardware through bluetooth, USB, and TCP. Once the library establishes a connection between the smart device and head-unit through the preferred method of transport, the two components are able to communicate using the SDL defined protocol. The app integrating this library project is then able to expose its functionality to the head-unit through text, media, and other interactive elements.
-
-
-## SDL iOS
-
-We're still working on creating documentation for each of these individual repositories, but in the meantime, you can find more information about SmartDeviceLink [on the website](https://www.smartdevicelink.com).
-
-See the [changelog](https://github.com/smartdevicelink/sdl_ios/blob/master/CHANGELOG.md) for release notes. This project uses [Semantic Versioning](http://semver.org/).
+You can find guides and documentation on how to use this library at the [SmartDeviceLink website](https://smartdevicelink.com/en/guides/iOS/getting-started/installation/). You can find the upcoming releases roadmap at the [SDL Evolution Github](https://github.com/smartdevicelink/sdl_evolution#recent-and-upcoming-releases).
### Installing
+To install this library as a framework in your app, see the [Installation Guide](https://smartdevicelink.com/en/guides/iOS/getting-started/installation/). There are instructions on how to install using the dependency managers CocoaPods, Carthage, and Accio, as well as how to install the library framework manually.
-#### Accio
-
-You can install this library using [Accio/SwiftPM](https://github.com/JamitLabs/Accio) documentation page. Please follow the steps to install and initialization Accio into a current or new application.
-
-In your Package.swift file , you want to add `.package(url: "https://github.com/smartdevicelink/sdl_ios.git", .from: "6.6.0"),` to the dependencies array. Then add `SmartDeviceLink` to the targets dependencies array.
-
-Please see [Mainifest format](https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageDescriptionV4.md) to specify dependencies to a specific branch / version of SDL.
-
-###### Swift
-
-If you are building a Swift app, then add this instead `SmartDeviceLinkSwift` to the targets dependencies array.
-
-##### Cocoapods
-
-You can install this library using [Cocoapods](https://cocoapods.org/pods/SmartDeviceLink-iOS). You can get started with Cocoapods by [following their install guide](https://guides.cocoapods.org/using/getting-started.html#getting-started), and learn how to use Cocoapods to install dependencies [by following this guide](https://guides.cocoapods.org/using/using-cocoapods.html).
-
-In your podfile, you want to add `pod 'SmartDeviceLink', '~> 6.6'`. Then run `pod install` inside your terminal. With Cocoapods, we support iOS 8.0+.
-
-###### Swift
-If you are building a Swift app, then add this instead `pod 'SmartDeviceLink/Swift', '~> 6.6'`. Then run `pod install` in your terminal.
-
-##### Carthage
-
-SDL iOS supports Carthage! Install using Carthage by following [this guide](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application). Carthage supports iOS 8+.
-
-###### Swift
-If you are building a Swift app, then include both packaged frameworks for expanded logging support.
-
-##### Dynamic Framework
-
+#### Adding a Dynamic Framework
Tagged to our releases is a dynamic framework file that can be drag-and-dropped into the application. Dynamic frameworks are supported on iOS 8+. **WARNING: You cannot submit your app to the app store with the framework as is. You MUST strip the simulator part of the framework first. Strip the x64 and i386 portions first like so:**
-```
-lipo -remove i386 -remove x86_64 -o SmartDeviceLink.framework/SmartDeviceLink SmartDeviceLink.framework/SmartDeviceLink`
+```bash
+lipo -remove i386 -remove x86_64 -o SmartDeviceLink.framework/SmartDeviceLink SmartDeviceLink.framework/SmartDeviceLink
```
You can check the current architectures like so:
-```
+```bash
lipo -info SmartDeviceLink.framework/SmartDeviceLink
```
-### Reference Documentation
+### Getting Help
+If you have questions, first view our guides on the [SmartDeviceLink website](https://smartdevicelink.com/en/guides/iOS/getting-started/installation/).
-You can find the latest reference documentation on [SmartDeviceLink.com Documentation](https://smartdevicelink.com/en/docs/iOS/master/), and view guides on [SmartDeviceLink.com Guides](https://smartdevicelink.com/en/guides/iOS/getting-started/installation/).
+If you see a bug, please post an issue on the appropriate repository. Please see the [contribution guidelines](https://github.com/smartdevicelink/sdl_ios/blob/master/.github/CONTRIBUTING.md) before proceeding. If you need general assistance, or have other questions, you can [sign up](http://slack.smartdevicelink.com) for the [SDL Slack](https://smartdevicelink.slack.com) and chat with other developers and the maintainers of the project.
-### Getting Help
+### Example Apps
+This library repository contains two example apps: one written in Objective-C and one in Swift. If you have CocoaPods installed, you can easily run one of the example apps by executing `pod try SmartDeviceLink` in your terminal. Alternatively, you can clone or download the project, but before attempting to build and run the example apps you must follow the [installation steps](#preparing-for-development).
-First, view our guides on [SmartDeviceLink.com](https://smartdevicelink.com/en/guides/iOS/getting-started/installation/).
-
-If you see a bug, please post an issue on the appropriate repository. Please see the [contribution guidelines](https://github.com/smartdevicelink/sdl_ios/blob/master/CONTRIBUTING.md) before proceeding. If you need general assistance, or have other questions, you can [sign up](http://slack.smartdevicelink.org) for the [SDL Slack](https://smartdevicelink.slack.com) and chat with other developers and the maintainers of the project.
-
-### SDL iOS Getting Started
-
-#### Example Apps
-To use the example apps, you can use `pod try SmartDeviceLink`, alternately, you can clone or download the project, but you must then also retrieve the submodules by running `git submodule init` and `git submodule update` in your terminal while in the main directory of the project.
-
-#### Other Installation Requirements
-You can connect your application with [manticore](https://smartdevicelink.com/resources/manticore/) while running in TCP debug mode in order to test. For more information, [see the guildes](https://smartdevicelink.com/en/guides/iOS/getting-started/connecting-to-an-infotainment-system/).
-
-#### Enabling Background Capabilities
-iOS 5 introduced the capability for an iOS application to maintain a connection to an external accessory while the application is in the background. This capability must be explicitly enabled for your application.
-
-To enable the feature for your application, select your application's build target, go to Capabilities, enable Background Modes, and select the External accessory communication mode.
-
-![Enable External Accessory Background Mode](http://i.imgur.com/zxn4lsb.png)
-
-#### SDL protocol strings
-Your application must support a set of smartdevicelink protocol strings in order to be connected to smartdevicelink enabled head units. Go to your application's .plist, look at the source, and add the following code under the top level `dict`. Note: This is not required if you're only testing by connected to a wifi enabled head unit, but is required for USB and Bluetooth enabled head units.
-
-```xml
-<key>UISupportedExternalAccessoryProtocols</key>
-<array>
-<string>com.smartdevicelink.prot29</string>
-<string>com.smartdevicelink.prot28</string>
-<string>com.smartdevicelink.prot27</string>
-<string>com.smartdevicelink.prot26</string>
-<string>com.smartdevicelink.prot25</string>
-<string>com.smartdevicelink.prot24</string>
-<string>com.smartdevicelink.prot23</string>
-<string>com.smartdevicelink.prot22</string>
-<string>com.smartdevicelink.prot21</string>
-<string>com.smartdevicelink.prot20</string>
-<string>com.smartdevicelink.prot19</string>
-<string>com.smartdevicelink.prot18</string>
-<string>com.smartdevicelink.prot17</string>
-<string>com.smartdevicelink.prot16</string>
-<string>com.smartdevicelink.prot15</string>
-<string>com.smartdevicelink.prot14</string>
-<string>com.smartdevicelink.prot13</string>
-<string>com.smartdevicelink.prot12</string>
-<string>com.smartdevicelink.prot11</string>
-<string>com.smartdevicelink.prot10</string>
-<string>com.smartdevicelink.prot9</string>
-<string>com.smartdevicelink.prot8</string>
-<string>com.smartdevicelink.prot7</string>
-<string>com.smartdevicelink.prot6</string>
-<string>com.smartdevicelink.prot5</string>
-<string>com.smartdevicelink.prot4</string>
-<string>com.smartdevicelink.prot3</string>
-<string>com.smartdevicelink.prot2</string>
-<string>com.smartdevicelink.prot1</string>
-<string>com.smartdevicelink.prot0</string>
-<string>com.ford.sync.prot0</string>
-<string>com.smartdevicelink.multisession</string>
-</array>
-```
+There are additional example apps available [in the example organization](https://github.com/smartdevicelink-examples/), these require CocoaPods to install dependencies.
-#### Continue Integrating
-Go through the [guide documentation](https://smartdevicelink.com/en/guides/iOS/getting-started/integration-basics/) to get started setting up your app to work with SDL!
+### Contributing to the Project
+We welcome contributors to the project, but it helps to know a few things about how the project is organized.
-### Running Tests
+1. All Pull Requests _must_ fix an issue. Before creating a PR for a bug or feature, ensure that there is an open issue for it. If there is not, open one!
+2. We recommend telling the project maintainers that you intend to contribute a PR for an issue. This allows us to internally track what PRs will be contributed and to plan time to review your PR. Furthermore, we may ask you not to work on a PR for that issue for various reasons (see below).
+3. We welcome PRs for bug fixes! If there's a confirmed issue for a bug, we would welcome a bug fix. The PR will require a review from a project maintainer before it can be merged.
+4. PRs for features require additional planning. Features must be approved by the SDLC using the [Evolution Process](https://github.com/smartdevicelink/sdl_evolution) before an issue can be opened. Furthermore, a feature must be approved to be developed for a release by the SDLC before a PR can be opened. Finally, a PR cannot be merged if the underlying feature requires or should have alignment across multiple projects until PRs for all those projects are ready for review.
+
+#### Preparing for Development
+To prepare the library for development, you will need to take a few steps:
+
+1. Clone this repository.
+1. Install submodules with `git submodule init` and `git submodule update`.
+1. Install [testing dependencies](#running-tests).
+1. Ensure that you can run the [Example test apps](#example-apps).
+
+#### Creating or Updating an RPC
+When creating or updating an RPC, you will need to install and use the [RPC generator](https://github.com/smartdevicelink/sdl_ios/tree/master/generator). The generator must be used to ensure that the content is correct. To use the generator, the RPC must be updated on the [RPC spec repository](https://github.com/smartdevicelink/rpc_spec).
+
+#### Running Tests
To run tests, you will need to bootstrap the Carthage testing libraries. To do so, first [install Carthage](https://github.com/Carthage/Carthage#installing-carthage).
Then, from the root project directory, run:
@@ -156,25 +80,23 @@ cd ../
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, run:
```bash
-xcodebuild -project "SmartDeviceLink-iOS.xcodeproj" -scheme "SmartDeviceLink" -sdk "iphonesimulator10.0" -destination "OS=10.0,name=iPhone 7" -configuration Debug ONLY_ACTIVE_ARCH=NO RUN_CLANG_STATIC_ANALYZER=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES ENABLE_TESTABILITY=YES test
-```
+xcodebuild build-for-testing -project SmartDeviceLink-iOS.xcodeproj -destination platform=iOS Simulator,name=iPhone 11,OS=13.5 -scheme SmartDeviceLink
-You can optionally pipe the result to [xcpretty](https://github.com/supermarin/xcpretty).
+set -o pipefail && xcodebuild test-without-building -project SmartDeviceLink-iOS.xcodeproj -destination platform=iOS Simulator,name=iPhone 11,OS=13.5 -scheme SmartDeviceLink -configuration Debug ONLY_ACTIVE_ARCH=NO RUN_CLANG_STATIC_ANALYZER=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES ENABLE_TESTABILITY=YES
+```
-#### Lock Screen Screenshot Tests
-We run some additional tests using [FBSnapshotTestCase](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 / iPhone XR simulator. If you run unit tests against those simulators, the tests should pass.
+##### 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
+###### 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;
+// 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 ac0d9f7a8..599a4566d 100644
--- a/SmartDeviceLink-iOS.podspec
+++ b/SmartDeviceLink-iOS.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink-iOS"
-s.version = "6.6.0"
+s.version = "6.7.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
@@ -12,12 +12,9 @@ s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :ta
s.requires_arc = true
s.resource_bundles = { 'SmartDeviceLink' => ['SmartDeviceLink/Assets/**/*'] }
-s.default_subspecs = 'Default'
+s.source_files = 'SmartDeviceLink/*.{h,m}'
-s.subspec 'Default' do |ss|
-ss.source_files = 'SmartDeviceLink/*.{h,m}'
-
-ss.public_header_files = [
+s.public_header_files = [
'SmartDeviceLink/NSNumber+NumberType.h',
'SmartDeviceLink/SDLAddCommand.h',
'SmartDeviceLink/SDLAddCommandResponse.h',
@@ -42,8 +39,8 @@ ss.public_header_files = [
'SmartDeviceLink/SDLArtwork.h',
'SmartDeviceLink/SDLAudioControlData.h',
'SmartDeviceLink/SDLAudioControlCapabilities.h',
-'SmartDeviceLink/SDLAudioFile.h',
'SmartDeviceLink/SDLAudioPassThruCapabilities.h',
+'SmartDeviceLink/SDLAudioFile.h',
'SmartDeviceLink/SDLAudioStreamingState.h',
'SmartDeviceLink/SDLAudioStreamingIndicator.h',
'SmartDeviceLink/SDLAudioStreamManager.h',
@@ -60,6 +57,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLButtonPressMode.h',
'SmartDeviceLink/SDLCancelInteraction.h',
'SmartDeviceLink/SDLCancelInteractionResponse.h',
+'SmartDeviceLink/SDLCapacityUnit.h',
'SmartDeviceLink/SDLCarModeStatus.h',
'SmartDeviceLink/SDLCarWindowViewController.h',
'SmartDeviceLink/SDLChangeRegistration.h',
@@ -104,12 +102,13 @@ ss.public_header_files = [
'SmartDeviceLink/SDLDialNumberResponse.h',
'SmartDeviceLink/SDLDIDResult.h',
'SmartDeviceLink/SDLDimension.h',
+'SmartDeviceLink/SDLDirection.h',
'SmartDeviceLink/SDLDisplayCapability.h',
'SmartDeviceLink/SDLDisplayCapabilities.h',
'SmartDeviceLink/SDLDisplayMode.h',
'SmartDeviceLink/SDLDisplayType.h',
'SmartDeviceLink/SDLDistanceUnit.h',
-'SmartDeviceLink/SDLDirection.h',
+'SmartDeviceLink/SDLDriverDistractionCapability.h',
'SmartDeviceLink/SDLDriverDistractionState.h',
'SmartDeviceLink/SDLECallConfirmationStatus.h',
'SmartDeviceLink/SDLECallInfo.h',
@@ -135,11 +134,11 @@ ss.public_header_files = [
'SmartDeviceLink/SDLFunctionID.h',
'SmartDeviceLink/SDLGearStatus.h',
'SmartDeviceLink/SDLGenericResponse.h',
-'SmartDeviceLink/SDLGetCloudAppProperties.h',
-'SmartDeviceLink/SDLGetCloudAppPropertiesResponse.h',
'SmartDeviceLink/SDLGetAppServiceData.h',
'SmartDeviceLink/SDLGetAppServiceDataResponse.h',
'SmartDeviceLink/SDLGetDTCs.h',
+'SmartDeviceLink/SDLGetCloudAppProperties.h',
+'SmartDeviceLink/SDLGetCloudAppPropertiesResponse.h',
'SmartDeviceLink/SDLGetDTCsResponse.h',
'SmartDeviceLink/SDLGetFile.h',
'SmartDeviceLink/SDLGetFileResponse.h',
@@ -205,15 +204,15 @@ ss.public_header_files = [
'SmartDeviceLink/SDLLogTargetAppleSystemLog.h',
'SmartDeviceLink/SDLLogTargetFile.h',
'SmartDeviceLink/SDLLogTargetOSLog.h',
+'SmartDeviceLink/SDLMacros.h',
+'SmartDeviceLink/SDLMaintenanceModeStatus.h',
+'SmartDeviceLink/SDLManager.h',
+'SmartDeviceLink/SDLManagerDelegate.h',
'SmartDeviceLink/SDLMassageCushionFirmness.h',
'SmartDeviceLink/SDLMassageModeData.h',
'SmartDeviceLink/SDLMassageCushion.h',
'SmartDeviceLink/SDLMassageMode.h',
'SmartDeviceLink/SDLMassageZone.h',
-'SmartDeviceLink/SDLMacros.h',
-'SmartDeviceLink/SDLMaintenanceModeStatus.h',
-'SmartDeviceLink/SDLManager.h',
-'SmartDeviceLink/SDLManagerDelegate.h',
'SmartDeviceLink/SDLMediaClockFormat.h',
'SmartDeviceLink/SDLMediaServiceData.h',
'SmartDeviceLink/SDLMediaServiceManifest.h',
@@ -268,6 +267,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLPerformInteraction.h',
'SmartDeviceLink/SDLPerformInteractionResponse.h',
'SmartDeviceLink/SDLPermissionConstants.h',
+'SmartDeviceLink/SDLPermissionElement.h',
'SmartDeviceLink/SDLPermissionItem.h',
'SmartDeviceLink/SDLPermissionManager.h',
'SmartDeviceLink/SDLPermissionStatus.h',
@@ -310,6 +310,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLRPCMessageType.h',
'SmartDeviceLink/SDLRPCNotification.h',
'SmartDeviceLink/SDLRPCNotificationNotification.h',
+'SmartDeviceLink/SDLRPCPermissionStatus.h',
'SmartDeviceLink/SDLRPCRequest.h',
'SmartDeviceLink/SDLRPCRequestNotification.h',
'SmartDeviceLink/SDLRPCResponse.h',
@@ -326,7 +327,6 @@ ss.public_header_files = [
'SmartDeviceLink/SDLSeatLocationCapability.h',
'SmartDeviceLink/SDLSeatMemoryAction.h',
'SmartDeviceLink/SDLSeatMemoryActionType.h',
-'SmartDeviceLink/SDLSupportedSeat.h',
'SmartDeviceLink/SDLSecurityType.h',
'SmartDeviceLink/SDLSendHapticData.h',
'SmartDeviceLink/SDLSendHapticDataResponse.h',
@@ -378,6 +378,7 @@ ss.public_header_files = [
'SmartDeviceLink/SDLSubscribeVehicleDataResponse.h',
'SmartDeviceLink/SDLSubscribeWaypoints.h',
'SmartDeviceLink/SDLSubscribeWaypointsResponse.h',
+'SmartDeviceLink/SDLSupportedSeat.h',
'SmartDeviceLink/SDLSyncMsgVersion.h',
'SmartDeviceLink/SDLMsgVersion.h',
'SmartDeviceLink/SDLSyncPData.h',
@@ -454,6 +455,5 @@ ss.public_header_files = [
'SmartDeviceLink/SDLWindowTypeCapabilities.h',
'SmartDeviceLink/SmartDeviceLink.h',
]
-end
end
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index b53153c1a..0e171c39b 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -38,11 +38,18 @@
00E22CED22C2F1B300BC6B08 /* SDLEncryptionConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E22CEB22C2F1B300BC6B08 /* SDLEncryptionConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
00EADD3322DFE54B0088B608 /* SDLEncryptionLifecycleManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 00EADD3222DFE54B0088B608 /* SDLEncryptionLifecycleManagerSpec.m */; };
00EADD3522DFE5670088B608 /* SDLEncryptionConfigurationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 00EADD3422DFE5670088B608 /* SDLEncryptionConfigurationSpec.m */; };
+ 106187B924AA75540045C4EC /* SDLRPCPermissionStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 106187B824AA75540045C4EC /* SDLRPCPermissionStatusSpec.m */; };
+ 106187BA24AA76550045C4EC /* SDLRPCPermissionStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 106982A824AA3B4700B1F649 /* SDLRPCPermissionStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 106412C6249FB80B0069A97A /* SDLPermissionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 106412C4249FB80B0069A97A /* SDLPermissionElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 106412C7249FB80B0069A97A /* SDLPermissionElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 106412C5249FB80B0069A97A /* SDLPermissionElement.m */; };
+ 106412C824A13F160069A97A /* SDLPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8204241BCEA8A600D0A41B /* SDLPermissionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 106982AB24AA3B4700B1F649 /* SDLRPCPermissionStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 106982A924AA3B4700B1F649 /* SDLRPCPermissionStatus.m */; };
10893C162417D78300BA347E /* SDLIconArchiveFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 10893C142417D78300BA347E /* SDLIconArchiveFile.h */; };
10893C172417D78300BA347E /* SDLIconArchiveFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 10893C152417D78300BA347E /* SDLIconArchiveFile.m */; };
10893C1A2418188600BA347E /* SDLCacheFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 10893C182418188600BA347E /* SDLCacheFileManager.h */; };
10893C1B2418188600BA347E /* SDLCacheFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 10893C192418188600BA347E /* SDLCacheFileManager.m */; };
109566F6242986F300E24F66 /* SDLCacheFileManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 109566F5242986F300E24F66 /* SDLCacheFileManagerSpec.m */; };
+ 1098F03824A39699004F53CC /* SDLPermissionElementSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1098F03724A39699004F53CC /* SDLPermissionElementSpec.m */; };
162E82CA1A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E81E21A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m */; };
162E82CB1A9BDE8A00906325 /* SDLAppHMITypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E81E31A9BDE8A00906325 /* SDLAppHMITypeSpec.m */; };
162E82CC1A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E81E41A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m */; };
@@ -142,7 +149,6 @@
162E832C1A9BDE8B00906325 /* SDLDiagnosticMessageSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82481A9BDE8A00906325 /* SDLDiagnosticMessageSpec.m */; };
162E832D1A9BDE8B00906325 /* SDLEncodedSyncPDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82491A9BDE8A00906325 /* SDLEncodedSyncPDataSpec.m */; };
162E832E1A9BDE8B00906325 /* SDLEndAudioPassThruSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824A1A9BDE8A00906325 /* SDLEndAudioPassThruSpec.m */; };
- 162E83301A9BDE8B00906325 /* SDLGetVehicleDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824C1A9BDE8A00906325 /* SDLGetVehicleDataSpec.m */; };
162E83311A9BDE8B00906325 /* SDLListFilesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824D1A9BDE8A00906325 /* SDLListFilesSpec.m */; };
162E83321A9BDE8B00906325 /* SDLPerformAudioPassThruSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824E1A9BDE8A00906325 /* SDLPerformAudioPassThruSpec.m */; };
162E83331A9BDE8B00906325 /* SDLPerformInteractionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824F1A9BDE8A00906325 /* SDLPerformInteractionSpec.m */; };
@@ -416,12 +422,31 @@
2BF2F85220ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BF2F85120ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m */; };
332A914F1CED9CC60043824C /* SDLAppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 332A913D1CED87F80043824C /* SDLAppInfo.m */; };
332A91501CED9CF10043824C /* SDLAppInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 332A913C1CED87F80043824C /* SDLAppInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4A1B036C24CF43CD008C6B13 /* SDLDriverDistractionCapability.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1B036A24CF43CD008C6B13 /* SDLDriverDistractionCapability.m */; };
+ 4A1B036D24CF43CD008C6B13 /* SDLDriverDistractionCapability.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A1B036B24CF43CD008C6B13 /* SDLDriverDistractionCapability.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4A1B036F24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1B036E24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m */; };
+ 4A26370C2493F0CF00278BE3 /* SDLRPCMessageType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A26370B2493F0CE00278BE3 /* SDLRPCMessageType.m */; };
+ 4A3BA4DC248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A3BA4DA248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.h */; };
+ 4A3BA4DD248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A3BA4DB248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.m */; };
+ 4A3BA4E1248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A3BA4DF248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.h */; };
+ 4A3BA4E2248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A3BA4E0248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.m */; };
+ 4A3BA4E724901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A3BA4E524901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.h */; };
+ 4A3BA4E824901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A3BA4E624901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.m */; };
+ 4A3BA4EC24914801003E56B8 /* SDLLifecycleProtocolHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A3BA4EA24914801003E56B8 /* SDLLifecycleProtocolHandler.h */; };
+ 4A3BA4ED24914801003E56B8 /* SDLLifecycleProtocolHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A3BA4EB24914801003E56B8 /* SDLLifecycleProtocolHandler.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 */; };
4A4AD8A424894260008FC414 /* TestOldConfigurationUpdateManagerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4AD8A324894260008FC414 /* TestOldConfigurationUpdateManagerDelegate.m */; };
4A4AD8A724894270008FC414 /* TestNewConfigurationUpdateManagerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A4AD8A624894270008FC414 /* TestNewConfigurationUpdateManagerDelegate.m */; };
4A99D00E247576B7009B43E6 /* SDLTextField+ScreenManagerExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A99D00C247576B7009B43E6 /* SDLTextField+ScreenManagerExtensions.h */; };
4A99D00F247576B7009B43E6 /* SDLTextField+ScreenManagerExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A99D00D247576B7009B43E6 /* SDLTextField+ScreenManagerExtensions.m */; };
4A99D0122475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A99D0102475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.h */; };
4A99D0132475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A99D0112475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.m */; };
+ 4A9D02BE2497EED400FBE99B /* SDLLifecycleRPCAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A9D02BC2497EED400FBE99B /* SDLLifecycleRPCAdapter.h */; };
+ 4A9D02BF2497EED400FBE99B /* SDLLifecycleRPCAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A9D02BD2497EED400FBE99B /* SDLLifecycleRPCAdapter.m */; };
5D00AC671F140F0A004000D9 /* SDLSystemCapabilityType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D00AC651F140F0A004000D9 /* SDLSystemCapabilityType.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D00AC681F140F0A004000D9 /* SDLSystemCapabilityType.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D00AC661F140F0A004000D9 /* SDLSystemCapabilityType.m */; };
5D00AC6B1F141339004000D9 /* SDLSystemCapability.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D00AC691F141339004000D9 /* SDLSystemCapability.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -766,7 +791,7 @@
5D61FCF91A84238C00846EE7 /* SDLMenuParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB0C1A84238A00846EE7 /* SDLMenuParams.m */; };
5D61FCFA1A84238C00846EE7 /* SDLMyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB0D1A84238A00846EE7 /* SDLMyKey.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FCFB1A84238C00846EE7 /* SDLMyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB0E1A84238A00846EE7 /* SDLMyKey.m */; };
- 5D61FCFC1A84238C00846EE7 /* SDLRPCParameterNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB0F1A84238A00846EE7 /* SDLRPCParameterNames.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 5D61FCFC1A84238C00846EE7 /* SDLRPCParameterNames.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB0F1A84238A00846EE7 /* SDLRPCParameterNames.h */; };
5D61FCFD1A84238C00846EE7 /* SDLObjectWithPriority.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB101A84238A00846EE7 /* SDLObjectWithPriority.h */; };
5D61FCFE1A84238C00846EE7 /* SDLObjectWithPriority.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB111A84238A00846EE7 /* SDLObjectWithPriority.m */; };
5D61FCFF1A84238C00846EE7 /* SDLOnAppInterfaceUnregistered.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB121A84238B00846EE7 /* SDLOnAppInterfaceUnregistered.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -819,8 +844,6 @@
5D61FD2E1A84238C00846EE7 /* SDLPermissionItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB411A84238B00846EE7 /* SDLPermissionItem.m */; };
5D61FD2F1A84238C00846EE7 /* SDLPermissionStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB421A84238B00846EE7 /* SDLPermissionStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FD301A84238C00846EE7 /* SDLPermissionStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB431A84238B00846EE7 /* SDLPermissionStatus.m */; };
- 5D61FD311A84238C00846EE7 /* SDLPolicyDataParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB441A84238B00846EE7 /* SDLPolicyDataParser.h */; };
- 5D61FD321A84238C00846EE7 /* SDLPolicyDataParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB451A84238B00846EE7 /* SDLPolicyDataParser.m */; };
5D61FD331A84238C00846EE7 /* SDLPowerModeQualificationStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB461A84238B00846EE7 /* SDLPowerModeQualificationStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FD341A84238C00846EE7 /* SDLPowerModeQualificationStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB471A84238B00846EE7 /* SDLPowerModeQualificationStatus.m */; };
5D61FD351A84238C00846EE7 /* SDLPowerModeStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB481A84238B00846EE7 /* SDLPowerModeStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -841,7 +864,7 @@
5D61FD441A84238C00846EE7 /* SDLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB571A84238B00846EE7 /* SDLProtocol.m */; };
5D61FD451A84238C00846EE7 /* SDLProtocolHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB581A84238B00846EE7 /* SDLProtocolHeader.h */; };
5D61FD461A84238C00846EE7 /* SDLProtocolHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB591A84238B00846EE7 /* SDLProtocolHeader.m */; };
- 5D61FD471A84238C00846EE7 /* SDLProtocolListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB5A1A84238B00846EE7 /* SDLProtocolListener.h */; };
+ 5D61FD471A84238C00846EE7 /* SDLProtocolDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB5A1A84238B00846EE7 /* SDLProtocolDelegate.h */; };
5D61FD481A84238C00846EE7 /* SDLProtocolMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB5B1A84238B00846EE7 /* SDLProtocolMessage.h */; };
5D61FD491A84238C00846EE7 /* SDLProtocolMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB5C1A84238B00846EE7 /* SDLProtocolMessage.m */; };
5D61FD4A1A84238C00846EE7 /* SDLProtocolMessageAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB5D1A84238B00846EE7 /* SDLProtocolMessageAssembler.h */; };
@@ -850,9 +873,6 @@
5D61FD4D1A84238C00846EE7 /* SDLProtocolMessageDisassembler.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB601A84238B00846EE7 /* SDLProtocolMessageDisassembler.m */; };
5D61FD4E1A84238C00846EE7 /* SDLProtocolReceivedMessageRouter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB611A84238B00846EE7 /* SDLProtocolReceivedMessageRouter.h */; };
5D61FD4F1A84238C00846EE7 /* SDLProtocolReceivedMessageRouter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB621A84238B00846EE7 /* SDLProtocolReceivedMessageRouter.m */; };
- 5D61FD501A84238C00846EE7 /* SDLProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB631A84238B00846EE7 /* SDLProxy.h */; };
- 5D61FD511A84238C00846EE7 /* SDLProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB641A84238B00846EE7 /* SDLProxy.m */; };
- 5D61FD541A84238C00846EE7 /* SDLProxyListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB671A84238B00846EE7 /* SDLProxyListener.h */; };
5D61FD551A84238C00846EE7 /* SDLPutFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB681A84238B00846EE7 /* SDLPutFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FD561A84238C00846EE7 /* SDLPutFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB691A84238B00846EE7 /* SDLPutFile.m */; };
5D61FD571A84238C00846EE7 /* SDLPutFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB6A1A84238B00846EE7 /* SDLPutFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -1073,7 +1093,6 @@
5D82041F1BCD8E6100D0A41B /* SDLConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D82041D1BCD8E6100D0A41B /* SDLConfiguration.m */; };
5D8204221BCEA89A00D0A41B /* SDLFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8204201BCEA89A00D0A41B /* SDLFileManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D8204231BCEA89A00D0A41B /* SDLFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8204211BCEA89A00D0A41B /* SDLFileManager.m */; };
- 5D8204261BCEA8A600D0A41B /* SDLPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8204241BCEA8A600D0A41B /* SDLPermissionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D8204271BCEA8A600D0A41B /* SDLPermissionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8204251BCEA8A600D0A41B /* SDLPermissionManager.m */; };
5D82042D1BCEC32F00D0A41B /* SDLFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D82042B1BCEC32F00D0A41B /* SDLFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D82042E1BCEC32F00D0A41B /* SDLFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D82042C1BCEC32F00D0A41B /* SDLFile.m */; };
@@ -1406,6 +1425,12 @@
888DBAF022D528DE002A0AE2 /* SDLCloseApplicationResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 888DBAEE22D528DE002A0AE2 /* SDLCloseApplicationResponse.m */; };
888F86FE221DEE200052FE4C /* SDLAsynchronousRPCOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 888F86FD221DEE1F0052FE4C /* SDLAsynchronousRPCOperation.m */; };
888F8700221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 888F86FF221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m */; };
+ 889E7BAF249CEE07002E4BE1 /* SubscribeButtonManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 889E7BAD249CEDCF002E4BE1 /* SubscribeButtonManager.swift */; };
+ 889E7BB2249D0877002E4BE1 /* SubscribeButtonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 889E7BB1249D0877002E4BE1 /* SubscribeButtonManager.m */; };
+ 88A098AE2476F0C200A50005 /* SDLSubscribeButtonManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A098AC2476F0C200A50005 /* SDLSubscribeButtonManager.h */; };
+ 88A098AF2476F0C200A50005 /* SDLSubscribeButtonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A098AD2476F0C200A50005 /* SDLSubscribeButtonManager.m */; };
+ 88A098B224770E7100A50005 /* SDLSubscribeButtonObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A098B024770E7100A50005 /* SDLSubscribeButtonObserver.h */; };
+ 88A098B324770E7100A50005 /* SDLSubscribeButtonObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A098B124770E7100A50005 /* SDLSubscribeButtonObserver.m */; };
88A118272412ACAD00B45FB5 /* SDLStreamingMediaManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA661E2B1E553E7E001C1345 /* SDLStreamingMediaManagerSpec.m */; };
88A1CF1E21669AC7001ACC75 /* SDLLifecycleConfigurationUpdateSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A1CF1D21669AC7001ACC75 /* SDLLifecycleConfigurationUpdateSpec.m */; };
88A4A0FA22242AB400C6F01D /* SDLNavigationServiceDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A4A0F922242AB400C6F01D /* SDLNavigationServiceDataSpec.m */; };
@@ -1444,6 +1469,7 @@
88B58DC922204C9E0011B063 /* SDLNavigationActionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B58DC822204C9E0011B063 /* SDLNavigationActionSpec.m */; };
88B848C31F45E1A600DED768 /* TestResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B848C21F45E1A600DED768 /* TestResponse.m */; };
88B848C91F462E3600DED768 /* TestFileProgressResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B848C81F462E3600DED768 /* TestFileProgressResponse.m */; };
+ 88B8657924A102AB003491AD /* TestSubscribeButtonObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B8657624A0FEB7003491AD /* TestSubscribeButtonObserver.m */; };
88BCEA922266250B00BB7E70 /* SDLIAPControlSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */; };
88BCEA932266250B00BB7E70 /* SDLIAPControlSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */; };
88BCEA952266592D00BB7E70 /* SDLIAPControlSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */; };
@@ -1452,6 +1478,8 @@
88C282CA220CD17200D02F90 /* SDLGetFileResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C282C9220CD17200D02F90 /* SDLGetFileResponseSpec.m */; };
88C37F632204EBF000901DC6 /* SDLAppServiceData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88C37F612204EBF000901DC6 /* SDLAppServiceData.h */; settings = {ATTRIBUTES = (Public, ); }; };
88C37F642204EBF000901DC6 /* SDLAppServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C37F622204EBF000901DC6 /* SDLAppServiceData.m */; };
+ 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 */; };
88D3EBC92267949D00493C38 /* SDLIAPDataSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */; };
88D3EBCA2267949D00493C38 /* SDLIAPDataSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */; };
@@ -1543,6 +1571,10 @@
9FE2471522D77AD500F8D2FC /* SDLWindowType.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FE2471322D77AD500F8D2FC /* SDLWindowType.h */; settings = {ATTRIBUTES = (Public, ); }; };
9FE2471622D77AD500F8D2FC /* SDLWindowType.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FE2471422D77AD500F8D2FC /* SDLWindowType.m */; };
9FE2471922D77AED00F8D2FC /* SDLPredefinedWindows.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FE2471722D77AED00F8D2FC /* SDLPredefinedWindows.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B38D8E61249FE28500B977D0 /* SDLCapacityUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = B38D8E5F249FE28500B977D0 /* SDLCapacityUnit.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B38D8E62249FE28500B977D0 /* SDLCapacityUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E60249FE28500B977D0 /* SDLCapacityUnit.m */; };
+ B38D8E8224A1F53500B977D0 /* SDLCapacityUnitSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */; };
+ B3F7918324E062C200DB5CAF /* SDLGetVehicleDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824C1A9BDE8A00906325 /* SDLGetVehicleDataSpec.m */; };
B38D8E6D24A034DB00B977D0 /* SDLGearStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B38D8E6B24A034DB00B977D0 /* SDLGearStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
B38D8E6E24A034DB00B977D0 /* SDLGearStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E6C24A034DB00B977D0 /* SDLGearStatus.m */; };
B38D8E7124A0351200B977D0 /* SDLTransmissionType.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E6F24A0351200B977D0 /* SDLTransmissionType.m */; };
@@ -1761,11 +1793,17 @@
00E22CEB22C2F1B300BC6B08 /* SDLEncryptionConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLEncryptionConfiguration.h; sourceTree = "<group>"; };
00EADD3222DFE54B0088B608 /* SDLEncryptionLifecycleManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLEncryptionLifecycleManagerSpec.m; sourceTree = "<group>"; };
00EADD3422DFE5670088B608 /* SDLEncryptionConfigurationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLEncryptionConfigurationSpec.m; sourceTree = "<group>"; };
+ 106187B824AA75540045C4EC /* SDLRPCPermissionStatusSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCPermissionStatusSpec.m; sourceTree = "<group>"; };
+ 106412C4249FB80B0069A97A /* SDLPermissionElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLPermissionElement.h; sourceTree = "<group>"; };
+ 106412C5249FB80B0069A97A /* SDLPermissionElement.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionElement.m; sourceTree = "<group>"; };
+ 106982A824AA3B4700B1F649 /* SDLRPCPermissionStatus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLRPCPermissionStatus.h; sourceTree = "<group>"; };
+ 106982A924AA3B4700B1F649 /* SDLRPCPermissionStatus.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCPermissionStatus.m; sourceTree = "<group>"; };
10893C142417D78300BA347E /* SDLIconArchiveFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIconArchiveFile.h; sourceTree = "<group>"; };
10893C152417D78300BA347E /* SDLIconArchiveFile.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIconArchiveFile.m; sourceTree = "<group>"; };
10893C182418188600BA347E /* SDLCacheFileManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLCacheFileManager.h; sourceTree = "<group>"; };
10893C192418188600BA347E /* SDLCacheFileManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCacheFileManager.m; sourceTree = "<group>"; };
109566F5242986F300E24F66 /* SDLCacheFileManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCacheFileManagerSpec.m; sourceTree = "<group>"; };
+ 1098F03724A39699004F53CC /* SDLPermissionElementSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionElementSpec.m; sourceTree = "<group>"; };
162E81E21A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAmbientLightStatusSpec.m; sourceTree = "<group>"; };
162E81E31A9BDE8A00906325 /* SDLAppHMITypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppHMITypeSpec.m; sourceTree = "<group>"; };
162E81E41A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppInterfaceUnregisteredReasonSpec.m; sourceTree = "<group>"; };
@@ -2139,6 +2177,23 @@
2BF2F85120ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAudioStreamingIndicatorSpec.m; sourceTree = "<group>"; };
332A913C1CED87F80043824C /* SDLAppInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLAppInfo.h; sourceTree = "<group>"; };
332A913D1CED87F80043824C /* SDLAppInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppInfo.m; sourceTree = "<group>"; };
+ 4A1B036A24CF43CD008C6B13 /* SDLDriverDistractionCapability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDriverDistractionCapability.m; sourceTree = "<group>"; };
+ 4A1B036B24CF43CD008C6B13 /* SDLDriverDistractionCapability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLDriverDistractionCapability.h; sourceTree = "<group>"; };
+ 4A1B036E24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLDriverDistractionCapabilitySpec.m; sourceTree = "<group>"; };
+ 4A26370B2493F0CE00278BE3 /* SDLRPCMessageType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCMessageType.m; sourceTree = "<group>"; };
+ 4A3BA4DA248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleSystemRequestHandler.h; sourceTree = "<group>"; };
+ 4A3BA4DB248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleSystemRequestHandler.m; sourceTree = "<group>"; };
+ 4A3BA4DF248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleSyncPDataHandler.h; sourceTree = "<group>"; };
+ 4A3BA4E0248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleSyncPDataHandler.m; sourceTree = "<group>"; };
+ 4A3BA4E524901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleMobileHMIStateHandler.h; sourceTree = "<group>"; };
+ 4A3BA4E624901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleMobileHMIStateHandler.m; sourceTree = "<group>"; };
+ 4A3BA4EA24914801003E56B8 /* SDLLifecycleProtocolHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleProtocolHandler.h; sourceTree = "<group>"; };
+ 4A3BA4EB24914801003E56B8 /* SDLLifecycleProtocolHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleProtocolHandler.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>"; };
4A4AD8A224894260008FC414 /* TestOldConfigurationUpdateManagerDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TestOldConfigurationUpdateManagerDelegate.h; path = DevAPISpecs/TestOldConfigurationUpdateManagerDelegate.h; sourceTree = "<group>"; };
4A4AD8A324894260008FC414 /* TestOldConfigurationUpdateManagerDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TestOldConfigurationUpdateManagerDelegate.m; path = DevAPISpecs/TestOldConfigurationUpdateManagerDelegate.m; sourceTree = "<group>"; };
4A4AD8A524894270008FC414 /* TestNewConfigurationUpdateManagerDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestNewConfigurationUpdateManagerDelegate.h; sourceTree = "<group>"; };
@@ -2147,6 +2202,8 @@
4A99D00D247576B7009B43E6 /* SDLTextField+ScreenManagerExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SDLTextField+ScreenManagerExtensions.m"; sourceTree = "<group>"; };
4A99D0102475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SDLImageField+ScreenManagerExtensions.h"; sourceTree = "<group>"; };
4A99D0112475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SDLImageField+ScreenManagerExtensions.m"; sourceTree = "<group>"; };
+ 4A9D02BC2497EED400FBE99B /* SDLLifecycleRPCAdapter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleRPCAdapter.h; sourceTree = "<group>"; };
+ 4A9D02BD2497EED400FBE99B /* SDLLifecycleRPCAdapter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleRPCAdapter.m; sourceTree = "<group>"; };
5D00AC651F140F0A004000D9 /* SDLSystemCapabilityType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLSystemCapabilityType.h; sourceTree = "<group>"; };
5D00AC661F140F0A004000D9 /* SDLSystemCapabilityType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityType.m; sourceTree = "<group>"; };
5D00AC691F141339004000D9 /* SDLSystemCapability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLSystemCapability.h; sourceTree = "<group>"; };
@@ -2584,8 +2641,6 @@
5D61FB411A84238B00846EE7 /* SDLPermissionItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionItem.m; sourceTree = "<group>"; };
5D61FB421A84238B00846EE7 /* SDLPermissionStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPermissionStatus.h; sourceTree = "<group>"; };
5D61FB431A84238B00846EE7 /* SDLPermissionStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionStatus.m; sourceTree = "<group>"; };
- 5D61FB441A84238B00846EE7 /* SDLPolicyDataParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPolicyDataParser.h; sourceTree = "<group>"; };
- 5D61FB451A84238B00846EE7 /* SDLPolicyDataParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPolicyDataParser.m; sourceTree = "<group>"; };
5D61FB461A84238B00846EE7 /* SDLPowerModeQualificationStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPowerModeQualificationStatus.h; sourceTree = "<group>"; };
5D61FB471A84238B00846EE7 /* SDLPowerModeQualificationStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPowerModeQualificationStatus.m; sourceTree = "<group>"; };
5D61FB481A84238B00846EE7 /* SDLPowerModeStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPowerModeStatus.h; sourceTree = "<group>"; };
@@ -2606,7 +2661,7 @@
5D61FB571A84238B00846EE7 /* SDLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLProtocol.m; sourceTree = "<group>"; };
5D61FB581A84238B00846EE7 /* SDLProtocolHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProtocolHeader.h; sourceTree = "<group>"; };
5D61FB591A84238B00846EE7 /* SDLProtocolHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLProtocolHeader.m; sourceTree = "<group>"; };
- 5D61FB5A1A84238B00846EE7 /* SDLProtocolListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProtocolListener.h; sourceTree = "<group>"; };
+ 5D61FB5A1A84238B00846EE7 /* SDLProtocolDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProtocolDelegate.h; sourceTree = "<group>"; };
5D61FB5B1A84238B00846EE7 /* SDLProtocolMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProtocolMessage.h; sourceTree = "<group>"; };
5D61FB5C1A84238B00846EE7 /* SDLProtocolMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLProtocolMessage.m; sourceTree = "<group>"; };
5D61FB5D1A84238B00846EE7 /* SDLProtocolMessageAssembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProtocolMessageAssembler.h; sourceTree = "<group>"; };
@@ -2615,9 +2670,6 @@
5D61FB601A84238B00846EE7 /* SDLProtocolMessageDisassembler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLProtocolMessageDisassembler.m; sourceTree = "<group>"; };
5D61FB611A84238B00846EE7 /* SDLProtocolReceivedMessageRouter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProtocolReceivedMessageRouter.h; sourceTree = "<group>"; };
5D61FB621A84238B00846EE7 /* SDLProtocolReceivedMessageRouter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLProtocolReceivedMessageRouter.m; sourceTree = "<group>"; };
- 5D61FB631A84238B00846EE7 /* SDLProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProxy.h; sourceTree = "<group>"; };
- 5D61FB641A84238B00846EE7 /* SDLProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLProxy.m; sourceTree = "<group>"; };
- 5D61FB671A84238B00846EE7 /* SDLProxyListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLProxyListener.h; sourceTree = "<group>"; };
5D61FB681A84238B00846EE7 /* SDLPutFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPutFile.h; sourceTree = "<group>"; };
5D61FB691A84238B00846EE7 /* SDLPutFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPutFile.m; sourceTree = "<group>"; };
5D61FB6A1A84238B00846EE7 /* SDLPutFileResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPutFileResponse.h; sourceTree = "<group>"; };
@@ -3164,6 +3216,13 @@
888DBAEE22D528DE002A0AE2 /* SDLCloseApplicationResponse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCloseApplicationResponse.m; sourceTree = "<group>"; };
888F86FD221DEE1F0052FE4C /* SDLAsynchronousRPCOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAsynchronousRPCOperation.m; sourceTree = "<group>"; };
888F86FF221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAsynchronousRPCOperationSpec.m; sourceTree = "<group>"; };
+ 889E7BAD249CEDCF002E4BE1 /* SubscribeButtonManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribeButtonManager.swift; sourceTree = "<group>"; };
+ 889E7BB0249D0877002E4BE1 /* SubscribeButtonManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubscribeButtonManager.h; sourceTree = "<group>"; };
+ 889E7BB1249D0877002E4BE1 /* SubscribeButtonManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SubscribeButtonManager.m; sourceTree = "<group>"; };
+ 88A098AC2476F0C200A50005 /* SDLSubscribeButtonManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSubscribeButtonManager.h; sourceTree = "<group>"; };
+ 88A098AD2476F0C200A50005 /* SDLSubscribeButtonManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSubscribeButtonManager.m; sourceTree = "<group>"; };
+ 88A098B024770E7100A50005 /* SDLSubscribeButtonObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSubscribeButtonObserver.h; sourceTree = "<group>"; };
+ 88A098B124770E7100A50005 /* SDLSubscribeButtonObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSubscribeButtonObserver.m; sourceTree = "<group>"; };
88A1CF1D21669AC7001ACC75 /* SDLLifecycleConfigurationUpdateSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleConfigurationUpdateSpec.m; sourceTree = "<group>"; };
88A4A0F922242AB400C6F01D /* SDLNavigationServiceDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLNavigationServiceDataSpec.m; sourceTree = "<group>"; };
88A5E7F3220B57F900495E8A /* SDLOnSystemCapabilityUpdatedSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLOnSystemCapabilityUpdatedSpec.m; sourceTree = "<group>"; };
@@ -3203,6 +3262,8 @@
88B848C21F45E1A600DED768 /* TestResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestResponse.m; sourceTree = "<group>"; };
88B848C71F462E3600DED768 /* TestFileProgressResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestFileProgressResponse.h; sourceTree = "<group>"; };
88B848C81F462E3600DED768 /* TestFileProgressResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestFileProgressResponse.m; sourceTree = "<group>"; };
+ 88B8657524A0FEB7003491AD /* TestSubscribeButtonObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TestSubscribeButtonObserver.h; path = ../SmartDeviceLink/TestSubscribeButtonObserver.h; sourceTree = "<group>"; };
+ 88B8657624A0FEB7003491AD /* TestSubscribeButtonObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TestSubscribeButtonObserver.m; path = ../SmartDeviceLink/TestSubscribeButtonObserver.m; sourceTree = "<group>"; };
88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPControlSession.h; sourceTree = "<group>"; };
88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPControlSession.m; sourceTree = "<group>"; };
88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPControlSessionSpec.m; sourceTree = "<group>"; };
@@ -3212,6 +3273,8 @@
88C282C9220CD17200D02F90 /* SDLGetFileResponseSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLGetFileResponseSpec.m; sourceTree = "<group>"; };
88C37F612204EBF000901DC6 /* SDLAppServiceData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLAppServiceData.h; sourceTree = "<group>"; };
88C37F622204EBF000901DC6 /* SDLAppServiceData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAppServiceData.m; sourceTree = "<group>"; };
+ 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>"; };
88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPDataSession.h; sourceTree = "<group>"; };
88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPDataSession.m; sourceTree = "<group>"; };
@@ -3305,6 +3368,9 @@
9FE2471322D77AD500F8D2FC /* SDLWindowType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLWindowType.h; sourceTree = "<group>"; };
9FE2471422D77AD500F8D2FC /* SDLWindowType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWindowType.m; sourceTree = "<group>"; };
9FE2471722D77AED00F8D2FC /* SDLPredefinedWindows.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLPredefinedWindows.h; sourceTree = "<group>"; };
+ B38D8E5F249FE28500B977D0 /* SDLCapacityUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLCapacityUnit.h; sourceTree = "<group>"; };
+ B38D8E60249FE28500B977D0 /* SDLCapacityUnit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLCapacityUnit.m; sourceTree = "<group>"; };
+ B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCapacityUnitSpec.m; sourceTree = "<group>"; };
B38D8E6B24A034DB00B977D0 /* SDLGearStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLGearStatus.h; sourceTree = "<group>"; };
B38D8E6C24A034DB00B977D0 /* SDLGearStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLGearStatus.m; sourceTree = "<group>"; };
B38D8E6F24A0351200B977D0 /* SDLTransmissionType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLTransmissionType.m; sourceTree = "<group>"; };
@@ -3489,6 +3555,7 @@
00E22CE922C2F1A400BC6B08 /* Configuration */,
001A08B22321ACE90078A31E /* Delegates */,
005DF3BE22C590FB006E01A9 /* Lifecycle */,
+ 5D6CC8ED1C610E490027F60A /* Security */,
005DF3C722C62DDA006E01A9 /* Utilities */,
);
name = Encryption;
@@ -3558,6 +3625,7 @@
162E81E81A9BDE8A00906325 /* SDLButtonEventModeSpec.m */,
162E81E91A9BDE8A00906325 /* SDLButtonNameSpec.m */,
162E81EA1A9BDE8A00906325 /* SDLButtonPressModeSpec.m */,
+ B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */,
162E81EB1A9BDE8A00906325 /* SDLCarModeStatusSpec.m */,
162E81EC1A9BDE8A00906325 /* SDLCharacterSetSpec.m */,
162E81ED1A9BDE8A00906325 /* SDLCompassDirectionSpec.m */,
@@ -3861,6 +3929,7 @@
162E82981A9BDE8A00906325 /* SDLDIDResult.m */,
9FA0D00522DF06D3009CF344 /* SDLDisplayCapabilitySpec.m */,
162E82991A9BDE8A00906325 /* SDLDisplayCapabilitiesSpec.m */,
+ 4A1B036E24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m */,
162E829A1A9BDE8A00906325 /* SDLECallInfoSpec.m */,
162E829B1A9BDE8A00906325 /* SDLEmergencyEventSpec.m */,
88B3BFA120DA911E00943565 /* SDLFuelRangeSpec.m */,
@@ -4005,6 +4074,52 @@
path = MessageSpecs;
sourceTree = "<group>";
};
+ 4A3BA4D9248E8EBB003E56B8 /* SystemRequest Handler */ = {
+ isa = PBXGroup;
+ children = (
+ 4A3BA4DA248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.h */,
+ 4A3BA4DB248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.m */,
+ );
+ name = "SystemRequest Handler";
+ sourceTree = "<group>";
+ };
+ 4A3BA4DE248EB117003E56B8 /* SyncPData Handler */ = {
+ isa = PBXGroup;
+ children = (
+ 4A3BA4DF248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.h */,
+ 4A3BA4E0248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.m */,
+ );
+ name = "SyncPData Handler";
+ sourceTree = "<group>";
+ };
+ 4A3BA4E324900962003E56B8 /* Custom RPC Handlers */ = {
+ isa = PBXGroup;
+ children = (
+ 4A3BA4E42490177A003E56B8 /* Mobile HMI State Handler */,
+ 4A3BA4DE248EB117003E56B8 /* SyncPData Handler */,
+ 4A3BA4D9248E8EBB003E56B8 /* SystemRequest Handler */,
+ );
+ name = "Custom RPC Handlers";
+ sourceTree = "<group>";
+ };
+ 4A3BA4E42490177A003E56B8 /* Mobile HMI State Handler */ = {
+ isa = PBXGroup;
+ children = (
+ 4A3BA4E524901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.h */,
+ 4A3BA4E624901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.m */,
+ );
+ name = "Mobile HMI State Handler";
+ sourceTree = "<group>";
+ };
+ 4A3BA4E9249147E6003E56B8 /* Protocol Delegate Handler */ = {
+ isa = PBXGroup;
+ children = (
+ 4A3BA4EA24914801003E56B8 /* SDLLifecycleProtocolHandler.h */,
+ 4A3BA4EB24914801003E56B8 /* SDLLifecycleProtocolHandler.m */,
+ );
+ name = "Protocol Delegate Handler";
+ sourceTree = "<group>";
+ };
4A4AD8A12489422F008FC414 /* Utilities */ = {
isa = PBXGroup;
children = (
@@ -4016,6 +4131,24 @@
name = Utilities;
sourceTree = "<group>";
};
+ 4A9D02BB2497EEB400FBE99B /* Custom RPC Adapters */ = {
+ isa = PBXGroup;
+ children = (
+ 4A9D02BC2497EED400FBE99B /* SDLLifecycleRPCAdapter.h */,
+ 4A9D02BD2497EED400FBE99B /* SDLLifecycleRPCAdapter.m */,
+ );
+ name = "Custom RPC Adapters";
+ sourceTree = "<group>";
+ };
+ 4A9D02C02497F9AA00FBE99B /* Status Manager */ = {
+ isa = PBXGroup;
+ children = (
+ 5D61FB031A84238A00846EE7 /* SDLLockScreenStatusManager.h */,
+ 5D61FB041A84238A00846EE7 /* SDLLockScreenStatusManager.m */,
+ );
+ name = "Status Manager";
+ sourceTree = "<group>";
+ };
5D0218EB1A8E795700D1BF62 /* UI */ = {
isa = PBXGroup;
children = (
@@ -4059,6 +4192,7 @@
5D92935720B33D3C00FCC775 /* Choice Set */,
5D339CE5207C0651000CC364 /* Menu */,
5D0A737F203F23D10001595D /* Soft Button */,
+ 88A098AB2476F08F00A50005 /* Subscribe Button */,
5D0A737D203F23B30001595D /* Text and Graphic */,
5D1BF6AA2047429C00D36881 /* Utilities */,
5DAD5F7D204DEDEB0025624C /* SDLScreenManager.h */,
@@ -4125,6 +4259,11 @@
5D60DF23202B7A80001EDA01 /* SDLAsynchronousRPCRequestOperationSpec.m */,
5D60DF25202B7A97001EDA01 /* SDLSequentialRPCRequestOperationSpec.m */,
88A1CF1D21669AC7001ACC75 /* SDLLifecycleConfigurationUpdateSpec.m */,
+ 4A457DC224A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m */,
+ 4A457DD224A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m */,
+ 4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */,
+ 4A457DD624A3CCED00386CBA /* SDLLifecycleSystemRequestHandlerSpec.m */,
+ 4A457DD824A5137100386CBA /* SDLLifecycleProtocolHandlerSpec.m */,
);
name = Lifecycle;
sourceTree = "<group>";
@@ -4132,8 +4271,11 @@
5D1654571D3E79CA00554D93 /* Lifecycle */ = {
isa = PBXGroup;
children = (
- 5D07C0342044AD1900D1ECDC /* Request Operations */,
5D0A7378203F0CB10001595D /* Configuration */,
+ 4A9D02BB2497EEB400FBE99B /* Custom RPC Adapters */,
+ 4A3BA4E324900962003E56B8 /* Custom RPC Handlers */,
+ 4A3BA4E9249147E6003E56B8 /* Protocol Delegate Handler */,
+ 5D07C0342044AD1900D1ECDC /* Request Operations */,
5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */,
5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */,
);
@@ -4381,6 +4523,8 @@
5D1FF29621304514000EB9B4 /* ProxyManager.m */,
5D1FF29821304514000EB9B4 /* RPCPermissionsManager.h */,
5D1FF29221304513000EB9B4 /* RPCPermissionsManager.m */,
+ 889E7BB0249D0877002E4BE1 /* SubscribeButtonManager.h */,
+ 889E7BB1249D0877002E4BE1 /* SubscribeButtonManager.m */,
5D1FF29021304513000EB9B4 /* VehicleDataManager.h */,
5D1FF29921304514000EB9B4 /* VehicleDataManager.m */,
);
@@ -4398,22 +4542,6 @@
name = Transition;
sourceTree = "<group>";
};
- 5D5934ED1A85160400687FB9 /* Proxy */ = {
- isa = PBXGroup;
- children = (
- EE798CA2205611DC008EDE8E /* Secondary Transport */,
- 5D6CC8ED1C610E490027F60A /* Security */,
- 5D5934FE1A851B2500687FB9 /* @protocols */,
- 5D61FB031A84238A00846EE7 /* SDLLockScreenStatusManager.h */,
- 5D61FB041A84238A00846EE7 /* SDLLockScreenStatusManager.m */,
- 5D61FB441A84238B00846EE7 /* SDLPolicyDataParser.h */,
- 5D61FB451A84238B00846EE7 /* SDLPolicyDataParser.m */,
- 5D61FB631A84238B00846EE7 /* SDLProxy.h */,
- 5D61FB641A84238B00846EE7 /* SDLProxy.m */,
- );
- name = Proxy;
- sourceTree = "<group>";
- };
5D5934EE1A85160900687FB9 /* Protocol */ = {
isa = PBXGroup;
children = (
@@ -4441,12 +4569,12 @@
isa = PBXGroup;
children = (
5D5934FF1A851B8400687FB9 /* Superclasses */,
+ 5D5934F41A85165E00687FB9 /* Enums */,
+ 5D5934F81A8519C300687FB9 /* Notification */,
5D5935041A851E1A00687FB9 /* Payload */,
5D5934F11A85162800687FB9 /* Requests */,
5D5934F21A85163200687FB9 /* Responses */,
5D5934F31A85164500687FB9 /* Structs */,
- 5D5934F41A85165E00687FB9 /* Enums */,
- 5D5934F81A8519C300687FB9 /* Notification */,
);
name = RPCs;
sourceTree = "<group>";
@@ -4454,9 +4582,10 @@
5D5934F01A85161A00687FB9 /* Transport */ = {
isa = PBXGroup;
children = (
- 5DAB5F592098E8CB00A020C8 /* TCP */,
- 5DAB5F582098E8BC00A020C8 /* IAP */,
5D5935001A851D0B00687FB9 /* @protocols */,
+ 5DAB5F582098E8BC00A020C8 /* IAP */,
+ 5DAB5F592098E8CB00A020C8 /* TCP */,
+ EE798CA2205611DC008EDE8E /* Secondary Transport */,
);
name = Transport;
sourceTree = "<group>";
@@ -4780,6 +4909,8 @@
9F425AD922DD983500BE3245 /* SDLDisplayCapability.m */,
5D61FAA31A84238A00846EE7 /* SDLDisplayCapabilities.h */,
5D61FAA41A84238A00846EE7 /* SDLDisplayCapabilities.m */,
+ 4A1B036B24CF43CD008C6B13 /* SDLDriverDistractionCapability.h */,
+ 4A1B036A24CF43CD008C6B13 /* SDLDriverDistractionCapability.m */,
5D61FAAB1A84238A00846EE7 /* SDLECallInfo.h */,
5D61FAAC1A84238A00846EE7 /* SDLECallInfo.m */,
5D61FAAD1A84238A00846EE7 /* SDLEmergencyEvent.h */,
@@ -4975,6 +5106,8 @@
5D61FA691A84238A00846EE7 /* SDLButtonName.m */,
5D61FA6A1A84238A00846EE7 /* SDLButtonPressMode.h */,
5D61FA6B1A84238A00846EE7 /* SDLButtonPressMode.m */,
+ B38D8E5F249FE28500B977D0 /* SDLCapacityUnit.h */,
+ B38D8E60249FE28500B977D0 /* SDLCapacityUnit.m */,
5D61FA6C1A84238A00846EE7 /* SDLCarModeStatus.h */,
5D61FA6D1A84238A00846EE7 /* SDLCarModeStatus.m */,
5D61FA721A84238A00846EE7 /* SDLCharacterSet.h */,
@@ -5093,6 +5226,7 @@
5D61FB7A1A84238B00846EE7 /* SDLResult.h */,
5D61FB7B1A84238B00846EE7 /* SDLResult.m */,
5D61FB7E1A84238B00846EE7 /* SDLRPCMessageType.h */,
+ 4A26370B2493F0CE00278BE3 /* SDLRPCMessageType.m */,
5D61FB8A1A84238B00846EE7 /* SDLSamplingRate.h */,
5D61FB8B1A84238B00846EE7 /* SDLSamplingRate.m */,
1EB59CB1202D9B5F00343A61 /* SDLSeatMemoryActionType.h */,
@@ -5280,15 +5414,7 @@
5D5934FA1A851AC900687FB9 /* @protocols */ = {
isa = PBXGroup;
children = (
- 5D61FB5A1A84238B00846EE7 /* SDLProtocolListener.h */,
- );
- name = "@protocols";
- sourceTree = "<group>";
- };
- 5D5934FE1A851B2500687FB9 /* @protocols */ = {
- isa = PBXGroup;
- children = (
- 5D61FB671A84238B00846EE7 /* SDLProxyListener.h */,
+ 5D61FB5A1A84238B00846EE7 /* SDLProtocolDelegate.h */,
);
name = "@protocols";
sourceTree = "<group>";
@@ -5357,17 +5483,6 @@
name = Payload;
sourceTree = "<group>";
};
- 5D59DD451B14FDD000BE744D /* ProxySpecs */ = {
- isa = PBXGroup;
- children = (
- 1FF7DABF1F75CF6C00B46C30 /* SDLHapticManagerSpec.m */,
- 5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */,
- DA661E2B1E553E7E001C1345 /* SDLStreamingMediaManagerSpec.m */,
- EEB2537D2067D3E80069584E /* SDLSecondaryTransportManagerSpec.m */,
- );
- name = ProxySpecs;
- sourceTree = "<group>";
- };
5D6008871BE3ED470094A505 /* State Machine */ = {
isa = PBXGroup;
children = (
@@ -5407,10 +5522,9 @@
5DA3F3511BC4477B0026F2D0 /* Developer API */,
5D5934F61A85189500687FB9 /* Utilities */,
5D5934F51A8516C800687FB9 /* Logging */,
- 5D5934F01A85161A00687FB9 /* Transport */,
5D5934EF1A85160F00687FB9 /* RPCs */,
5D5934EE1A85160900687FB9 /* Protocol */,
- 5D5934ED1A85160400687FB9 /* Proxy */,
+ 5D5934F01A85161A00687FB9 /* Transport */,
5D61FA201A84237100846EE7 /* SmartDeviceLink.h */,
5D1665A01CF5D5DA00CC4CA1 /* .gitignore */,
5D1665A11CF5D5DA00CC4CA1 /* .travis.yml */,
@@ -5441,11 +5555,10 @@
167ED9231A9BB86300797BE5 /* Libraries */,
5DAE06711BDEC68700F9B498 /* Developer API Tests */,
5D4346431E6F0B5600B639C6 /* LoggingSpecs */,
- 5D59DD451B14FDD000BE744D /* ProxySpecs */,
- 5DB92D201AC47AC400C15BB0 /* UtilitiesSpecs */,
1680B1041A9CD7AD00DBD79E /* ProtocolSpecs */,
- EE5D1B31208EBC7100D17216 /* TransportSpecs */,
162E81E01A9BDE8A00906325 /* RPCSpecs */,
+ EE5D1B31208EBC7100D17216 /* TransportSpecs */,
+ 5DB92D201AC47AC400C15BB0 /* UtilitiesSpecs */,
5D61FA2D1A84237100846EE7 /* Supporting Files */,
167ED9451A9BCE5D00797BE5 /* SwiftSpec.swift */,
);
@@ -5531,6 +5644,7 @@
children = (
5D76E3261D3D0A4700647CFA /* Utilities */,
5D76E31B1D3805FF00647CFA /* SDLLockScreenManagerSpec.m */,
+ 5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */,
);
name = LockScreen;
sourceTree = "<group>";
@@ -5599,6 +5713,10 @@
5D1665C71CF8CA3D00CC4CA1 /* SDLPermissionFilter.m */,
5D8204241BCEA8A600D0A41B /* SDLPermissionManager.h */,
5D8204251BCEA8A600D0A41B /* SDLPermissionManager.m */,
+ 106412C4249FB80B0069A97A /* SDLPermissionElement.h */,
+ 106412C5249FB80B0069A97A /* SDLPermissionElement.m */,
+ 106982A824AA3B4700B1F649 /* SDLRPCPermissionStatus.h */,
+ 106982A924AA3B4700B1F649 /* SDLRPCPermissionStatus.m */,
);
name = Permissions;
sourceTree = "<group>";
@@ -5688,6 +5806,8 @@
children = (
5D9F50801BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m */,
5DB1BCD71D243AA6002FFC37 /* SDLPermissionFilterSpec.m */,
+ 1098F03724A39699004F53CC /* SDLPermissionElementSpec.m */,
+ 106187B824AA75540045C4EC /* SDLRPCPermissionStatusSpec.m */,
);
name = Permissions;
sourceTree = "<group>";
@@ -5875,6 +5995,7 @@
5DAD5F8120507DE40025624C /* Screen */ = {
isa = PBXGroup;
children = (
+ 88D0E5D42478656B009469AB /* Subscribe Button */,
5DE35E4320CAFBEA0034BE5A /* Choice Set */,
5DF40B24208FA7C500DD6FDA /* Menu */,
5DAD5F8220507DED0025624C /* Soft Button */,
@@ -6015,6 +6136,7 @@
children = (
5D0A7376203F0C8F0001595D /* Configuration */,
5D6F7A301BC5B7100070BF37 /* Lock Screen UI */,
+ 4A9D02C02497F9AA00FBE99B /* Status Manager */,
5D76E31F1D39731100647CFA /* Utilities */,
5D4D67B21D30161600468B4A /* SDLLockScreenManager.h */,
5D4D67B31D30161600468B4A /* SDLLockScreenManager.m */,
@@ -6030,8 +6152,8 @@
5D1654571D3E79CA00554D93 /* Lifecycle */,
5DBAE0A51D355EE700CE00BF /* Lock Screen */,
5D8204291BCEA91400D0A41B /* Permissions */,
- DA8966E71E56937100413EAB /* Streaming */,
5D0A736F203F0C450001595D /* Screen */,
+ DA8966E71E56937100413EAB /* Streaming */,
880E35B12088F73400181259 /* System Capabilities */,
5DA3F36E1BC4489A0026F2D0 /* SDLManager.h */,
5DA3F36F1BC4489A0026F2D0 /* SDLManager.m */,
@@ -6056,13 +6178,13 @@
isa = PBXGroup;
children = (
00EADD3122DFDF680088B608 /* Encryption */,
- 5DAD5F8120507DE40025624C /* Screen */,
- DA8966ED1E5693D100413EAB /* Streaming */,
- 880E35B62088F77C00181259 /* System Capabilities */,
+ 5D9F507E1BE7E46600FEF399 /* Files */,
5D1654541D3E753100554D93 /* Lifecycle */,
5D76E31A1D3805E600647CFA /* LockScreen */,
5D9F507F1BE7E6C900FEF399 /* Permissions */,
- 5D9F507E1BE7E46600FEF399 /* Files */,
+ 5DAD5F8120507DE40025624C /* Screen */,
+ DA8966ED1E5693D100413EAB /* Streaming */,
+ 880E35B62088F77C00181259 /* System Capabilities */,
5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */,
);
name = Managers;
@@ -6319,6 +6441,7 @@
5D1FF2D721304746000EB9B4 /* PerformInteractionManager.swift */,
5D1FF2D321304745000EB9B4 /* ProxyManager.swift */,
5D1FF2D521304746000EB9B4 /* RPCPermissionsManager.swift */,
+ 889E7BAD249CEDCF002E4BE1 /* SubscribeButtonManager.swift */,
5D1FF2D921304746000EB9B4 /* VehicleDataManager.swift */,
);
name = SDL;
@@ -6387,6 +6510,17 @@
name = "Data Session";
sourceTree = "<group>";
};
+ 88A098AB2476F08F00A50005 /* Subscribe Button */ = {
+ isa = PBXGroup;
+ children = (
+ 88A098AC2476F0C200A50005 /* SDLSubscribeButtonManager.h */,
+ 88A098AD2476F0C200A50005 /* SDLSubscribeButtonManager.m */,
+ 88A098B024770E7100A50005 /* SDLSubscribeButtonObserver.h */,
+ 88A098B124770E7100A50005 /* SDLSubscribeButtonObserver.m */,
+ );
+ name = "Subscribe Button";
+ sourceTree = "<group>";
+ };
88A0AA5F207CFEA60075132C /* Connection */ = {
isa = PBXGroup;
children = (
@@ -6438,6 +6572,17 @@
path = "DevAPISpecs/Notification Tests";
sourceTree = "<group>";
};
+ 88D0E5D42478656B009469AB /* Subscribe Button */ = {
+ isa = PBXGroup;
+ children = (
+ 88D0E5D524786580009469AB /* SDLSubscribeButtonManagerSpec.m */,
+ 88D0E5D724786770009469AB /* SDLSubscribeButtonObserverSpec.m */,
+ 88B8657524A0FEB7003491AD /* TestSubscribeButtonObserver.h */,
+ 88B8657624A0FEB7003491AD /* TestSubscribeButtonObserver.m */,
+ );
+ name = "Subscribe Button";
+ sourceTree = "<group>";
+ };
88DF998A22035CA400477AC1 /* TCP */ = {
isa = PBXGroup;
children = (
@@ -6474,6 +6619,7 @@
DA4353E71D2721680099B8C4 /* SDLTouchManagerSpec.m */,
DA4353E81D2721680099B8C4 /* SDLTouchSpec.m */,
DA4353DE1D271FD10099B8C4 /* CGPointUtilSpec.m */,
+ 1FF7DABF1F75CF6C00B46C30 /* SDLHapticManagerSpec.m */,
DA4353E21D2720A30099B8C4 /* SDLPinchGestureSpec.m */,
);
name = Touches;
@@ -6512,9 +6658,11 @@
DA8966ED1E5693D100413EAB /* Streaming */ = {
isa = PBXGroup;
children = (
- 5DEF69621FD6FEB6004B8C2F /* Video */,
5DEF69591FD5FE74004B8C2F /* Audio Manager */,
DA1166D71D14601C00438CEA /* Touches */,
+ 5DEF69621FD6FEB6004B8C2F /* Video */,
+ EEB2537D2067D3E80069584E /* SDLSecondaryTransportManagerSpec.m */,
+ DA661E2B1E553E7E001C1345 /* SDLStreamingMediaManagerSpec.m */,
);
name = Streaming;
sourceTree = "<group>";
@@ -6601,6 +6749,8 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
+ 106412C824A13F160069A97A /* SDLPermissionManager.h in Headers */,
+ 106412C6249FB80B0069A97A /* SDLPermissionElement.h in Headers */,
9F425AD222DD980200BE3245 /* SDLWindowCapability.h in Headers */,
9F425ADA22DD983500BE3245 /* SDLDisplayCapability.h in Headers */,
9F425ACE22DD97DE00BE3245 /* SDLTemplateConfiguration.h in Headers */,
@@ -6631,6 +6781,7 @@
0055412E22D759BD003194D3 /* SDLSeatLocation.h in Headers */,
1EAA475120356CD2000FE74B /* SDLDistanceUnit.h in Headers */,
1EAA4755203583BC000FE74B /* SDLHMISettingsControlData.h in Headers */,
+ 4A3BA4DC248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.h in Headers */,
1EAA4731203442C0000FE74B /* SDLLightName.h in Headers */,
1EAA472D20344108000FE74B /* SDLLightStatus.h in Headers */,
8831FA4222022AB300B8FFB7 /* SDLAppServiceCapability.h in Headers */,
@@ -6688,6 +6839,7 @@
5D61FD831A84238C00846EE7 /* SDLSetDisplayLayout.h in Headers */,
5D61FCC91A84238C00846EE7 /* SDLIgnitionStableStatus.h in Headers */,
884E701F21FB983F008D53BA /* SDLAppServiceManifest.h in Headers */,
+ 4A3BA4EC24914801003E56B8 /* SDLLifecycleProtocolHandler.h in Headers */,
DA9F7E6B1DCBFB0700ACAE48 /* SDLDeliveryMode.h in Headers */,
DA9F7E871DCC049900ACAE48 /* SDLSubscribeWayPoints.h in Headers */,
88D99DB52289C82F0039E047 /* SDLIAPControlSessionDelegate.h in Headers */,
@@ -6713,6 +6865,7 @@
5D61FCC71A84238C00846EE7 /* SDLIAPTransport.h in Headers */,
5D61FC6D1A84238C00846EE7 /* SDLCreateInteractionChoiceSetResponse.h in Headers */,
5D8204221BCEA89A00D0A41B /* SDLFileManager.h in Headers */,
+ 4A9D02BE2497EED400FBE99B /* SDLLifecycleRPCAdapter.h in Headers */,
5D4D67B41D30161600468B4A /* SDLLockScreenManager.h in Headers */,
5D00AC7B1F15287E004000D9 /* SDLPhoneCapability.h in Headers */,
5D61FE111A84238C00846EE7 /* SDLWarningLightStatus.h in Headers */,
@@ -6834,6 +6987,7 @@
5D61FDF11A84238C00846EE7 /* SDLUpdateTurnList.h in Headers */,
5DB996571F268ECB002D8795 /* SDLControlFramePayloadAudioStartServiceAck.h in Headers */,
5D61FD671A84238C00846EE7 /* SDLResult.h in Headers */,
+ 88A098AE2476F0C200A50005 /* SDLSubscribeButtonManager.h in Headers */,
755F176222A00B7C0041B9CB /* SDLMenuManagerConstants.h in Headers */,
5D61FD351A84238C00846EE7 /* SDLPowerModeStatus.h in Headers */,
5D61FD971A84238C00846EE7 /* SDLSingleTireStatus.h in Headers */,
@@ -6914,6 +7068,7 @@
5D0A738A203F24320001595D /* SDLSoftButtonObject.h in Headers */,
5D61FDB31A84238C00846EE7 /* SDLSubscribeVehicleDataResponse.h in Headers */,
5D92935A20B33D4F00FCC775 /* SDLChoiceCell.h in Headers */,
+ B38D8E61249FE28500B977D0 /* SDLCapacityUnit.h in Headers */,
5D61FC961A84238C00846EE7 /* SDLECallConfirmationStatus.h in Headers */,
5D4D67AC1D2ED37A00468B4A /* SDLNotificationDispatcher.h in Headers */,
5D61FDA51A84238C00846EE7 /* SDLSpeak.h in Headers */,
@@ -6928,7 +7083,6 @@
5D61FCD31A84238C00846EE7 /* SDLImageResolution.h in Headers */,
8B7B319E1F2F7CF700BDC38D /* SDLVideoStreamingProtocol.h in Headers */,
88E6F1A7220E1588006156F9 /* SDLMediaType.h in Headers */,
- 5D61FD541A84238C00846EE7 /* SDLProxyListener.h in Headers */,
88A5E7FD220B642200495E8A /* SDLGetAppServiceDataResponse.h in Headers */,
5D61FC5D1A84238C00846EE7 /* SDLChangeRegistrationResponse.h in Headers */,
5D61FDCD1A84238C00846EE7 /* SDLTimerMode.h in Headers */,
@@ -6937,7 +7091,6 @@
1FF7DAB81F75B28E00B46C30 /* SDLFocusableItemHitTester.h in Headers */,
5D61FC3D1A84238C00846EE7 /* SDLAlertResponse.h in Headers */,
5D61FDAD1A84238C00846EE7 /* SDLSubscribeButton.h in Headers */,
- 5D8204261BCEA8A600D0A41B /* SDLPermissionManager.h in Headers */,
5D61FCF41A84238C00846EE7 /* SDLMaintenanceModeStatus.h in Headers */,
5D61FC571A84238C00846EE7 /* SDLButtonPressMode.h in Headers */,
5D3E487B1D6F888E0000BFEF /* SDLRPCResponseNotification.h in Headers */,
@@ -7036,6 +7189,7 @@
1E5AD04C1F1F79640029B8AF /* SDLDefrostZone.h in Headers */,
1E5AD0601F207AB10029B8AF /* SDLRadioState.h in Headers */,
1E5AD0801F20B73E0029B8AF /* SDLButtonPress.h in Headers */,
+ 106187BA24AA76550045C4EC /* SDLRPCPermissionStatus.h in Headers */,
884554AC222453A800BAFB6C /* SDLNavigationServiceManifest.h in Headers */,
8816772C222097C3001FACFF /* SDLNavigationServiceData.h in Headers */,
1E5AD05C1F2064A80029B8AF /* SDLRDSData.h in Headers */,
@@ -7048,12 +7202,12 @@
5D61FD911A84238C00846EE7 /* SDLShowConstantTBT.h in Headers */,
5D92937C20B70A3E00FCC775 /* SDLPresentKeyboardOperation.h in Headers */,
5D61FC331A84238C00846EE7 /* SDLAddSubMenuResponse.h in Headers */,
+ 4A3BA4E724901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.h in Headers */,
5D61FD5D1A84238C00846EE7 /* SDLRegisterAppInterface.h in Headers */,
5D61FC9A1A84238C00846EE7 /* SDLEmergencyEvent.h in Headers */,
5D61FC651A84238C00846EE7 /* SDLCompassDirection.h in Headers */,
5D61FC8E1A84238C00846EE7 /* SDLDimension.h in Headers */,
5D61FD6B1A84238C00846EE7 /* SDLRPCMessageType.h in Headers */,
- 5D61FD501A84238C00846EE7 /* SDLProxy.h in Headers */,
5D61FC3F1A84238C00846EE7 /* SDLAmbientLightStatus.h in Headers */,
5DE372A11ACB2ED300849FAA /* SDLHMICapabilities.h in Headers */,
88B58DBA222040FF0011B063 /* SDLDirection.h in Headers */,
@@ -7071,6 +7225,7 @@
5D61FCA31A84238C00846EE7 /* SDLEndAudioPassThru.h in Headers */,
88A795D22106787400056542 /* SDLStaticIconName.h in Headers */,
2B233530232BD8A5002118E5 /* SDLWindowCapability+ScreenManagerExtensions.h in Headers */,
+ 4A1B036D24CF43CD008C6B13 /* SDLDriverDistractionCapability.h in Headers */,
5D61FCB11A84238C00846EE7 /* SDLGetDTCs.h in Headers */,
5D61FDFF1A84238C00846EE7 /* SDLVehicleDataEventStatus.h in Headers */,
5D61FC5B1A84238C00846EE7 /* SDLChangeRegistration.h in Headers */,
@@ -7085,7 +7240,7 @@
5D61FC371A84238C00846EE7 /* SDLAlert.h in Headers */,
5D61FCC11A84238C00846EE7 /* SDLHMILevel.h in Headers */,
8B9376D71F3349FC009605C4 /* SDLMetadataTags.h in Headers */,
- 5D61FD471A84238C00846EE7 /* SDLProtocolListener.h in Headers */,
+ 5D61FD471A84238C00846EE7 /* SDLProtocolDelegate.h in Headers */,
EE28F9E3209802A500B1B61D /* SDLStreamingProtocolDelegate.h in Headers */,
88BCEA922266250B00BB7E70 /* SDLIAPControlSession.h in Headers */,
5D61FCA01A84238C00846EE7 /* SDLEncodedSyncPDataResponse.h in Headers */,
@@ -7095,6 +7250,7 @@
5D61FDA71A84238C00846EE7 /* SDLSpeakResponse.h in Headers */,
5D1665CB1CF8CA6700CC4CA1 /* NSNumber+NumberType.h in Headers */,
5D9FDA941F2A7D3400A495C8 /* bson_util.h in Headers */,
+ 88A098B224770E7100A50005 /* SDLSubscribeButtonObserver.h in Headers */,
5D61FD771A84238C00846EE7 /* SDLSamplingRate.h in Headers */,
5DF40B22208E761A00DD6FDA /* SDLVoiceCommandManager.h in Headers */,
001A08B52321ADD30078A31E /* SDLServiceEncryptionDelegate.h in Headers */,
@@ -7136,6 +7292,7 @@
5D61FCFC1A84238C00846EE7 /* SDLRPCParameterNames.h in Headers */,
DA9F7E8F1DCC04C000ACAE48 /* SDLUnsubscribeWayPointsResponse.h in Headers */,
5D61FCFD1A84238C00846EE7 /* SDLObjectWithPriority.h in Headers */,
+ 4A3BA4E1248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.h in Headers */,
88EF8EBD22D8FE5800CB06C2 /* SDLCancelInteractionResponse.h in Headers */,
888DBAEF22D528DE002A0AE2 /* SDLCloseApplicationResponse.h in Headers */,
DAC5726C1D11B4840004288B /* SDLTouchManagerDelegate.h in Headers */,
@@ -7150,7 +7307,6 @@
5D61FD6F1A84238C00846EE7 /* SDLRPCPayload.h in Headers */,
5D339CF3207C0ACE000CC364 /* SDLMenuManager.h in Headers */,
5D61FCF01A84238C00846EE7 /* SDLLockScreenStatusManager.h in Headers */,
- 5D61FD311A84238C00846EE7 /* SDLPolicyDataParser.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -7285,7 +7441,7 @@
};
5D61FA1B1A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
- LastSwiftMigration = 1020;
+ LastSwiftMigration = 1150;
};
5D61FA251A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
@@ -7402,6 +7558,7 @@
5D1FF2BF21304598000EB9B4 /* ConnectionAnimatedTransition.m in Sources */,
5D1FF2A721304531000EB9B4 /* Preferences.m in Sources */,
5D1FF2CC2130464E000EB9B4 /* main.m in Sources */,
+ 889E7BB2249D0877002E4BE1 /* SubscribeButtonManager.m in Sources */,
5D1FF2C021304598000EB9B4 /* ConnectionTransitionContext.m in Sources */,
5D1FF2A221304515000EB9B4 /* ButtonManager.m in Sources */,
5D1FF2A021304515000EB9B4 /* AudioManager.m in Sources */,
@@ -7506,6 +7663,7 @@
5D61FCC81A84238C00846EE7 /* SDLIAPTransport.m in Sources */,
5D61FE101A84238C00846EE7 /* SDLVrHelpItem.m in Sources */,
5D07C0322044AD0C00D1ECDC /* SDLAsynchronousRPCRequestOperation.m in Sources */,
+ 88A098AF2476F0C200A50005 /* SDLSubscribeButtonManager.m in Sources */,
8881AFBF2225E9BB00EA870B /* SDLGetCloudAppPropertiesResponse.m in Sources */,
1E5AD0691F2080B50029B8AF /* SDLRadioControlData.m in Sources */,
888F86FE221DEE200052FE4C /* SDLAsynchronousRPCOperation.m in Sources */,
@@ -7527,6 +7685,7 @@
5D61FC9B1A84238C00846EE7 /* SDLEmergencyEvent.m in Sources */,
5D61FDFE1A84238C00846EE7 /* SDLVehicleDataActiveStatus.m in Sources */,
1E5AD0411F1F58480029B8AF /* SDLVentilationMode.m in Sources */,
+ 4A3BA4E2248EB133003E56B8 /* SDLLifecycleSyncPDataHandler.m in Sources */,
5D61FCD01A84238C00846EE7 /* SDLImageField.m in Sources */,
5D0A738B203F24320001595D /* SDLSoftButtonObject.m in Sources */,
5D61FC3C1A84238C00846EE7 /* SDLAlertManeuverResponse.m in Sources */,
@@ -7560,6 +7719,7 @@
5D61FDB21A84238C00846EE7 /* SDLSubscribeVehicleData.m in Sources */,
5D61FC991A84238C00846EE7 /* SDLECallInfo.m in Sources */,
5D61FD601A84238C00846EE7 /* SDLRegisterAppInterfaceResponse.m in Sources */,
+ 106982AB24AA3B4700B1F649 /* SDLRPCPermissionStatus.m in Sources */,
5DB996581F268ECB002D8795 /* SDLControlFramePayloadAudioStartServiceAck.m in Sources */,
DAC572621D10C5020004288B /* SDLPinchGesture.m in Sources */,
1EAA471A203406B2000FE74B /* SDLSISData.m in Sources */,
@@ -7588,6 +7748,7 @@
5D61FD8A1A84238C00846EE7 /* SDLSetGlobalPropertiesResponse.m in Sources */,
5D61FC4C1A84238C00846EE7 /* SDLBeltStatus.m in Sources */,
DA9F7E8C1DCC04B000ACAE48 /* SDLSubscribeWayPointsResponse.m in Sources */,
+ 4A3BA4ED24914801003E56B8 /* SDLLifecycleProtocolHandler.m in Sources */,
5D61FDA41A84238C00846EE7 /* SDLSoftButtonType.m in Sources */,
5D00AC6C1F141339004000D9 /* SDLSystemCapability.m in Sources */,
5D61FC521A84238C00846EE7 /* SDLButtonCapabilities.m in Sources */,
@@ -7637,10 +7798,12 @@
9FE2470A22D77A3600F8D2FC /* SDLDeleteWindow.m in Sources */,
5D0A7383203F23F30001595D /* SDLSoftButtonManager.m in Sources */,
5DCF76FA1ACDD7CD00BB647B /* SDLSendLocationResponse.m in Sources */,
+ 88A098B324770E7100A50005 /* SDLSubscribeButtonObserver.m in Sources */,
5D9FDA8F1F2A7D3400A495C8 /* bson_array.c in Sources */,
5D61FD661A84238C00846EE7 /* SDLResetGlobalPropertiesResponse.m in Sources */,
4A99D0132475773C009B43E6 /* SDLImageField+ScreenManagerExtensions.m in Sources */,
5D61FCFE1A84238C00846EE7 /* SDLObjectWithPriority.m in Sources */,
+ B38D8E62249FE28500B977D0 /* SDLCapacityUnit.m in Sources */,
5D92937D20B70A3E00FCC775 /* SDLPresentKeyboardOperation.m in Sources */,
9FD334E122DC6E7500F62736 /* SDLCreateWindow.m in Sources */,
5DBF06241E64A83F00A5CF03 /* SDLLogManager.m in Sources */,
@@ -7655,9 +7818,9 @@
5D61FD961A84238C00846EE7 /* SDLShowResponse.m in Sources */,
5D61FD981A84238C00846EE7 /* SDLSingleTireStatus.m in Sources */,
1EB59CA8202D946500343A61 /* SDLMassageModeData.m in Sources */,
+ 4A3BA4E824901794003E56B8 /* SDLLifecycleMobileHMIStateHandler.m in Sources */,
8881AFB32225DED900EA870B /* SDLSetCloudAppPropertiesResponse.m in Sources */,
5D9FDA931F2A7D3400A495C8 /* bson_util.c in Sources */,
- 5D61FD511A84238C00846EE7 /* SDLProxy.m in Sources */,
5D61FD461A84238C00846EE7 /* SDLProtocolHeader.m in Sources */,
5DD8406320FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m in Sources */,
88EF8EB822D8E02E00CB06C2 /* SDLCancelInteraction.m in Sources */,
@@ -7765,6 +7928,7 @@
1E5AD0511F1F7BF10029B8AF /* SDLRadioBand.m in Sources */,
88B3BF9D20DA8BBC00943565 /* SDLFuelRange.m in Sources */,
5D61FDDC1A84238C00846EE7 /* SDLTriggerSource.m in Sources */,
+ 106412C7249FB80B0069A97A /* SDLPermissionElement.m in Sources */,
5DADA7761F4DFED60084D17D /* SDLRectangle.m in Sources */,
88EED83F1F33C5A400E6C42E /* SDLSendHapticData.m in Sources */,
5D16545B1D3E7A1600554D93 /* SDLLifecycleManager.m in Sources */,
@@ -7808,7 +7972,6 @@
5D61FD5C1A84238C00846EE7 /* SDLReadDIDResponse.m in Sources */,
884AF950220B488900E22928 /* SDLOnSystemCapabilityUpdated.m in Sources */,
1EB59CB4202D9B5F00343A61 /* SDLSeatMemoryActionType.m in Sources */,
- 5D61FD321A84238C00846EE7 /* SDLPolicyDataParser.m in Sources */,
5D61FC621A84238C00846EE7 /* SDLChoice.m in Sources */,
1E5AD0811F20B73E0029B8AF /* SDLButtonPress.m in Sources */,
5D92937520B5EEA200FCC775 /* SDLPreloadChoicesOperation.m in Sources */,
@@ -7876,14 +8039,17 @@
9FE2470E22D77A5A00F8D2FC /* SDLDeleteWindowResponse.m in Sources */,
5D82041F1BCD8E6100D0A41B /* SDLConfiguration.m in Sources */,
00E22CEC22C2F1B300BC6B08 /* SDLEncryptionConfiguration.m in Sources */,
+ 4A1B036C24CF43CD008C6B13 /* SDLDriverDistractionCapability.m in Sources */,
5D61FD381A84238C00846EE7 /* SDLPredefinedLayout.m in Sources */,
5D3E487C1D6F888E0000BFEF /* SDLRPCResponseNotification.m in Sources */,
5D61FD0E1A84238C00846EE7 /* SDLOnHashChange.m in Sources */,
5D4D67B51D30161600468B4A /* SDLLockScreenManager.m in Sources */,
+ 4A26370C2493F0CF00278BE3 /* SDLRPCMessageType.m in Sources */,
5D61FDE41A84238C00846EE7 /* SDLUnregisterAppInterface.m in Sources */,
88A5E7FE220B642200495E8A /* SDLGetAppServiceDataResponse.m in Sources */,
5D61FC361A84238C00846EE7 /* SDLAirbagStatus.m in Sources */,
5D61FD7E1A84238C00846EE7 /* SDLScrollableMessageResponse.m in Sources */,
+ 4A3BA4DD248E8F0F003E56B8 /* SDLLifecycleSystemRequestHandler.m in Sources */,
5D61FD3A1A84238C00846EE7 /* SDLPrerecordedSpeech.m in Sources */,
5D61FCA11A84238C00846EE7 /* SDLEncodedSyncPDataResponse.m in Sources */,
88B3BF9920DA859800943565 /* SDLFuelType.m in Sources */,
@@ -7921,6 +8087,7 @@
5D61FDCC1A84238C00846EE7 /* SDLTextFieldName.m in Sources */,
5D61FC751A84238C00846EE7 /* SDLDeleteCommandResponse.m in Sources */,
5DA3F3711BC4489A0026F2D0 /* SDLManager.m in Sources */,
+ 4A9D02BF2497EED400FBE99B /* SDLLifecycleRPCAdapter.m in Sources */,
5D61FD861A84238C00846EE7 /* SDLSetDisplayLayoutResponse.m in Sources */,
5D61FCB41A84238C00846EE7 /* SDLGetDTCsResponse.m in Sources */,
5D61FDFC1A84238C00846EE7 /* SDLV2ProtocolMessage.m in Sources */,
@@ -7950,6 +8117,7 @@
162E82EE1A9BDE8B00906325 /* SDLMediaClockFormatSpec.m in Sources */,
5D76751822D921CB00E8D71A /* SDLMenuLayoutSpec.m in Sources */,
5DA026901AD44EE700019F86 /* SDLDialNumberResponseSpec.m in Sources */,
+ 4A457DD324A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m in Sources */,
162E83901A9BDE8B00906325 /* SDLTireStatusSpec.m in Sources */,
000DD57622EF0971005AB7A7 /* SDLReleaseInteriorVehicleDataModuleResponseSpec.m in Sources */,
162E82E01A9BDE8B00906325 /* SDLHMILevelSpec.m in Sources */,
@@ -7973,6 +8141,7 @@
4A4AD8A424894260008FC414 /* TestOldConfigurationUpdateManagerDelegate.m in Sources */,
162E838A1A9BDE8B00906325 /* SDLSingleTireStatusSpec.m in Sources */,
5D6EB4CC1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m in Sources */,
+ B3F7918324E062C200DB5CAF /* SDLGetVehicleDataSpec.m in Sources */,
88F37A4D226F84BE00DF119B /* SDLIAPDataSessionSpec.m in Sources */,
9FA0D00322DF06B9009CF344 /* SDLWindowTypeCapabilitiesSpec.m in Sources */,
162E83051A9BDE8B00906325 /* SDLVehicleDataActiveStatusSpec.m in Sources */,
@@ -8030,10 +8199,12 @@
162E837E1A9BDE8B00906325 /* SDLGPSDataSpec.m in Sources */,
5DAE06731BDEC6C000F9B498 /* SDLFileSpec.m in Sources */,
162E82E11A9BDE8B00906325 /* SDLHMIZoneCapabilitiesSpec.m in Sources */,
+ 88D0E5D624786580009469AB /* SDLSubscribeButtonManagerSpec.m in Sources */,
5D75960D22972F830013207C /* TestSystemCapabilityObserver.m in Sources */,
88B58DBD222042500011B063 /* SDLDirectionSpec.m in Sources */,
162E83721A9BDE8B00906325 /* SDLAudioPassThruCapabilitiesSpec.m in Sources */,
162E83681A9BDE8B00906325 /* SDLSpeakResponseSpec.m in Sources */,
+ B38D8E8224A1F53500B977D0 /* SDLCapacityUnitSpec.m in Sources */,
1EB59CD8202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m in Sources */,
162E83661A9BDE8B00906325 /* SDLShowResponseSpec.m in Sources */,
5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */,
@@ -8059,6 +8230,7 @@
162E83281A9BDE8B00906325 /* SDLDeleteCommandSpec.m in Sources */,
88A81F6C2200FD4A00A691A9 /* SDLAppServiceRecordSpec.m in Sources */,
162E83531A9BDE8B00906325 /* SDLDiagnosticMessageResponseSpec.m in Sources */,
+ 106187B924AA75540045C4EC /* SDLRPCPermissionStatusSpec.m in Sources */,
8881AFB52225E37800EA870B /* SDLSetCloudAppPropertiesResponseSpec.m in Sources */,
162E83671A9BDE8B00906325 /* SDLSliderResponseSpec.m in Sources */,
8877F5F11F34AA2D00DC128A /* SDLSendHapticDataResponseSpec.m in Sources */,
@@ -8077,6 +8249,7 @@
5D6035D5202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.m in Sources */,
162E83691A9BDE8B00906325 /* SDLSubscribeButtonResponseSpec.m in Sources */,
9FA0CFFA22DF064D009CF344 /* SDLPredefinedWindowsSpec.m in Sources */,
+ 88B8657924A102AB003491AD /* TestSubscribeButtonObserver.m in Sources */,
5DAE06751BDEC6D600F9B498 /* SDLArtworkSpec.m in Sources */,
5DA23FF01F2FA0FF009C0313 /* SDLControlFramePayloadEndServiceSpec.m in Sources */,
162E83591A9BDE8B00906325 /* SDLListFilesResponseSpec.m in Sources */,
@@ -8115,6 +8288,7 @@
162E82CE1A9BDE8A00906325 /* SDLAudioTypeSpec.m in Sources */,
162E831C1A9BDE8B00906325 /* SDLOnSyncPDataSpec.m in Sources */,
00EADD3322DFE54B0088B608 /* SDLEncryptionLifecycleManagerSpec.m in Sources */,
+ 4A1B036F24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m in Sources */,
5D9F50871BED412E00FEF399 /* TestConnectionManager.m in Sources */,
1EAA47802036C2C9000FE74B /* SDLStationIDNumberSpec.m in Sources */,
162E83341A9BDE8B00906325 /* SDLPutFileSpec.m in Sources */,
@@ -8154,6 +8328,7 @@
162E82DE1A9BDE8B00906325 /* SDLFuelCutoffStatusSpec.m in Sources */,
162E83271A9BDE8B00906325 /* SDLCreateInteractionChoiceSetSpec.m in Sources */,
5DAD5F8920508F090025624C /* SDLSoftButtonStateSpec.m in Sources */,
+ 1098F03824A39699004F53CC /* SDLPermissionElementSpec.m in Sources */,
9FA0D01222DF0BAC009CF344 /* SDLDeleteWindowResponseSpec.m in Sources */,
162E83111A9BDE8B00906325 /* SDLOnButtonEventSpec.m in Sources */,
1FF7DAC01F75CF6C00B46C30 /* SDLHapticManagerSpec.m in Sources */,
@@ -8260,9 +8435,11 @@
162E83741A9BDE8B00906325 /* SDLBodyInformationSpec.m in Sources */,
1EAA477A2036BD46000FE74B /* SDLSISDataSpec.m in Sources */,
5D64FE6D20DA9CE600792F9F /* SDLVideoStreamingStateSpec.m in Sources */,
+ 88D0E5D824786770009469AB /* SDLSubscribeButtonObserverSpec.m in Sources */,
88665B6C220B796A00D9DA77 /* SDLPerformAppServiceInteractionResponseSpec.m in Sources */,
162E83641A9BDE8B00906325 /* SDLSetMediaClockTimerResponseSpec.m in Sources */,
162E839C1A9BDE8B00906325 /* SDLRPCRequestSpec.m in Sources */,
+ 4A457DD524A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m in Sources */,
DA4353E31D2720A30099B8C4 /* SDLPinchGestureSpec.m in Sources */,
5D8B17561AC9E399006A6E1C /* SDLDialNumberSpec.m in Sources */,
162E833D1A9BDE8B00906325 /* SDLShowConstantTBTSpec.m in Sources */,
@@ -8277,6 +8454,7 @@
162E82D61A9BDE8A00906325 /* SDLComponentVolumeStatusSpec.m in Sources */,
162E835C1A9BDE8B00906325 /* SDLPutFileResponseSpec.m in Sources */,
1EE8C43E1F347F0500FDC2CF /* SDLVentilationModeSpec.m in Sources */,
+ 4A457DD724A3CCED00386CBA /* SDLLifecycleSystemRequestHandlerSpec.m in Sources */,
88B58DC922204C9E0011B063 /* SDLNavigationActionSpec.m in Sources */,
5DB202271F5F2D030061D189 /* SDLImageResolutionSpec.m in Sources */,
DA9F7EAA1DCC061A00ACAE48 /* SDLSubscribeWaypointsResponseSpec.m in Sources */,
@@ -8297,7 +8475,6 @@
162E82E71A9BDE8B00906325 /* SDLKeyboardEventSpec.m in Sources */,
162E834E1A9BDE8B00906325 /* SDLCreateInteractionChoiceSetResponseSpec.m in Sources */,
DA9F7EB61DCC086A00ACAE48 /* SDLOasisAddressSpec.m in Sources */,
- 162E83301A9BDE8B00906325 /* SDLGetVehicleDataSpec.m in Sources */,
162E833F1A9BDE8B00906325 /* SDLSliderSpec.m in Sources */,
162E838C1A9BDE8B00906325 /* SDLSoftButtonSpec.m in Sources */,
5DA23FF81F2FAF2D009C0313 /* SDLControlFramePayloadRPCStartServiceAckSpec.m in Sources */,
@@ -8305,6 +8482,7 @@
5DE35E4E20CB1C2C0034BE5A /* SDLDeleteChoicesOperationSpec.m in Sources */,
5DE35E5220CB1C490034BE5A /* SDLPreloadChoicesOperationSpec.m in Sources */,
5DADA7781F4E059E0084D17D /* SDLRectangleSpec.m in Sources */,
+ 4A457DC324A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m in Sources */,
5DB1BCDD1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m in Sources */,
EED5CA0A1F4D206800F04000 /* SDLRTPH264PacketizerSpec.m in Sources */,
1EB59CC8202DC86A00343A61 /* SDLModuleTypeSpec.m in Sources */,
@@ -8367,6 +8545,7 @@
1EE8C4611F38865B00FDC2CF /* SDLSetInteriorVehicleDataResponseSpec.m in Sources */,
162E82FC1A9BDE8B00906325 /* SDLSystemAction.m in Sources */,
162E82CC1A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m in Sources */,
+ 4A457DD924A5137100386CBA /* SDLLifecycleProtocolHandlerSpec.m in Sources */,
9FA0CFFD22DF0687009CF344 /* SDLTemplateConfigurationSpec.m in Sources */,
162E83321A9BDE8B00906325 /* SDLPerformAudioPassThruSpec.m in Sources */,
162E830B1A9BDE8B00906325 /* SDLVrCapabilitiesSpec.m in Sources */,
@@ -8448,6 +8627,7 @@
5DC49BDD237314B500B2B8F2 /* SceneDelegate.swift in Sources */,
5D1FF2DC21304746000EB9B4 /* AlertManager.swift in Sources */,
5D1FF2EB2130479C000EB9B4 /* ConnectionContainerViewController.swift in Sources */,
+ 889E7BAF249CEE07002E4BE1 /* SubscribeButtonManager.swift in Sources */,
5D1FF2E021304746000EB9B4 /* MenuManager.swift in Sources */,
5D1FF2DF21304746000EB9B4 /* PerformInteractionManager.swift in Sources */,
5D1FF2ED2130479C000EB9B4 /* ConnectionIAPTableViewController.swift in Sources */,
@@ -8724,7 +8904,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 6.6.0;
+ MARKETING_VERSION = 6.7.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.smartdevicelink;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
@@ -8769,7 +8949,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 6.6.0;
+ MARKETING_VERSION = 6.7.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.smartdevicelink;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec
index 1d856c9ab..c6da6f116 100644
--- a/SmartDeviceLink.podspec
+++ b/SmartDeviceLink.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink"
-s.version = "6.6.0"
+s.version = "6.7.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
@@ -10,7 +10,7 @@ s.platform = :ios, "8.0"
s.dependency 'BiSON', '~> 1.2.0'
s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :tag => s.version.to_s }
s.requires_arc = true
-s.swift_version = '5.1'
+s.swift_version = '5.2'
s.default_subspec = 'Default'
@@ -61,6 +61,7 @@ sdefault.public_header_files = [
'SmartDeviceLink/SDLButtonPressMode.h',
'SmartDeviceLink/SDLCancelInteraction.h',
'SmartDeviceLink/SDLCancelInteractionResponse.h',
+'SmartDeviceLink/SDLCapacityUnit.h',
'SmartDeviceLink/SDLCarModeStatus.h',
'SmartDeviceLink/SDLCarWindowViewController.h',
'SmartDeviceLink/SDLChangeRegistration.h',
@@ -111,6 +112,7 @@ sdefault.public_header_files = [
'SmartDeviceLink/SDLDisplayMode.h',
'SmartDeviceLink/SDLDisplayType.h',
'SmartDeviceLink/SDLDistanceUnit.h',
+'SmartDeviceLink/SDLDriverDistractionCapability.h',
'SmartDeviceLink/SDLDriverDistractionState.h',
'SmartDeviceLink/SDLECallConfirmationStatus.h',
'SmartDeviceLink/SDLECallInfo.h',
@@ -269,6 +271,7 @@ sdefault.public_header_files = [
'SmartDeviceLink/SDLPerformInteraction.h',
'SmartDeviceLink/SDLPerformInteractionResponse.h',
'SmartDeviceLink/SDLPermissionConstants.h',
+'SmartDeviceLink/SDLPermissionElement.h',
'SmartDeviceLink/SDLPermissionItem.h',
'SmartDeviceLink/SDLPermissionManager.h',
'SmartDeviceLink/SDLPermissionStatus.h',
@@ -311,6 +314,7 @@ sdefault.public_header_files = [
'SmartDeviceLink/SDLRPCMessageType.h',
'SmartDeviceLink/SDLRPCNotification.h',
'SmartDeviceLink/SDLRPCNotificationNotification.h',
+'SmartDeviceLink/SDLRPCPermissionStatus.h',
'SmartDeviceLink/SDLRPCRequest.h',
'SmartDeviceLink/SDLRPCRequestNotification.h',
'SmartDeviceLink/SDLRPCResponse.h',
diff --git a/SmartDeviceLink/SDLAddSubMenu.h b/SmartDeviceLink/SDLAddSubMenu.h
index 6f289e811..fbd8d872c 100644
--- a/SmartDeviceLink/SDLAddSubMenu.h
+++ b/SmartDeviceLink/SDLAddSubMenu.h
@@ -1,4 +1,34 @@
-// SDLAddSubMenu.h
+/*
+* 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 "SDLRPCRequest.h"
@@ -25,13 +55,30 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLAddSubMenu : SDLRPCRequest
+/**
+ * @param menuID - @(menuID)
+ * @param menuName - menuName
+ * @return A SDLAddSubMenu object
+ */
+- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName;
+
+/**
+ * @param menuID - @(menuID)
+ * @param menuName - menuName
+ * @param position - position
+ * @param menuIcon - menuIcon
+ * @param menuLayout - menuLayout
+ * @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;
/// Convenience init for creating an add submenu
///
/// @param menuId A menu id
/// @param menuName The menu name
/// @return An SDLAddSubMenu object
-- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName;
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName __deprecated_msg("Use initWithMenuID:menuName: instead");
/// Convenience init for creating an add submenu
///
@@ -39,7 +86,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param menuName The menu name
/// @param position The position within the menu to add
/// @return An SDLAddSubMenu object
-- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName position:(UInt8)position __deprecated_msg("Use initWithId:menuName:menuLayout:menuIcon:position: instead");
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName position:(UInt8)position __deprecated_msg("Use initWithMenuID:menuName:position:menuIcon:menuLayout:parentID: instead");
/// Convenience init for creating an add submenu
///
@@ -48,7 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param icon The icon to show on the menu item
/// @param position The position within the menu to add
/// @return An SDLAddSubMenu object
-- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuIcon:(nullable SDLImage *)icon position:(UInt8)position __deprecated_msg("Use initWithId:menuName:menuLayout:menuIcon:position: instead");
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuIcon:(nullable SDLImage *)icon position:(UInt8)position __deprecated_msg("Use initWithMenuID:menuName:position:menuIcon:menuLayout:parentID: instead");
/// Convenience init for creating an add submenu with all properties.
///
@@ -58,7 +105,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param icon The icon to show on the menu item
/// @param position The position within the menu to add
/// @return An SDLAddSubMenu object
-- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuLayout:(nullable SDLMenuLayout)menuLayout menuIcon:(nullable SDLImage *)icon position:(UInt8)position;
+- (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuLayout:(nullable SDLMenuLayout)menuLayout menuIcon:(nullable SDLImage *)icon position:(UInt8)position __deprecated_msg("Use initWithMenuID:menuName:position:menuIcon:menuLayout:parentID: instead");
/**
* a Menu ID that identifies a sub menu
@@ -104,6 +151,14 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (strong, nonatomic, nullable) SDLMenuLayout menuLayout;
+/**
+ * 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.
+ * {"default_value": 0, "max_value": 2000000000, "min_value": 0}
+ *
+ * @since SDL 7.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLUInt> *parentID;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLAddSubMenu.m b/SmartDeviceLink/SDLAddSubMenu.m
index 649a10a31..91dbc11ba 100644
--- a/SmartDeviceLink/SDLAddSubMenu.m
+++ b/SmartDeviceLink/SDLAddSubMenu.m
@@ -1,4 +1,34 @@
-// SDLAddSubMenu.m
+/*
+* 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 "SDLAddSubMenu.h"
@@ -51,6 +81,28 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)initWithMenuID:(UInt32)menuID menuName:(NSString *)menuName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.menuID = @(menuID);
+ self.menuName = menuName;
+ return self;
+}
+
+- (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 {
+ self = [self initWithMenuID:menuID menuName:menuName];
+ if (!self) {
+ return nil;
+ }
+ self.position = position;
+ self.menuIcon = menuIcon;
+ self.menuLayout = menuLayout;
+ self.parentID = parentID;
+ return self;
+}
+
- (void)setMenuID:(NSNumber<SDLInt> *)menuID {
[self.parameters sdl_setObject:menuID forName:SDLRPCParameterNameMenuId];
}
@@ -93,6 +145,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_enumForName:SDLRPCParameterNameMenuLayout error:nil];
}
+- (void)setParentID:(nullable NSNumber<SDLUInt> *)parentID {
+ [self.parameters sdl_setObject:parentID forName:SDLRPCParameterNameParentID];
+}
+
+- (nullable NSNumber<SDLUInt> *)parentID {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameParentID ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLAppHMIType.h b/SmartDeviceLink/SDLAppHMIType.h
index 21ff96e61..6cd653cd2 100644
--- a/SmartDeviceLink/SDLAppHMIType.h
+++ b/SmartDeviceLink/SDLAppHMIType.h
@@ -69,3 +69,11 @@ extern SDLAppHMIType const SDLAppHMITypeSystem;
/**
* Remote control */
extern SDLAppHMIType const SDLAppHMITypeRemoteControl;
+
+
+/**
+ * WebEngine Projection mode
+ *
+ * @since 7.0
+ */
+extern SDLAppHMIType const SDLAppHMITypeWebView;
diff --git a/SmartDeviceLink/SDLAppHMIType.m b/SmartDeviceLink/SDLAppHMIType.m
index 070ad089b..7e24ef6d6 100644
--- a/SmartDeviceLink/SDLAppHMIType.m
+++ b/SmartDeviceLink/SDLAppHMIType.m
@@ -16,3 +16,4 @@ SDLAppHMIType const SDLAppHMITypeBackgroundProcess = @"BACKGROUND_PROCESS";
SDLAppHMIType const SDLAppHMITypeTesting = @"TESTING";
SDLAppHMIType const SDLAppHMITypeSystem = @"SYSTEM";
SDLAppHMIType const SDLAppHMITypeRemoteControl = @"REMOTE_CONTROL";
+SDLAppHMIType const SDLAppHMITypeWebView = @"WEB_VIEW";
diff --git a/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.h b/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.h
index 8b30c6438..e8093025d 100644
--- a/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.h
+++ b/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.h
@@ -73,3 +73,9 @@ extern SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReason
///
/// @since RPC 4.1
extern SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource;
+
+
+/// The application is unregistered due to hardware resource constraints. The system will shortly close the application to free up hardware resources.
+///
+/// @since RPC 7.0
+extern SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonResourceConstraint;
diff --git a/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.m b/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.m
index 8bc3231cf..12b8ed1f5 100644
--- a/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.m
+++ b/SmartDeviceLink/SDLAppInterfaceUnregisteredReason.m
@@ -16,3 +16,4 @@ SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonFactory
SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonAppUnauthorized = @"APP_UNAUTHORIZED";
SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonProtocolViolation = @"PROTOCOL_VIOLATION";
SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource = @"UNSUPPORTED_HMI_RESOURCE";
+SDLAppInterfaceUnregisteredReason const SDLAppInterfaceUnregisteredReasonResourceConstraint = @"RESOURCE_CONSTRAINT";
diff --git a/SmartDeviceLink/SDLCapacityUnit.h b/SmartDeviceLink/SDLCapacityUnit.h
new file mode 100644
index 000000000..415bd18c5
--- /dev/null
+++ b/SmartDeviceLink/SDLCapacityUnit.h
@@ -0,0 +1,48 @@
+/*
+ * 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"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @since SDL 7.0.0
+ */
+typedef SDLEnum SDLCapacityUnit SDL_SWIFT_ENUM;
+
+extern SDLCapacityUnit const SDLCapacityUnitKilograms;
+
+extern SDLCapacityUnit const SDLCapacityUnitKilowatthours;
+
+extern SDLCapacityUnit const SDLCapacityUnitLiters;
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLCapacityUnit.m b/SmartDeviceLink/SDLCapacityUnit.m
new file mode 100644
index 000000000..7e21103fa
--- /dev/null
+++ b/SmartDeviceLink/SDLCapacityUnit.m
@@ -0,0 +1,37 @@
+/*
+ * 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 "SDLCapacityUnit.h"
+
+SDLCapacityUnit const SDLCapacityUnitLiters = @"LITERS";
+SDLCapacityUnit const SDLCapacityUnitKilowatthours = @"KILOWATTHOURS";
+SDLCapacityUnit const SDLCapacityUnitKilograms = @"KILOGRAMS";
diff --git a/SmartDeviceLink/SDLCharacterSet.h b/SmartDeviceLink/SDLCharacterSet.h
index 51771fe77..9cd096573 100644
--- a/SmartDeviceLink/SDLCharacterSet.h
+++ b/SmartDeviceLink/SDLCharacterSet.h
@@ -1,33 +1,98 @@
-// SDLCharacterSet.h
-//
+/*
+* 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"
/**
- * Character sets supported by SDL. Used to describe text field capabilities.
+ * The list of potential character sets
*
- * @since SDL 1.0
+ * @since SDL 1.0.0
*/
typedef SDLEnum SDLCharacterSet SDL_SWIFT_ENUM;
/**
- Character Set Type 2
+ * @deprecated
+ * @since SDL 7.0.0
*/
-extern SDLCharacterSet const SDLCharacterSetType2;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+extern SDLCharacterSet const SDLCharacterSetType2 __deprecated_msg("Use Ascii, Iso88591, or Utf8 instead");
+#pragma clang diagnostic pop
/**
- Character Set Type 5
+ * @deprecated
+ * @since SDL 7.0.0
*/
-extern SDLCharacterSet const SDLCharacterSetType5;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+extern SDLCharacterSet const SDLCharacterSetType5 __deprecated_msg("Use Ascii, Iso88591, or Utf8 instead");
+#pragma clang diagnostic pop
/**
- Character Set CID1
+ * @deprecated
+ * @since SDL 7.0.0
*/
-extern SDLCharacterSet const SDLCharacterSetCID1;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+extern SDLCharacterSet const SDLCharacterSetCID1 __deprecated_msg("Use Ascii, Iso88591, or Utf8 instead");
+#pragma clang diagnostic pop
/**
- Character Set CID2
+ * @deprecated
+ * @since SDL 7.0.0
*/
-extern SDLCharacterSet const SDLCharacterSetCID2;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+extern SDLCharacterSet const SDLCharacterSetCID2 __deprecated_msg("Use Ascii, Iso88591, or Utf8 instead");
+#pragma clang diagnostic pop
+/**
+ * ASCII as defined in https://en.wikipedia.org/wiki/ASCII as defined in codes 0-127. Non-printable characters such as tabs and back spaces are ignored.
+ *
+ * @since SDL 7.0.0
+ */
+extern SDLCharacterSet const SDLCharacterSetAscii;
+
+/**
+ * Latin-1, as defined in https://en.wikipedia.org/wiki/ISO/IEC_8859-1
+ *
+ * @since SDL 7.0.0
+ */
+extern SDLCharacterSet const SDLCharacterSetIso88591;
+
+/**
+ * The UTF-8 character set that uses variable bytes per code point. See https://en.wikipedia.org/wiki/UTF-8 for more details. This is the preferred character set.
+ *
+ * @since SDL 7.0.0
+ */
+extern SDLCharacterSet const SDLCharacterSetUtf8;
diff --git a/SmartDeviceLink/SDLCharacterSet.m b/SmartDeviceLink/SDLCharacterSet.m
index 64733c0dc..47b595f7e 100644
--- a/SmartDeviceLink/SDLCharacterSet.m
+++ b/SmartDeviceLink/SDLCharacterSet.m
@@ -1,10 +1,57 @@
-// SDLCharacterSet.m
-//
-
+/*
+ * 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 "SDLCharacterSet.h"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLCharacterSet const SDLCharacterSetType2 = @"TYPE2SET";
+#pragma clang diagnostic pop
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLCharacterSet const SDLCharacterSetType5 = @"TYPE5SET";
+#pragma clang diagnostic pop
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLCharacterSet const SDLCharacterSetCID1 = @"CID1SET";
+#pragma clang diagnostic pop
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLCharacterSet const SDLCharacterSetCID2 = @"CID2SET";
+#pragma clang diagnostic pop
+
+SDLCharacterSet const SDLCharacterSetAscii = @"ASCII";
+SDLCharacterSet const SDLCharacterSetIso88591 = @"ISO_8859_1";
+SDLCharacterSet const SDLCharacterSetUtf8 = @"UTF_8";
diff --git a/SmartDeviceLink/SDLChoiceSetManager.m b/SmartDeviceLink/SDLChoiceSetManager.m
index a8d3468b7..2b8422134 100644
--- a/SmartDeviceLink/SDLChoiceSetManager.m
+++ b/SmartDeviceLink/SDLChoiceSetManager.m
@@ -133,7 +133,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (void)stop {
SDLLogD(@"Stopping manager");
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
[self.stateMachine transitionToState:SDLChoiceManagerStateShutdown];
}];
}
@@ -231,7 +231,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
NSMutableSet<SDLChoiceCell *> *choicesToUpload = [[self sdl_choicesToBeUploadedWithArray:choices] mutableCopy];
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
[choicesToUpload minusSet:self.preloadedMutableChoices];
[choicesToUpload minusSet:self.pendingMutablePreloadChoices];
}];
@@ -248,7 +248,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
[self sdl_updateIdsOnChoices:choicesToUpload];
// Add the preload cells to the pending preloads
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
[self.pendingMutablePreloadChoices unionSet:choicesToUpload];
}];
@@ -275,7 +275,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
return;
}
- [strongSelf sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.preloadedMutableChoices unionSet:choicesToUpload];
[strongSelf.pendingMutablePreloadChoices minusSet:choicesToUpload];
@@ -307,7 +307,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
}
// Remove the cells from pending and delete choices
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
[self.pendingMutablePreloadChoices minusSet:cellsToBeRemovedFromPending];
}];
@@ -341,7 +341,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
return;
}
- [strongSelf sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
[strongSelf.preloadedMutableChoices minusSet:cellsToBeDeleted];
}];
@@ -522,7 +522,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (NSSet<SDLChoiceCell *> *)preloadedChoices {
__block NSSet<SDLChoiceCell *> *set = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
set = [self->_preloadedMutableChoices copy];
}];
@@ -531,7 +531,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (NSSet<SDLChoiceCell *> *)pendingPreloadChoices {
__block NSSet<SDLChoiceCell *> *set = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
set = [self->_pendingMutablePreloadChoices copy];
}];
@@ -540,7 +540,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (UInt16)nextChoiceId {
__block UInt16 choiceId = 0;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
choiceId = self->_nextChoiceId;
self->_nextChoiceId = choiceId + 1;
}];
@@ -550,7 +550,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (UInt16)nextCancelId {
__block UInt16 cancelId = 0;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
cancelId = self->_nextCancelId;
self->_nextCancelId = cancelId + 1;
}];
@@ -562,19 +562,6 @@ UInt16 const ChoiceCellCancelIdMin = 1;
return self.stateMachine.currentState;
}
-#pragma mark Utilities
-
-/// Checks if we are already on a serial queue. If so, the block is added to the queue; if not, the block is dispatched to the serial `readWrite` queue.
-/// @discussion Used to synchronize access to class properties.
-/// @param block The block to be executed.
-- (void)sdl_runSyncOnQueue:(void (^)(void))block {
- if (dispatch_get_specific(SDLProcessingQueueName) != nil) {
- block();
- } else {
- dispatch_sync(self.readWriteQueue, block);
- }
-}
-
#pragma mark - RPC Responses / Notifications
- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
diff --git a/SmartDeviceLink/SDLConfiguration.h b/SmartDeviceLink/SDLConfiguration.h
index 663ca6a7d..17c7dc6ee 100644
--- a/SmartDeviceLink/SDLConfiguration.h
+++ b/SmartDeviceLink/SDLConfiguration.h
@@ -38,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
* The streaming media configuration.
*/
-@property (copy, nonatomic, readonly) SDLStreamingMediaConfiguration *streamingMediaConfig;
+@property (copy, nonatomic, readonly, nullable) SDLStreamingMediaConfiguration *streamingMediaConfig;
/**
* The file manager configuration.
@@ -51,37 +51,32 @@ NS_ASSUME_NONNULL_BEGIN
@property (copy, nonatomic, readonly) SDLEncryptionConfiguration *encryptionConfig;
/**
- * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.
- *
- * @param lifecycleConfig The lifecycle configuration to be used.
- * @param lockScreenConfig The lockscreen configuration to be used. If nil, the `enabledConfiguration` will be used.
- * @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
- * @return The configuration
- */
-- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:fileManager: instead");
-
-/**
- * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.
+ * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.
*
* @param lifecycleConfig The lifecycle configuration to be used.
* @param lockScreenConfig The lockscreen configuration to be used. If nil, the `enabledConfiguration` will be used.
* @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
* @param fileManagerConfig The file manager configuration to be used or `defaultConfiguration` if nil.
+ * @param encryptionConfig The encryption configuration to be used. If nil, the `defaultConfiguration` will be used.
* @return The configuration
*/
-- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:fileManager:encryption: instead");
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig encryption:(nullable SDLEncryptionConfiguration *)encryptionConfig;
/**
- * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.
+ * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media, file manager and encryption configurations.
*
* @param lifecycleConfig The lifecycle configuration to be used.
* @param lockScreenConfig The lockscreen configuration to be used. If nil, the `enabledConfiguration` will be used.
* @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
+ * @param streamingMediaConfig The streaming media configuration to be used or nil if not used.
* @param fileManagerConfig The file manager configuration to be used or `defaultConfiguration` if nil.
* @param encryptionConfig The encryption configuration to be used. If nil, the `defaultConfiguration` will be used.
* @return The configuration
*/
-- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig encryption:(nullable SDLEncryptionConfiguration *)encryptionConfig;
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig encryption:(nullable SDLEncryptionConfiguration *)encryptionConfig;
+
+
+#pragma mark - Deprecated Initializers
/**
* Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.
@@ -91,7 +86,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
* @return The configuration
*/
-+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig __deprecated_msg("Use configurationWithLifecycle:lockScreen:logging:fileManager: instead") NS_SWIFT_UNAVAILABLE("Use an initializer instead");
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:fileManager:encryption: instead");
/**
* Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.
@@ -102,7 +97,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param fileManagerConfig The file manager configuration to be used or `defaultConfiguration` if nil.
* @return The configuration
*/
-+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig NS_SWIFT_UNAVAILABLE("Use an initializer instead");
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:fileManager:encryption: instead");
/**
* Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.
@@ -113,7 +108,7 @@ NS_ASSUME_NONNULL_BEGIN
* @param streamingMediaConfig The streaming media configuration to be used or nil if not used.
* @return The configuration
*/
-- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:streamingMedia:fileManager: instead");
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption: instead");
/**
* Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.
@@ -128,17 +123,27 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption: instead");
/**
- * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media, file manager and encryption configurations.
+ * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.
+ *
+ * @param lifecycleConfig The lifecycle configuration to be used.
+ * @param lockScreenConfig The lockscreen configuration to be used. If nil, the `enabledConfiguration` will be used.
+ * @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
+ * @param fileManagerConfig The file manager configuration to be used or `defaultConfiguration` if nil.
+ * @return The configuration
+ */
++ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:fileManager:encryption: instead") NS_SWIFT_UNAVAILABLE("Use an initializer instead");
+
+/**
+ * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.
*
* @param lifecycleConfig The lifecycle configuration to be used.
* @param lockScreenConfig The lockscreen configuration to be used. If nil, the `enabledConfiguration` will be used.
* @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
* @param streamingMediaConfig The streaming media configuration to be used or nil if not used.
* @param fileManagerConfig The file manager configuration to be used or `defaultConfiguration` if nil.
- * @param encryptionConfig The encryption configuration to be used. If nil, the `defaultConfiguration` will be used.
* @return The configuration
*/
-- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig encryption:(nullable SDLEncryptionConfiguration *)encryptionConfig;
++ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption: instead") NS_SWIFT_UNAVAILABLE("Use an initializer instead");
/**
* Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.
@@ -149,19 +154,17 @@ NS_ASSUME_NONNULL_BEGIN
* @param streamingMediaConfig The streaming media configuration to be used or nil if not used.
* @return The configuration
*/
-+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig __deprecated_msg("Use configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager: instead") NS_SWIFT_UNAVAILABLE("Use an initializer instead");
++ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption: instead") NS_SWIFT_UNAVAILABLE("Use an initializer instead");
/**
- * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.
+ * Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.
*
* @param lifecycleConfig The lifecycle configuration to be used.
* @param lockScreenConfig The lockscreen configuration to be used. If nil, the `enabledConfiguration` will be used.
* @param logConfig The logging configuration to be used. If nil, the `defaultConfiguration` will be used.
- * @param streamingMediaConfig The streaming media configuration to be used or nil if not used.
- * @param fileManagerConfig The file manager configuration to be used or `defaultConfiguration` if nil.
* @return The configuration
*/
-+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig NS_SWIFT_UNAVAILABLE("Use an initializer instead");
++ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig __deprecated_msg("Use initWithLifecycle:lockScreen:logging:fileManager:encryption: instead") NS_SWIFT_UNAVAILABLE("Use an initializer instead");
@end
diff --git a/SmartDeviceLink/SDLConfiguration.m b/SmartDeviceLink/SDLConfiguration.m
index 626b25d03..bd1e85fdc 100644
--- a/SmartDeviceLink/SDLConfiguration.m
+++ b/SmartDeviceLink/SDLConfiguration.m
@@ -24,11 +24,11 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig {
- return [self initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:nil fileManager:nil encryption: nil];
+ return [self initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:nil fileManager:nil encryption:nil];
}
- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig {
- return [self initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:logConfig fileManager:nil encryption: nil];
+ return [self initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:logConfig fileManager:nil encryption:nil];
}
- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig {
@@ -36,18 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig encryption:(nullable SDLEncryptionConfiguration *)encryptionConfig {
- self = [super init];
- if (!self) {
- return nil;
- }
-
- _lifecycleConfig = lifecycleConfig;
- _lockScreenConfig = lockScreenConfig ?: [SDLLockScreenConfiguration enabledConfiguration];
- _loggingConfig = logConfig ?: [SDLLogConfiguration defaultConfiguration];
- _fileManagerConfig = fileManagerConfig ?: [SDLFileManagerConfiguration defaultConfiguration];
- _encryptionConfig = encryptionConfig ?: [SDLEncryptionConfiguration defaultConfiguration];
-
- return self;
+ return [self initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:logConfig streamingMedia:nil fileManager:fileManagerConfig encryption:encryptionConfig];
}
+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfiguration {
@@ -55,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN
}
+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig {
- return [self configurationWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:nil fileManager:nil];
+ return [[self alloc] initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:nil fileManager:nil encryption:nil];
}
+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig {
@@ -63,7 +52,7 @@ NS_ASSUME_NONNULL_BEGIN
}
+ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig fileManager:(nullable SDLFileManagerConfiguration *)fileManagerConfig {
- return [[self alloc] initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:logConfig fileManager:fileManagerConfig encryption: nil];
+ return [[self alloc] initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig logging:logConfig fileManager:fileManagerConfig encryption:nil];
}
- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(nullable SDLLockScreenConfiguration *)lockScreenConfig logging:(nullable SDLLogConfiguration *)logConfig streamingMedia:(nullable SDLStreamingMediaConfiguration *)streamingMediaConfig {
@@ -97,6 +86,13 @@ NS_ASSUME_NONNULL_BEGIN
_fileManagerConfig = fileManagerConfig ?: [SDLFileManagerConfiguration defaultConfiguration];
_encryptionConfig = encryptionConfig ?: [SDLEncryptionConfiguration defaultConfiguration];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ if (_encryptionConfig.securityManagers == nil && _streamingMediaConfig.securityManagers != nil) {
+ _encryptionConfig.securityManagers = _streamingMediaConfig.securityManagers;
+ }
+#pragma clang diagnostic pop
+
return self;
}
diff --git a/SmartDeviceLink/SDLConnectionManagerType.h b/SmartDeviceLink/SDLConnectionManagerType.h
index d0e7f7f84..2602a7315 100644
--- a/SmartDeviceLink/SDLConnectionManagerType.h
+++ b/SmartDeviceLink/SDLConnectionManagerType.h
@@ -29,8 +29,8 @@ NS_ASSUME_NONNULL_BEGIN
/**
* Sends an RPC of type `SDLRPCRequest` without bypassing the block on RPC sends before managers complete setup.
*
- * @param request An RPC of type `SDLRPCRequest` be sent to Core.
- * @param handler Called when the response is received by Core
+ * @param request An RPC of type `SDLRPCRequest` be sent to Core.
+ * @param handler Called when the response is received by Core
*/
- (void)sendConnectionRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler;
@@ -39,11 +39,20 @@ NS_ASSUME_NONNULL_BEGIN
*
* Do not use to send an RPC of type `SDLRPCRequest`. Instead use `sendConnectionRequest:withResponseHandler:` to send a request.
*
- * @param rpc An RPC of type `SDLRPCResponse` or `SDLRPCNotification` to be sent to Core.
+ * @param rpc An RPC of type `SDLRPCResponse` or `SDLRPCNotification` to be sent to Core.
*/
- (void)sendConnectionRPC:(__kindof SDLRPCMessage *)rpc;
/**
+* Sends an RPC of type `SDLRPCResponse` or `SDLRPCNotification` and bypasses the block on RPC sends before managers complete setup. Unlike requests, responses and notifications sent to Core do not get a response from Core, so no handler is needed.
+*
+* Do not use to send an RPC of type `SDLRPCRequest`. Instead use `sendConnectionRequest:withResponseHandler:` to send a request.
+*
+* @param rpc An RPC of type `SDLRPCResponse` or `SDLRPCNotification` to be sent to Core.
+*/
+- (void)sendConnectionManagerRPC:(__kindof SDLRPCMessage *)rpc;
+
+/**
* Sends an array of RPCs of type `Request` asynchronously. The requests are sent without bypassing the block on RPC sends before managers complete setup.
*
* @param requests An array of RPCs of type `Request`
diff --git a/SmartDeviceLink/SDLDriverDistractionCapability.h b/SmartDeviceLink/SDLDriverDistractionCapability.h
new file mode 100644
index 000000000..3f2943bef
--- /dev/null
+++ b/SmartDeviceLink/SDLDriverDistractionCapability.h
@@ -0,0 +1,63 @@
+/*
+ * 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"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @since SDL 7.0.0
+ */
+@interface SDLDriverDistractionCapability : SDLRPCStruct
+
+/**
+ * @param menuLength - menuLength
+ * @param subMenuDepth - subMenuDepth
+ * @return A SDLDriverDistractionCapability object
+ */
+- (instancetype)initWithMenuLength:(nullable NSNumber<SDLInt> *)menuLength subMenuDepth:(nullable NSNumber<SDLUInt> *)subMenuDepth;
+
+/**
+ * The number of items allowed in a Choice Set or Command menu while the driver is distracted
+ * {"default_value": null, "max_value": null, "min_value": null}
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLInt> *menuLength;
+
+/**
+ * The depth of submenus allowed when the driver is distracted. e.g. 3 == top level menu -> submenu -> submenu; 1 == top level menu only
+ * {"default_value": null, "max_value": null, "min_value": 1}
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLUInt> *subMenuDepth;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLDriverDistractionCapability.m b/SmartDeviceLink/SDLDriverDistractionCapability.m
new file mode 100644
index 000000000..3bfca9855
--- /dev/null
+++ b/SmartDeviceLink/SDLDriverDistractionCapability.m
@@ -0,0 +1,69 @@
+/*
+ * 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 "SDLDriverDistractionCapability.h"
+#import "NSMutableDictionary+Store.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLDriverDistractionCapability
+
+- (instancetype)initWithMenuLength:(nullable NSNumber<SDLInt> *)menuLength subMenuDepth:(nullable NSNumber<SDLUInt> *)subMenuDepth {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+ self.menuLength = menuLength;
+ self.subMenuDepth = subMenuDepth;
+ return self;
+}
+
+- (void)setMenuLength:(nullable NSNumber<SDLInt> *)menuLength {
+ [self.store sdl_setObject:menuLength forName:SDLRPCParameterNameMenuLength];
+}
+
+- (nullable NSNumber<SDLInt> *)menuLength {
+ return [self.store sdl_objectForName:SDLRPCParameterNameMenuLength ofClass:NSNumber.class error:nil];
+}
+
+- (void)setSubMenuDepth:(nullable NSNumber<SDLUInt> *)subMenuDepth {
+ [self.store sdl_setObject:subMenuDepth forName:SDLRPCParameterNameSubMenuDepth];
+}
+
+- (nullable NSNumber<SDLUInt> *)subMenuDepth {
+ return [self.store sdl_objectForName:SDLRPCParameterNameSubMenuDepth ofClass:NSNumber.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLEncryptionConfiguration.h b/SmartDeviceLink/SDLEncryptionConfiguration.h
index 8173ba655..591884460 100644
--- a/SmartDeviceLink/SDLEncryptionConfiguration.h
+++ b/SmartDeviceLink/SDLEncryptionConfiguration.h
@@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
* A delegate callback that will tell you when an acknowledgement has occurred for starting as secure service.
*/
-@property (copy, nonatomic, nullable) id<SDLServiceEncryptionDelegate> delegate;
+@property (weak, nonatomic, nullable) id<SDLServiceEncryptionDelegate> delegate;
/**
* Creates a default encryption configuration.
diff --git a/SmartDeviceLink/SDLEncryptionLifecycleManager.h b/SmartDeviceLink/SDLEncryptionLifecycleManager.h
index eb6aa951e..33641fcf5 100644
--- a/SmartDeviceLink/SDLEncryptionLifecycleManager.h
+++ b/SmartDeviceLink/SDLEncryptionLifecycleManager.h
@@ -8,14 +8,14 @@
#import <Foundation/Foundation.h>
#import "SDLConnectionManagerType.h"
-#import "SDLProtocolListener.h"
+#import "SDLProtocolDelegate.h"
-@class SDLEncryptionConfiguration;
+@class SDLConfiguration;
@class SDLProtocol;
NS_ASSUME_NONNULL_BEGIN
-@interface SDLEncryptionLifecycleManager : NSObject <SDLProtocolListener>
+@interface SDLEncryptionLifecycleManager : NSObject <SDLProtocolDelegate>
/**
* Whether or not the encryption session is connected.
@@ -32,7 +32,7 @@ NS_ASSUME_NONNULL_BEGIN
@param configuration This session's configuration
@return A new encryption lifecycle manager
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLEncryptionConfiguration *)configuration;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLConfiguration *)configuration;
/**
* Start the manager. This is used internally to get notified of the ACK message.
diff --git a/SmartDeviceLink/SDLEncryptionLifecycleManager.m b/SmartDeviceLink/SDLEncryptionLifecycleManager.m
index dcbf773db..b141080e4 100644
--- a/SmartDeviceLink/SDLEncryptionLifecycleManager.m
+++ b/SmartDeviceLink/SDLEncryptionLifecycleManager.m
@@ -6,25 +6,32 @@
// Copyright © 2019 smartdevicelink. All rights reserved.
//
+#import "SDLAsynchronousRPCRequestOperation.h"
+#import "SDLConfiguration.h"
#import "SDLEncryptionLifecycleManager.h"
#import "SDLEncryptionManagerConstants.h"
#import "SDLEncryptionConfiguration.h"
-#import "SDLServiceEncryptionDelegate.h"
-#import "SDLAsynchronousRPCRequestOperation.h"
+#import "SDLError.h"
+#import "SDLLifecycleConfiguration.h"
#import "SDLLogMacros.h"
-#import "SDLStateMachine.h"
-#import "SDLProtocolMessage.h"
-#import "SDLRPCNotificationNotification.h"
#import "SDLOnHMIStatus.h"
#import "SDLOnPermissionsChange.h"
#import "SDLPermissionItem.h"
#import "SDLPermissionConstants.h"
#import "SDLProtocol.h"
-#import "SDLError.h"
+#import "SDLProtocolMessage.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCResponseNotification.h"
+#import "SDLServiceEncryptionDelegate.h"
+#import "SDLStateMachine.h"
+#import "SDLVehicleType.h"
NS_ASSUME_NONNULL_BEGIN
-@interface SDLEncryptionLifecycleManager() <SDLProtocolListener>
+typedef NSString SDLVehicleMake;
+
+@interface SDLEncryptionLifecycleManager() <SDLProtocolDelegate>
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLProtocol *protocol;
@@ -33,13 +40,15 @@ NS_ASSUME_NONNULL_BEGIN
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (strong, nonatomic, nullable) NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *permissions;
@property (assign, nonatomic) BOOL requiresEncryption;
-@property (weak, nonatomic, nullable) id<SDLServiceEncryptionDelegate> delegate;
+@property (strong, nonatomic) SDLConfiguration *configuration;
+
+@property (nonatomic, strong) NSMutableDictionary<SDLVehicleMake *, Class> *securityManagers;
@end
@implementation SDLEncryptionLifecycleManager
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLEncryptionConfiguration *)configuration {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLConfiguration *)configuration {
self = [super init];
if (!self) {
return nil;
@@ -49,16 +58,37 @@ NS_ASSUME_NONNULL_BEGIN
_connectionManager = connectionManager;
_currentHMILevel = nil;
_requiresEncryption = NO;
+ _securityManagers = [NSMutableDictionary dictionary];
_encryptionStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLEncryptionLifecycleManagerStateStopped states:[self.class sdl_encryptionStateTransitionDictionary]];
_permissions = [NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> dictionary];
- _delegate = configuration.delegate;
+ _configuration = configuration;
+ for (Class securityManagerClass in _configuration.encryptionConfig.securityManagers) {
+ if (![securityManagerClass conformsToProtocol:@protocol(SDLSecurityType)]) {
+ NSString *reason = [NSString stringWithFormat:@"Invalid security manager: Class %@ does not conform to SDLSecurityType protocol", NSStringFromClass(securityManagerClass)];
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil];
+ }
+
+ NSSet<NSString *> *vehicleMakes = [securityManagerClass availableMakes];
+ if (vehicleMakes == nil || vehicleMakes.count == 0) {
+ NSString *reason = [NSString stringWithFormat:@"Invalid security manager: Failed to retrieve makes for class %@", NSStringFromClass(securityManagerClass)];
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil];
+ }
+
+ for (NSString *vehicleMake in vehicleMakes) {
+ self.securityManagers[vehicleMake] = securityManagerClass;
+ }
+ }
+
+ [[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];
return self;
}
+#pragma mark - Lifecycle
+
- (void)startWithProtocol:(SDLProtocol *)protocol {
SDLLogD(@"Starting encryption manager");
_protocol = protocol;
@@ -71,13 +101,14 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)stop {
- _permissions = nil;
+ SDLLogD(@"Stopping encryption manager");
+
+ [_permissions removeAllObjects];
_protocol = nil;
_currentHMILevel = nil;
_requiresEncryption = NO;
- _delegate = nil;
- SDLLogD(@"Stopping encryption manager");
+ [self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStopped];
}
- (BOOL)isEncryptionReady {
@@ -92,7 +123,7 @@ NS_ASSUME_NONNULL_BEGIN
SDLLogV(@"Attempting to start Encryption Service");
if (!self.protocol || !self.currentHMILevel) {
SDLLogV(@"Encryption manager is not yet started");
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
return;
}
@@ -101,7 +132,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStarting];
} else {
SDLLogE(@"Encryption Manager is not ready to encrypt.");
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
}
}
}
@@ -112,12 +143,13 @@ NS_ASSUME_NONNULL_BEGIN
if (error) {
SDLLogE(@"TLS setup error: %@", error);
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStopped];
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:error];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:error];
}
}];
}
-#pragma mark Encryption
+#pragma mark - State Machine
+
+ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_encryptionStateTransitionDictionary {
return @{
SDLEncryptionLifecycleManagerStateStopped : @[SDLEncryptionLifecycleManagerStateStarting],
@@ -126,7 +158,6 @@ NS_ASSUME_NONNULL_BEGIN
};
}
-#pragma mark - State Machine
- (void)didEnterStateEncryptionStarting {
SDLLogD(@"Encryption manager is starting");
[self sdl_sendEncryptionStartService];
@@ -140,10 +171,10 @@ NS_ASSUME_NONNULL_BEGIN
SDLLogD(@"Encryption manager stopped");
}
-#pragma mark - SDLProtocolListener
+#pragma mark - SDLProtocolDelegate
#pragma mark Encryption Start Service ACK
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
switch (startServiceACK.header.serviceType) {
case SDLServiceTypeRPC: {
[self sdl_handleEncryptionStartServiceACK:startServiceACK];
@@ -156,17 +187,17 @@ NS_ASSUME_NONNULL_BEGIN
if (encryptionStartServiceAck.header.encrypted) {
SDLLogD(@"Encryption service started");
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateReady];
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:YES error:nil];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:YES error:nil];
} else {
SDLLogD(@"Encryption service ACK received encryption = OFF");
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStopped];
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_encryption_off]];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_encryption_off]];
}
}
#pragma mark Encryption Start Service NAK
-- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK {
switch (startServiceNAK.header.serviceType) {
case SDLServiceTypeRPC: {
[self sdl_handleEncryptionStartServiceNAK:startServiceNAK];
@@ -178,41 +209,49 @@ NS_ASSUME_NONNULL_BEGIN
- (void)sdl_handleEncryptionStartServiceNAK:(SDLProtocolMessage *)audioStartServiceNak {
SDLLogW(@"Encryption service failed to start due to NAK");
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStopped];
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_nak]];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_nak]];
}
#pragma mark Encryption End Service
-- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK {
switch (endServiceACK.header.serviceType) {
case SDLServiceTypeRPC: {
SDLLogW(@"Encryption RPC service ended with end service ACK");
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStopped];
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
} break;
default: break;
}
}
-- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK {
switch (endServiceNAK.header.serviceType) {
case SDLServiceTypeRPC: {
SDLLogW(@"Encryption RPC service ended with end service NAK");
[self.encryptionStateMachine transitionToState:SDLEncryptionLifecycleManagerStateStopped];
- [self.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
+ [self.configuration.encryptionConfig.delegate serviceEncryptionUpdatedOnService:SDLServiceTypeRPC encrypted:NO error:[NSError sdl_encryption_lifecycle_notReadyError]];
} break;
default: break;
}
}
-#pragma mark - SDL RPC Notification callbacks
-- (void)sdl_hmiLevelDidChange:(SDLRPCNotificationNotification *)notification {
- if (![notification isNotificationMemberOfClass:[SDLOnHMIStatus class]]) {
- return;
+#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; }
SDLOnHMIStatus *hmiStatus = notification.notification;
-
self.currentHMILevel = hmiStatus.hmiLevel;
// if startWithProtocol has not been called yet, abort here
@@ -246,6 +285,20 @@ NS_ASSUME_NONNULL_BEGIN
}
}
+
+#pragma mark - Utilities
+
+- (nullable id<SDLSecurityType>)sdl_securityManagerForMake:(NSString *)make {
+ if ((make != nil) && (self.securityManagers[make] != nil)) {
+ Class securityManagerClass = self.securityManagers[make];
+ return [[securityManagerClass alloc] init];
+ }
+
+ return nil;
+}
+
+#pragma mark Encryption Status
+
- (BOOL)sdl_appRequiresEncryption {
if (self.requiresEncryption && [self sdl_containsAtLeastOneRPCThatRequiresEncryption]) {
return YES;
diff --git a/SmartDeviceLink/SDLError.h b/SmartDeviceLink/SDLError.h
index edfe87bc0..622da44b0 100644
--- a/SmartDeviceLink/SDLError.h
+++ b/SmartDeviceLink/SDLError.h
@@ -62,9 +62,10 @@ extern SDLErrorDomain *const SDLErrorDomainAudioStreamManager;
+ (NSError *)sdl_fileManager_dataMissingError;
+ (NSError *)sdl_fileManager_staticIconError;
-#pragma mark Show Managers
+#pragma mark Screen Managers
+ (NSError *)sdl_softButtonManager_pendingUpdateSuperseded;
++ (NSError *)sdl_subscribeButtonManager_notSubscribed;
+ (NSError *)sdl_textAndGraphicManager_pendingUpdateSuperseded;
#pragma mark Menu Manager
@@ -115,7 +116,8 @@ extern SDLErrorDomain *const SDLErrorDomainAudioStreamManager;
+ (NSException *)sdl_invalidSoftButtonStateException;
+ (NSException *)sdl_carWindowOrientationException;
+ (NSException *)sdl_invalidLockscreenSetupException;
-+ (NSException *)sdl_invalidSelectorExceptionWithSelector:(SEL)selector;
++ (NSException *)sdl_invalidSystemCapabilitySelectorExceptionWithSelector:(SEL)selector;
++ (NSException *)sdl_invalidSubscribeButtonSelectorExceptionWithSelector:(SEL)selector;
@end
diff --git a/SmartDeviceLink/SDLError.m b/SmartDeviceLink/SDLError.m
index 7e1f0c65e..19e37950f 100644
--- a/SmartDeviceLink/SDLError.m
+++ b/SmartDeviceLink/SDLError.m
@@ -19,6 +19,7 @@ SDLErrorDomain *const SDLErrorDomainEncryptionLifecycleManager = @"com.sdl.encry
SDLErrorDomain *const SDLErrorDomainFileManager = @"com.sdl.filemanager.error";
SDLErrorDomain *const SDLErrorDomainTextAndGraphicManager = @"com.sdl.textandgraphicmanager.error";
SDLErrorDomain *const SDLErrorDomainSoftButtonManager = @"com.sdl.softbuttonmanager.error";
+SDLErrorDomain *const SDLErrorDomainSubscribeButtonManager = @"com.sdl.subscribebuttonmanager.error";
SDLErrorDomain *const SDLErrorDomainMenuManager = @"com.sdl.menumanager.error";
SDLErrorDomain *const SDLErrorDomainChoiceSetManager = @"com.sdl.choicesetmanager.error";
SDLErrorDomain *const SDLErrorDomainSystemCapabilityManager = @"com.sdl.systemcapabilitymanager.error";
@@ -258,6 +259,15 @@ SDLErrorDomain *const SDLErrorDomainAudioStreamManager = @"com.sdl.extension.pcm
return [NSError errorWithDomain:SDLErrorDomainSoftButtonManager code:SDLSoftButtonManagerErrorPendingUpdateSuperseded userInfo:nil];
}
++ (NSError *)sdl_subscribeButtonManager_notSubscribed {
+ NSDictionary<NSString *, NSString *> *userInfo = @{
+ NSLocalizedDescriptionKey: @"Subscribe Button Manager error",
+ NSLocalizedFailureReasonErrorKey: @"The subscribe button manager has not yet subscribed to the button being unsubscribed.",
+ NSLocalizedRecoverySuggestionErrorKey: @"Make sure you have used the Subscribe Button Manager to subscribe to the button name that you are attempting to unsubscribe."
+ };
+ return [NSError errorWithDomain:SDLErrorDomainSubscribeButtonManager code:SDLSubscribeButtonManagerErrorNotSubscribed userInfo:userInfo];
+}
+
#pragma mark Menu Manager
+ (NSError *)sdl_menuManager_failedToUpdateWithDictionary:(NSDictionary *)userInfo {
@@ -439,12 +449,18 @@ SDLErrorDomain *const SDLErrorDomainAudioStreamManager = @"com.sdl.extension.pcm
userInfo:nil];
}
-+ (NSException *)sdl_invalidSelectorExceptionWithSelector:(SEL)selector {
++ (NSException *)sdl_invalidSystemCapabilitySelectorExceptionWithSelector:(SEL)selector {
return [NSException exceptionWithName:@"com.sdl.systemCapabilityManager.selectorException"
reason:[NSString stringWithFormat:@"Capability observation selector: %@ does not match possible selectors, which must have between 0 and 3 parameters, or is not a selector on the observer object. Check that your selector is formatted correctly, and that your observer is not nil. You should unsubscribe an observer before it goes to nil.", NSStringFromSelector(selector)]
userInfo:nil];
}
++ (NSException *)sdl_invalidSubscribeButtonSelectorExceptionWithSelector:(SEL)selector {
+ return [NSException exceptionWithName:@"com.sdl.subscribeButtonManager.selectorException"
+ reason:[NSString stringWithFormat:@"Subscribe button observation selector: %@ does not match possible selectors, which must have between 0 and 4 parameters, or is not a selector on the observer object. Check that your selector is formatted correctly, and that your observer is not nil. You should unsubscribe an observer before it goes to nil.", NSStringFromSelector(selector)]
+ userInfo:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLErrorConstants.h b/SmartDeviceLink/SDLErrorConstants.h
index 8631e603f..89e46c133 100644
--- a/SmartDeviceLink/SDLErrorConstants.h
+++ b/SmartDeviceLink/SDLErrorConstants.h
@@ -119,7 +119,7 @@ typedef NS_ENUM(NSInteger, SDLTextAndGraphicManagerError) {
};
/**
- Errors associated with the ScreenManager class
+ Errors associated with the Soft Button Manager class
*/
typedef NS_ENUM(NSInteger, SDLSoftButtonManagerError) {
/// A pending update was superseded by a newer requested update. The old update will not be sent
@@ -127,6 +127,14 @@ typedef NS_ENUM(NSInteger, SDLSoftButtonManagerError) {
};
/**
+ Errors associated with the Subscribe Button Manager class
+ */
+typedef NS_ENUM(NSInteger, SDLSubscribeButtonManagerError) {
+ /// Attempting to unsubscribe to a subscribe button that has not yet been subscribed to yet.
+ SDLSubscribeButtonManagerErrorNotSubscribed = -1
+};
+
+/**
Errors associated with the ScreenManager class
*/
typedef NS_ENUM(NSInteger, SDLMenuManagerError) {
@@ -152,9 +160,15 @@ typedef NS_ENUM(NSInteger, SDLChoiceSetManagerError) {
SDLChoiceSetManagerErrorInvalidState = -5
};
+/// 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
SDLSystemCapabilityManagerErrorHMINone = -2,
+
+ /// You may not update the system capability type DISPLAYS because it is always subscribed
SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays = -3
};
@@ -193,13 +207,13 @@ typedef NS_ENUM(NSInteger, SDLRPCStoreError) {
SDLRPCStoreErrorGetInvalidObject = -1,
};
+/// Errors related to the cache file manager
typedef NS_ENUM(NSInteger, SDLCacheFileManagerError) {
- /**
- * Failed to update archive file
- */
+ /// Failed to update archive file
SDLCacheManagerErrorUpdateIconArchiveFileFailure = -1,
};
+/// Errors related to the audio stream manager
typedef NS_ENUM(NSInteger, SDLAudioStreamManagerError) {
/// The audio stream is not currently connected
SDLAudioStreamManagerErrorNotConnected = -1,
diff --git a/SmartDeviceLink/SDLFuelRange.h b/SmartDeviceLink/SDLFuelRange.h
index 3220256cb..981ecd94b 100644
--- a/SmartDeviceLink/SDLFuelRange.h
+++ b/SmartDeviceLink/SDLFuelRange.h
@@ -6,6 +6,8 @@
// Copyright © 2018 smartdevicelink. All rights reserved.
//
+#import "SDLCapacityUnit.h"
+#import "SDLComponentVolumeStatus.h"
#import "SDLRPCMessage.h"
#import "SDLFuelType.h"
@@ -17,6 +19,41 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLFuelRange : SDLRPCStruct
/**
+ * @param type - type
+ * @param range - @(range)
+ * @param level - @(level)
+ * @param levelState - levelState
+ * @param capacity - @(capacity)
+ * @param capacityUnit - capacityUnit
+ * @return A SDLFuelRange object
+ */
+- (instancetype)initWithType:(nullable SDLFuelType)type range:(float)range level:(float)level levelState:(nullable SDLComponentVolumeStatus)levelState capacity:(float)capacity capacityUnit:(nullable SDLCapacityUnit)capacityUnit;
+
+/**
+ * The absolute capacity of this fuel type.
+ *
+ * Optional, Float, 0.0 - 1000000.0
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLFloat> *capacity;
+
+/**
+ * The unit of the capacity of this fuel type such as liters for gasoline or kWh for batteries.
+ */
+@property (strong, nonatomic, nullable) SDLCapacityUnit capacityUnit;
+
+/**
+ * The relative remaining capacity of this fuel type (percentage).
+ *
+ * Optional, Float, -6.0 - 1000000.0
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLFloat> *level;
+
+/**
+ * The fuel level state.
+ */
+@property (strong, nonatomic, nullable) SDLComponentVolumeStatus levelState;
+
+/**
* The vehicle's fuel type
*
* Optional
diff --git a/SmartDeviceLink/SDLFuelRange.m b/SmartDeviceLink/SDLFuelRange.m
index 1512a0957..f8e54736d 100644
--- a/SmartDeviceLink/SDLFuelRange.m
+++ b/SmartDeviceLink/SDLFuelRange.m
@@ -15,6 +15,20 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLFuelRange
+- (instancetype)initWithType:(nullable SDLFuelType)type range:(float)range level:(float)level levelState:(nullable SDLComponentVolumeStatus)levelState capacity:(float)capacity capacityUnit:(nullable SDLCapacityUnit)capacityUnit {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+ self.type = type;
+ self.range = @(range);
+ self.level = @(level);
+ self.levelState = levelState;
+ self.capacity = @(capacity);
+ self.capacityUnit = capacityUnit;
+ return self;
+}
+
- (void)setType:(nullable SDLFuelType)type {
[self.store sdl_setObject:type forName:SDLRPCParameterNameType];
}
@@ -31,6 +45,41 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameRange ofClass:NSNumber.class error:nil];
}
+- (void)setLevel:(nullable NSNumber<SDLFloat> *)level {
+ [self.store sdl_setObject:level forName:SDLRPCParameterNameLevel];
+}
+
+- (nullable NSNumber<SDLFloat> *)level {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameLevel ofClass:NSNumber.class error:&error];
+}
+
+- (void)setLevelState:(nullable SDLComponentVolumeStatus)levelState {
+ [self.store sdl_setObject:levelState forName:SDLRPCParameterNameLevelState];
+}
+
+- (nullable SDLComponentVolumeStatus)levelState {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameLevelState error:&error];
+}
+
+- (void)setCapacity:(nullable NSNumber<SDLFloat> *)capacity {
+ [self.store sdl_setObject:capacity forName:SDLRPCParameterNameCapacity];
+}
+
+- (nullable NSNumber<SDLFloat> *)capacity {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameCapacity ofClass:NSNumber.class error:&error];
+}
+
+- (void)setCapacityUnit:(nullable SDLCapacityUnit)capacityUnit {
+ [self.store sdl_setObject:capacityUnit forName:SDLRPCParameterNameCapacityUnit];
+}
+
+- (nullable SDLCapacityUnit)capacityUnit {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameCapacityUnit error:&error];
+}
@end
diff --git a/SmartDeviceLink/SDLGetVehicleData.h b/SmartDeviceLink/SDLGetVehicleData.h
index b3da65b18..f6f890b10 100644
--- a/SmartDeviceLink/SDLGetVehicleData.h
+++ b/SmartDeviceLink/SDLGetVehicleData.h
@@ -47,7 +47,9 @@ 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 clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 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:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
+
+
/**
* Convenience init for getting data for all possible vehicle data items.
*
@@ -82,7 +84,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 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:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation 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:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for getting data for all possible vehicle data items.
@@ -119,15 +121,15 @@ 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:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: 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:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
+
/**
- * note: RPC generator produced initializer
+ * Convenience init for getting data for all possible vehicle data items.
+ *
* @param gps - gps
* @param speed - speed
* @param rpm - rpm
- * @param fuelLevel - fuelLevel
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - instantFuelConsumption
* @param fuelRange - fuelRange
* @param externalTemperature - externalTemperature
@@ -153,9 +155,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModeStatus - clusterModeStatus
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLGetVehicleData object
*/
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm fuelLevel:(nullable NSNumber<SDLBool> *)fuelLevel fuelLevel_State:(nullable NSNumber<SDLBool> *)fuelLevel_State 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 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;
+- (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 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;
/**
* A boolean value. If true, requests Gear Status data.
@@ -180,12 +183,12 @@ NS_ASSUME_NONNULL_BEGIN
/**
* A boolean value. If true, requests Fuel Level data.
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *fuelLevel;
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
* A boolean value. If true, requests Fuel Level State data.
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLBool> *fuelLevel_State;
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel_State __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
* A boolean value. If true, requests Fuel Range data.
@@ -248,6 +251,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) NSNumber<SDLBool> *wiperStatus;
/**
+ * To indicate whether driver hands are off the steering wheel
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *handsOffSteering;
+
+/**
* A boolean value. If true, requests Head Lamp Status data.
*/
@property (nullable, strong, nonatomic) NSNumber<SDLBool> *headLampStatus;
@@ -335,4 +343,3 @@ NS_ASSUME_NONNULL_BEGIN
@end
NS_ASSUME_NONNULL_END
-
diff --git a/SmartDeviceLink/SDLGetVehicleData.m b/SmartDeviceLink/SDLGetVehicleData.m
index a45f47505..8a0fa1519 100644
--- a/SmartDeviceLink/SDLGetVehicleData.m
+++ b/SmartDeviceLink/SDLGetVehicleData.m
@@ -15,46 +15,58 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (instancetype)init {
- if (self = [super initWithName:SDLRPCFunctionNameGetVehicleData]) {
+ self = [super initWithName:SDLRPCFunctionNameGetVehicleData];
+ if (!self) {
+ return nil;
}
return self;
}
#pragma clang diagnostic pop
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus {
- self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) instantFuelConsumption:@(instantFuelConsumption) fuelRange:nil externalTemperature:@(externalTemperature) turnSignal:nil 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:nil electronicParkBrakeStatus:nil cloudAppVehicleID:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
+ self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:nil externalTemperature:@(externalTemperature) turnSignal:nil 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:nil electronicParkBrakeStatus:nil cloudAppVehicleID:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- self.prndl = @(prndl);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.prndl = @(prndl);
#pragma clang diagnostic pop
}
return self;
}
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation 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) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) 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:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
+ 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:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- self.prndl = @(prndl);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.prndl = @(prndl);
#pragma clang diagnostic pop
}
return self;
}
+- (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 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 {
+ return [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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
+}
+
- (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) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) 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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
+ 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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- self.prndl = @(prndl);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.prndl = @(prndl);
#pragma clang diagnostic pop
}
return self;
}
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm fuelLevel:(nullable NSNumber<SDLBool> *)fuelLevel fuelLevel_State:(nullable NSNumber<SDLBool> *)fuelLevel_State 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 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 {
+- (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 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 {
self = [self init];
if (!self) {
return nil;
@@ -62,8 +74,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = speed;
self.rpm = rpm;
- self.fuelLevel = fuelLevel;
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
self.externalTemperature = externalTemperature;
@@ -89,6 +99,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -337,8 +348,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (nullable NSNumber<SDLBool> *)gearStatus {
- NSError *error = nil;
- return [self.parameters sdl_objectForName:SDLRPCParameterNameGearStatus ofClass:NSNumber.class error:&error];
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameGearStatus ofClass:NSNumber.class error:nil];
}
- (void)setOEMCustomVehicleData:(NSString *)vehicleDataName withVehicleDataState:(BOOL)vehicleDataState {
@@ -349,6 +359,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSNumber.class error:nil];
}
+- (void)setHandsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable NSNumber<SDLBool> *)handsOffSteering {
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLGetVehicleDataResponse.h b/SmartDeviceLink/SDLGetVehicleDataResponse.h
index 29854ce60..ed77fe557 100644
--- a/SmartDeviceLink/SDLGetVehicleDataResponse.h
+++ b/SmartDeviceLink/SDLGetVehicleDataResponse.h
@@ -36,13 +36,11 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLGetVehicleDataResponse : SDLRPCResponse
/**
- * Convenience init.
+ * initializes a new allocated object of the SDLGetVehicleDataResponse class
*
* @param gps - gps
* @param speed - @(speed)
* @param rpm - rpm
- * @param fuelLevel - @(fuelLevel)
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - @(instantFuelConsumption)
* @param fuelRange - fuelRange
* @param externalTemperature - @(externalTemperature)
@@ -68,9 +66,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModeStatus - clusterModeStatus
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLGetVehicleDataResponse object
*/
-- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm fuelLevel:(float)fuelLevel fuelLevel_State:(nullable SDLComponentVolumeStatus)fuelLevel_State instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey;
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID 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;
/**
* The Gear Status
@@ -95,12 +94,12 @@ NS_ASSUME_NONNULL_BEGIN
/**
The fuel level in the tank (percentage)
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *fuelLevel;
+@property (strong, nonatomic, nullable) NSNumber<SDLFloat> *fuelLevel __deprecated_msg("use fuelRange.level instead on 7.0+ RPC version connections");
/**
The fuel level state
*/
-@property (nullable, strong, nonatomic) SDLComponentVolumeStatus fuelLevel_State;
+@property (strong, nonatomic, nullable) SDLComponentVolumeStatus fuelLevel_State __deprecated_msg("use fuelRange.levelState instead on 7.0+ RPC version connections");
/**
The estimate range in KM the vehicle can travel based on fuel level and consumption
@@ -165,6 +164,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) SDLWiperStatus wiperStatus;
/**
+ To indicate whether driver hands are off the steering wheel
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *handsOffSteering;
+
+/**
Status of the head lamps
*/
@property (nullable, strong, nonatomic) SDLHeadLampStatus *headLampStatus;
diff --git a/SmartDeviceLink/SDLGetVehicleDataResponse.m b/SmartDeviceLink/SDLGetVehicleDataResponse.m
index ccbdabbed..0f6f12802 100644
--- a/SmartDeviceLink/SDLGetVehicleDataResponse.m
+++ b/SmartDeviceLink/SDLGetVehicleDataResponse.m
@@ -36,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma clang diagnostic pop
-- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm fuelLevel:(float)fuelLevel fuelLevel_State:(nullable SDLComponentVolumeStatus)fuelLevel_State instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey {
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID 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 {
self = [self init];
if (!self) {
return nil;
@@ -44,8 +44,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = @(speed);
self.rpm = rpm;
- self.fuelLevel = @(fuelLevel);
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = @(instantFuelConsumption);
self.fuelRange = fuelRange;
self.externalTemperature = @(externalTemperature);
@@ -71,6 +69,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -331,6 +330,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSObject.class error:nil];
}
+- (void)setHandsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable NSNumber<SDLBool> *)handsOffSteering {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:NSNumber.class error:&error];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLGlobals.h b/SmartDeviceLink/SDLGlobals.h
index 004a0e8d9..321fc60b4 100644
--- a/SmartDeviceLink/SDLGlobals.h
+++ b/SmartDeviceLink/SDLGlobals.h
@@ -43,6 +43,11 @@ extern void *const SDLConcurrentQueueName;
- (void)setDynamicMTUSize:(NSUInteger)maxMTUSize forServiceType:(SDLServiceType)serviceType;
- (NSUInteger)mtuSizeForServiceType:(SDLServiceType)serviceType;
+/// Calls a block on an SDL sub-queue of the internal serial SDLProcessingQueue. If the call to this method is already on that queue, the block will be run, if it is not, a `dispatch_sync` will occur to that queue first.
+/// @param queue The queue to run on. The passed queue should be a sub-queue of the SDLProcessingQueue. If it is not and the call to this method occurs on the passed queue, a deadlock will occur because the check will not pass correctly.
+/// @param block The block to run on the serial sub-queue.
++ (void)runSyncOnSerialSubQueue:(dispatch_queue_t)queue block:(void (^)(void))block;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLGlobals.m b/SmartDeviceLink/SDLGlobals.m
index dc78e7a56..00d764edb 100644
--- a/SmartDeviceLink/SDLGlobals.m
+++ b/SmartDeviceLink/SDLGlobals.m
@@ -15,8 +15,8 @@
NS_ASSUME_NONNULL_BEGIN
// VERSION DEPENDENT CODE
-NSString *const SDLMaxProxyProtocolVersion = @"5.2.0";
-NSString *const SDLMaxProxyRPCVersion = @"6.0.0";
+NSString *const SDLMaxProxyProtocolVersion = @"5.3.0";
+NSString *const SDLMaxProxyRPCVersion = @"7.0.0";
NSUInteger const SDLDefaultMTUSize = UINT32_MAX;
NSUInteger const SDLV1MTUSize = 1024;
@@ -71,6 +71,13 @@ typedef NSNumber *MTUBox;
return self;
}
++ (void)runSyncOnSerialSubQueue:(dispatch_queue_t)queue block:(void (^)(void))block {
+ if (dispatch_get_specific(SDLProcessingQueueName) != nil) {
+ block();
+ } else {
+ dispatch_sync(queue, block);
+ }
+}
#pragma mark - Custom Getters / Setters
diff --git a/SmartDeviceLink/SDLH264VideoEncoder.m b/SmartDeviceLink/SDLH264VideoEncoder.m
index f00f1a18d..2d58a1263 100644
--- a/SmartDeviceLink/SDLH264VideoEncoder.m
+++ b/SmartDeviceLink/SDLH264VideoEncoder.m
@@ -22,7 +22,7 @@ static NSDictionary<NSString *, id>* _defaultVideoEncoderSettings;
@interface SDLH264VideoEncoder ()
@property (assign, nonatomic, nullable) VTCompressionSessionRef compressionSession;
-@property (assign, nonatomic, nullable) CFDictionaryRef sdl_pixelBufferOptions;
+@property (assign, nonatomic, nullable) CFDictionaryRef pixelBufferOptions;
@property (assign, nonatomic) NSUInteger currentFrameNumber;
@property (assign, nonatomic) double timestampOffset;
@@ -60,59 +60,21 @@ static NSDictionary<NSString *, id>* _defaultVideoEncoderSettings;
_currentFrameNumber = 0;
_videoEncoderSettings = properties;
_dimensions = dimensions;
-
_delegate = delegate;
-
- OSStatus status;
-
- // Create a compression session
- status = VTCompressionSessionCreate(NULL, (int32_t)dimensions.width, (int32_t)dimensions.height, kCMVideoCodecType_H264, NULL, self.sdl_pixelBufferOptions, NULL, &sdl_videoEncoderOutputCallback, (__bridge void *)self, &_compressionSession);
-
- if (status != noErr) {
- if (error != NULL) {
- *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionCreationFailure userInfo:@{@"OSStatus":@(status), NSLocalizedDescriptionKey:@"Compression session could not be created"}];
- }
-
+
+ BOOL compressionSessionCreated = [self sdl_createCompressionSessionWithError:error];
+ if (!compressionSessionCreated) {
return nil;
}
-
- CFRelease(_sdl_pixelBufferOptions);
- _sdl_pixelBufferOptions = nil;
-
- // Validate that the video encoder properties are valid.
- CFDictionaryRef supportedProperties;
- status = VTSessionCopySupportedPropertyDictionary(self.compressionSession, &supportedProperties);
- if (status != noErr) {
- if (error != NULL) {
- *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{@"OSStatus":@(status), NSLocalizedDescriptionKey:[NSString stringWithFormat:@"\"%@\" are not supported properties.", supportedProperties]}];
- }
-
+
+ BOOL videoEncoderPropertiesValid = [self sdl_validateVideoEncoderPropertiesOnCompressionSession:self.compressionSession withError:error];
+ if (!videoEncoderPropertiesValid) {
return nil;
}
-
- NSArray* videoEncoderKeys = self.videoEncoderSettings.allKeys;
- for (NSString *key in videoEncoderKeys) {
- if (CFDictionaryContainsKey(supportedProperties, (__bridge CFStringRef)key) == false) {
- if (error != NULL) {
- *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{NSLocalizedDescriptionKey:[NSString stringWithFormat:@"\"%@\" is not a supported key.", key]}];
- }
- CFRelease(supportedProperties);
- return nil;
- }
- }
- CFRelease(supportedProperties);
-
- // Populate the video encoder settings from provided dictionary.
- for (NSString *key in videoEncoderKeys) {
- id value = self.videoEncoderSettings[key];
-
- status = VTSessionSetProperty(self.compressionSession, (__bridge CFStringRef)key, (__bridge CFTypeRef)value);
- if (status != noErr) {
- if (error != NULL) {
- *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{@"OSStatus": @(status), NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Setting key failed \"%@\"", key]}];
- }
- return nil;
- }
+
+ BOOL propertiesSetOnCompressionSession = [self sdl_setPropertiesOnCompressionSession:self.compressionSession withError:error];
+ if (!propertiesSetOnCompressionSession) {
+ return nil;
}
if ([protocol isEqualToEnum:SDLVideoStreamingProtocolRAW]) {
@@ -126,8 +88,6 @@ static NSDictionary<NSString *, id>* _defaultVideoEncoderSettings;
return nil;
}
- _timestampOffset = 0.0;
-
return self;
}
@@ -135,6 +95,9 @@ static NSDictionary<NSString *, id>* _defaultVideoEncoderSettings;
_currentFrameNumber = 0;
_timestampOffset = 0.0;
+ CFRelease(_pixelBufferOptions);
+ _pixelBufferOptions = nil;
+
[self sdl_invalidateCompressionSession];
}
@@ -157,7 +120,6 @@ static NSDictionary<NSString *, id>* _defaultVideoEncoderSettings;
// HAX: [#1620](https://github.com/smartdevicelink/sdl_ios/issues/1620) On some older iPhones VTCompressionSessionEncodeFrame fails with a kVTInvalidSessionErr when the device is locked. Attempt to fix this by recreating the compression session.
if (status == kVTInvalidSessionErr) {
- VTCompressionSessionCompleteFrames(_compressionSession, presentationTimestamp);
[self sdl_resetCompressionSession];
}
@@ -241,8 +203,8 @@ void sdl_videoEncoderOutputCallback(void * CM_NULLABLE outputCallbackRefCon, voi
}
#pragma mark Getters
-- (CFDictionaryRef _Nullable)sdl_pixelBufferOptions {
- if (_sdl_pixelBufferOptions == nil) {
+- (CFDictionaryRef _Nullable)pixelBufferOptions {
+ if (_pixelBufferOptions == nil) {
CFMutableDictionaryRef pixelBufferOptions = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
OSType pixelFormatType = kCVPixelFormatType_32BGRA;
@@ -255,10 +217,10 @@ void sdl_videoEncoderOutputCallback(void * CM_NULLABLE outputCallbackRefCon, voi
CFRelease(pixelFormatNumberRef);
- _sdl_pixelBufferOptions = pixelBufferOptions;
+ _pixelBufferOptions = pixelBufferOptions;
}
- return _sdl_pixelBufferOptions;
+ return _pixelBufferOptions;
}
#pragma mark Helpers
@@ -332,8 +294,7 @@ void sdl_videoEncoderOutputCallback(void * CM_NULLABLE outputCallbackRefCon, voi
// Move to the next NAL unit in the block buffer
bufferOffset += AVCCHeaderLength + NALUnitLength;
}
-
-
+
return nalUnits;
}
@@ -347,15 +308,102 @@ void sdl_videoEncoderOutputCallback(void * CM_NULLABLE outputCallbackRefCon, voi
self.compressionSession = NULL;
}
-/// Attempts to create a new VTCompressionSession using the dimensions passed when the video encoder was created and returns whether or not creating the new compression session was created successfully.
+/// Recreates a compression session and sets the video encoder properties on the session after an error occurs.
+/// @return True if the compression session was created successfully; false if not
- (BOOL)sdl_resetCompressionSession {
// Destroy the current compression session before attempting to create a new one. Otherwise the attempt to create a new compression session sometimes fails.
[self sdl_invalidateCompressionSession];
- OSStatus status = VTCompressionSessionCreate(NULL, (int32_t)self.dimensions.width, (int32_t)self.dimensions.height, kCMVideoCodecType_H264, NULL, self.sdl_pixelBufferOptions, NULL, &sdl_videoEncoderOutputCallback, (__bridge void *)self, &_compressionSession);
+ NSError *error = nil;
+ BOOL compressionSessionCreated = [self sdl_createCompressionSessionWithError:&error];
+ if (!compressionSessionCreated) {
+ SDLLogE(@"Error creating the compression session: %@", error.localizedDescription);
+ return NO;
+ }
+
+ BOOL propertiesSetOnCompressionSession = [self sdl_setPropertiesOnCompressionSession:self.compressionSession withError:&error];
+ if (!propertiesSetOnCompressionSession) {
+ SDLLogE(@"Error setting the properties on the compression session: %@", error.localizedDescription);
+ return NO;
+ }
+
+ return YES;
+}
+
+/// Creates a compression session using the dimensions passed when the video encoder was created.
+/// @param error Error set if the compression session was not created successfully
+/// @return True if the compression session was created successfully; false if not
+- (BOOL)sdl_createCompressionSessionWithError:(NSError **)error {
+ OSStatus status = VTCompressionSessionCreate(NULL, (int32_t)self.dimensions.width, (int32_t)self.dimensions.height, kCMVideoCodecType_H264, NULL, self.pixelBufferOptions, NULL, &sdl_videoEncoderOutputCallback, (__bridge void *)self, &_compressionSession);
+
+ if (status != noErr) {
+ if (error != NULL) {
+ *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionCreationFailure userInfo:@{@"OSStatus":@(status), NSLocalizedDescriptionKey:@"Compression session could not be created"}];
+ }
+
+ return NO;
+ }
+
return (status == noErr);
}
+/// Validates the properties set by the developer into the encoder settings dictionary. If any are not available for use, the session will be cancelled.
+/// @param compressionSession The compression session on which the video encoder properties will be set
+/// @param error Error set if the video encoder properties are not valid
+/// @return True if the video encoder properties are valid; false if not
+- (BOOL)sdl_validateVideoEncoderPropertiesOnCompressionSession:(VTCompressionSessionRef)compressionSession withError:(NSError **)error {
+ OSStatus status;
+
+ // Validate that the video encoder properties are valid.
+ CFDictionaryRef supportedProperties;
+ status = VTSessionCopySupportedPropertyDictionary(compressionSession, &supportedProperties);
+ if (status != noErr) {
+ if (error != NULL) {
+ *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{@"OSStatus":@(status), NSLocalizedDescriptionKey:[NSString stringWithFormat:@"\"%@\" are not supported properties.", supportedProperties]}];
+ }
+ return NO;
+ }
+
+ NSArray<NSString *> *videoEncoderKeys = self.videoEncoderSettings.allKeys;
+ for (NSString *key in videoEncoderKeys) {
+ if (CFDictionaryContainsKey(supportedProperties, (__bridge CFStringRef)key) == false) {
+ if (error != NULL) {
+ *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{NSLocalizedDescriptionKey:[NSString stringWithFormat:@"\"%@\" is not a supported key.", key]}];
+ }
+ CFRelease(supportedProperties);
+ return NO;
+ }
+ }
+ CFRelease(supportedProperties);
+
+ return YES;
+}
+
+/// Sets the video encoding properties on the compression session.
+/// @param compressionSession The compression session on which to set the video encoding properties
+/// @param error Error set if the properties were not successfully set on the video toolbox session
+/// @return True if the video encoding properties were set successfully; false if not
+- (BOOL)sdl_setPropertiesOnCompressionSession:(VTCompressionSessionRef)compressionSession withError:(NSError **)error {
+ OSStatus status;
+
+ NSArray* videoEncoderKeys = self.videoEncoderSettings.allKeys;
+ for (NSString *key in videoEncoderKeys) {
+ id value = self.videoEncoderSettings[key];
+ status = VTSessionSetProperty(compressionSession, (__bridge CFStringRef)key, (__bridge CFTypeRef)value);
+ if (status != noErr) {
+ if (error != NULL) {
+ *error = [NSError errorWithDomain:SDLErrorDomainVideoEncoder code:SDLVideoEncoderErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{@"OSStatus": @(status), NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Setting key failed \"%@\"", key]}];
+ }
+ return NO;
+ }
+ }
+
+ self.currentFrameNumber = 0;
+ self.timestampOffset = 0.0;
+
+ return YES;
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLHMICapabilities.h b/SmartDeviceLink/SDLHMICapabilities.h
index 84a2eecf7..3d2187631 100644
--- a/SmartDeviceLink/SDLHMICapabilities.h
+++ b/SmartDeviceLink/SDLHMICapabilities.h
@@ -1,6 +1,34 @@
-//
-// SDLHMICapabilities.h
-// SmartDeviceLink-iOS
+/*
+* 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"
@@ -14,6 +42,19 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLHMICapabilities : SDLRPCStruct
/**
+ * @param navigation - navigation
+ * @param phoneCall - phoneCall
+ * @param videoStreaming - videoStreaming
+ * @param remoteControl - remoteControl
+ * @param appServices - appServices
+ * @param displays - displays
+ * @param seatLocation - seatLocation
+ * @param driverDistraction - driverDistraction
+ * @return A SDLHMICapabilities object
+ */
+- (instancetype)initWithNavigation:(nullable NSNumber<SDLBool> *)navigation phoneCall:(nullable NSNumber<SDLBool> *)phoneCall videoStreaming:(nullable NSNumber<SDLBool> *)videoStreaming remoteControl:(nullable NSNumber<SDLBool> *)remoteControl appServices:(nullable NSNumber<SDLBool> *)appServices displays:(nullable NSNumber<SDLBool> *)displays seatLocation:(nullable NSNumber<SDLBool> *)seatLocation driverDistraction:(nullable NSNumber<SDLBool> *)driverDistraction;
+
+/**
Availability of built in Nav. True: Available, False: Not Available
Boolean value. Optional.
@@ -78,6 +119,13 @@ NS_ASSUME_NONNULL_BEGIN
**/
@property (nullable, copy, nonatomic) NSNumber<SDLBool> *seatLocation;
+/**
+ * Availability of driver distraction capability. True: Available, False: Not Available
+ *
+ * @since SDL 7.0.0
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *driverDistraction;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLHMICapabilities.m b/SmartDeviceLink/SDLHMICapabilities.m
index fd0104e5e..ece1d811c 100644
--- a/SmartDeviceLink/SDLHMICapabilities.m
+++ b/SmartDeviceLink/SDLHMICapabilities.m
@@ -1,6 +1,34 @@
-//
-// SDLHMICapabilities.m
-// SmartDeviceLink-iOS
+/*
+* 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 "SDLHMICapabilities.h"
@@ -11,6 +39,22 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLHMICapabilities
+- (instancetype)initWithNavigation:(nullable NSNumber<SDLBool> *)navigation phoneCall:(nullable NSNumber<SDLBool> *)phoneCall videoStreaming:(nullable NSNumber<SDLBool> *)videoStreaming remoteControl:(nullable NSNumber<SDLBool> *)remoteControl appServices:(nullable NSNumber<SDLBool> *)appServices displays:(nullable NSNumber<SDLBool> *)displays seatLocation:(nullable NSNumber<SDLBool> *)seatLocation driverDistraction:(nullable NSNumber<SDLBool> *)driverDistraction {
+ self = [super init];
+ if (!self) { return nil; }
+
+ self.navigation = navigation;
+ self.phoneCall = phoneCall;
+ self.videoStreaming = videoStreaming;
+ self.remoteControl = remoteControl;
+ self.appServices = appServices;
+ self.displays = displays;
+ self.seatLocation = seatLocation;
+ self.driverDistraction = driverDistraction;
+
+ return self;
+}
+
- (void)setNavigation:(nullable NSNumber<SDLBool> *)navigation {
[self.store sdl_setObject:navigation forName:SDLRPCParameterNameNavigation];
}
@@ -67,6 +111,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectForName:SDLRPCParameterNameSeatLocation ofClass:NSNumber.class error:nil];
}
+- (void)setDriverDistraction:(nullable NSNumber<SDLBool> *)driverDistraction {
+ [self.store sdl_setObject:driverDistraction forName:SDLRPCParameterNameDriverDistraction];
+}
+
+- (nullable NSNumber<SDLBool> *)driverDistraction {
+ return [self.store sdl_objectForName:SDLRPCParameterNameDriverDistraction ofClass:NSNumber.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m
index a1e4c07ab..50d7a98e4 100644
--- a/SmartDeviceLink/SDLIAPControlSession.m
+++ b/SmartDeviceLink/SDLIAPControlSession.m
@@ -49,19 +49,18 @@ int const ProtocolIndexTimeoutSeconds = 10;
- (void)startSession {
if (self.accessory == nil) {
SDLLogW(@"There is no control session in progress, attempting to create a new control session.");
- if (self.delegate == nil) { return; }
[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 destroySession];
- if (strongSelf.delegate == nil) { return; }
- [strongSelf.delegate controlSessionShouldRetry];
+ [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];
@@ -91,27 +90,17 @@ int const ProtocolIndexTimeoutSeconds = 10;
#pragma mark Stop
-- (void)destroySession {
+/// 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");
- [self sdl_destroySession];
-}
-
-/**
- * Makes sure the session is closed and destroyed on the main thread.
- */
-- (void)sdl_destroySession {
- if ([NSThread isMainThread]) {
+ dispatch_async(dispatch_get_main_queue(), ^{
[self sdl_stopAndDestroySession];
- } else {
- dispatch_sync(dispatch_get_main_queue(), ^{
- [self sdl_stopAndDestroySession];
- });
- }
+ return disconnectCompletionHandler();
+ });
}
-/**
- * Closes the session streams and then destroys the session.
- */
+/// 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));
@@ -184,10 +173,12 @@ int const ProtocolIndexTimeoutSeconds = 10;
// End events come in pairs, only perform this once per set.
[self.protocolIndexTimer cancel];
- [self destroySession];
- if (self.delegate == nil) { return; }
- [self.delegate controlSessionShouldRetry];
+ __weak typeof(self) weakSelf = self;
+ [self destroySessionWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ [strongSelf.delegate controlSessionShouldRetry];
+ }];
}
/**
@@ -209,14 +200,14 @@ int const ProtocolIndexTimeoutSeconds = 10;
SDLLogD(@"Control Stream will switch to protocol %@", indexedProtocolString);
// Destroy the control session as it is no longer needed, and then create the data session.
- [self destroySession];
-
- if (self.accessory.isConnected) {
- if (self.delegate != nil) {
- [self.delegate controlSession:self didReceiveProtocolString:indexedProtocolString];
+ __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];
}
- [self.protocolIndexTimer cancel];
- }
+ }];
}
/**
@@ -226,10 +217,11 @@ int const ProtocolIndexTimeoutSeconds = 10;
SDLLogE(@"Control stream error");
[self.protocolIndexTimer cancel];
- [self destroySession];
-
- if (self.delegate == nil) { return; }
- [self.delegate controlSessionShouldRetry];
+ __weak typeof(self) weakSelf = self;
+ [self destroySessionWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ [strongSelf.delegate controlSessionShouldRetry];
+ }];
}
#pragma mark - Timer
@@ -246,10 +238,10 @@ int const ProtocolIndexTimeoutSeconds = 10;
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 sdl_destroySession];
-
- if (strongSelf.delegate == nil) { return; }
- [strongSelf.delegate controlSessionShouldRetry];
+ [strongSelf destroySessionWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ [strongSelf.delegate controlSessionShouldRetry];
+ }];
};
protocolIndexTimer.elapsedBlock = elapsedBlock;
@@ -264,14 +256,6 @@ int const ProtocolIndexTimeoutSeconds = 10;
[self.protocolIndexTimer start];
}
-#pragma mark - Lifecycle Destruction
-
-- (void)dealloc {
- SDLLogV(@"SDLIAPControlSession dealloc");
- [self destroySession];
- _protocolIndexTimer = nil;
-}
-
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m
index 5bf61e304..785573fde 100644
--- a/SmartDeviceLink/SDLIAPDataSession.m
+++ b/SmartDeviceLink/SDLIAPDataSession.m
@@ -16,7 +16,7 @@
#import "SDLMutableDataQueue.h"
NSString *const IOStreamThreadName = @"com.smartdevicelink.iostream";
-NSTimeInterval const IOStreamThreadWaitSecs = 1.0;
+NSTimeInterval const IOStreamThreadCanceledSemaphoreWaitSecs = 1.0;
NS_ASSUME_NONNULL_BEGIN
@@ -25,27 +25,29 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, nonatomic, strong) NSThread *ioStreamThread;
@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue;
@property (weak, nonatomic) id<SDLIAPDataSessionDelegate> delegate;
-@property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore;
+/// 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;
@end
@implementation SDLIAPDataSession
-#pragma mark - Session lifecycle
+#pragma mark - Lifecycle
- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id<SDLIAPDataSessionDelegate>)delegate forProtocol:(NSString *)protocol; {
- SDLLogV(@"SDLIAPDataSession init");
+ SDLLogV(@"iAP data session init for accessory: %@", accessory);
self = [super initWithAccessory:accessory forProtocol:protocol];
if (!self) { return nil; }
_delegate = delegate;
_sendDataQueue = [[SDLMutableDataQueue alloc] init];
- _canceledSemaphore = dispatch_semaphore_create(0);
+ _ioStreamThreadCancelledSemaphore = dispatch_semaphore_create(0);
return self;
}
+
#pragma mark Start
- (void)startSession {
@@ -58,9 +60,12 @@ NS_ASSUME_NONNULL_BEGIN
if (![super createSession]) {
SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.accessory);
- [self destroySession];
- if (self.delegate == nil) { return; }
- [self.delegate dataSessionShouldRetry];
+ __weak typeof(self) weakSelf = self;
+ [self destroySessionWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (strongSelf.delegate == nil) { return; }
+ [strongSelf.delegate dataSessionShouldRetry];
+ }];
}
if (self.eaSession != nil) {
@@ -73,66 +78,56 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Stop
-- (void)destroySession {
+/// 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");
- [self sdl_destroySession];
- [self.sendDataQueue removeAllObjects];
-}
-
-/**
- * Makes sure the session is closed and destroyed on the main thread.
- */
-- (void)sdl_destroySession {
- if ([NSThread isMainThread]) {
- [self sdl_stopAndDestroySession];
- } else {
- dispatch_sync(dispatch_get_main_queue(), ^{
- [self sdl_stopAndDestroySession];
- });
- }
-}
-
-/**
- * Waits for the session streams to close on the I/O Thread and then destroys the session.
- */
-- (void)sdl_stopAndDestroySession {
- NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd));
if (self.ioStreamThread == nil) {
- SDLLogV(@"Stopping data session but no thread established.");
+ SDLLogV(@"No data session established");
[super cleanupClosedSession];
- return;
+ return disconnectCompletionHandler();
}
- [self.ioStreamThread cancel];
+ // 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];
- // Waiting for the I/O streams of the data session to close
- [self sdl_isIOThreadCanceled:self.canceledSemaphore completionHandler:^(BOOL success) {
- if (success == NO) {
- SDLLogE(@"Destroying thread (IOStreamThread) for data session when I/O streams have not yet closed.");
+ // 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.");
}
- self.ioStreamThread = nil;
- [super cleanupClosedSession];
- }];
+
+ [strongSelf.sendDataQueue removeAllObjects];
+
+ disconnectCompletionHandler();
+ });
}
-/**
- * Wait for the data session to detroy its input and output streams. The data EASession can not be destroyed until both streams have closed.
- *
- * @param canceledSemaphore When the canceled semaphore is released, the data session's input and output streams have been destroyed.
- * @param completionHandler Returns whether or not the data session's I/O streams were closed successfully.
- */
-- (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completionHandler:(void (^)(BOOL success))completionHandler {
- long lWait = dispatch_semaphore_wait(canceledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(IOStreamThreadWaitSecs * NSEC_PER_SEC)));
+/// 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(@"Stream thread canceled successfully");
- return completionHandler(YES);
- } else {
- SDLLogE(@"Failed to cancel stream thread");
- return completionHandler(NO);
+ 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 {
@@ -256,10 +251,12 @@ NS_ASSUME_NONNULL_BEGIN
// 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(), ^{
- [self destroySession];
-
- if (self.delegate == nil) { return; }
- [self.delegate dataSessionShouldRetry];
+ __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
@@ -308,11 +305,14 @@ NS_ASSUME_NONNULL_BEGIN
// To prevent deadlocks the handler must return to the runloop and not block the thread
dispatch_async(dispatch_get_main_queue(), ^{
- [self destroySession];
- if (![self.protocolString isEqualToString:LegacyProtocolString]) {
- if (self.delegate == nil) { return; }
- [self.delegate dataSessionShouldRetry];
- }
+ __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];
+ }
+ }];
});
}
@@ -331,17 +331,19 @@ NS_ASSUME_NONNULL_BEGIN
SDLLogD(@"Starting the accessory event loop on thread: %@", NSThread.currentThread.name);
- while (!self.ioStreamThread.cancelled) {
+ 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]];
}
SDLLogD(@"Closing the accessory event loop on thread: %@", NSThread.currentThread.name);
- // Close I/O streams of the data session. When the streams are closed. Notify the thread that it can close
+ // Close I/O streams
[self sdl_closeSession];
+ [super cleanupClosedSession];
- dispatch_semaphore_signal(self.canceledSemaphore);
+ // 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);
}
}
@@ -367,12 +369,6 @@ NS_ASSUME_NONNULL_BEGIN
[super stopStream:stream];
}
-#pragma mark - Lifecycle Destruction
-
-- (void)dealloc {
- SDLLogV(@"SDLIAPDataSession dealloc");
- [self destroySession];
-}
@end
diff --git a/SmartDeviceLink/SDLIAPSession.h b/SmartDeviceLink/SDLIAPSession.h
index 75b1f6d55..6bc62ed5f 100644
--- a/SmartDeviceLink/SDLIAPSession.h
+++ b/SmartDeviceLink/SDLIAPSession.h
@@ -65,10 +65,9 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (void)startSession;
-/**
- * Stops the current session.
- */
-- (void)destroySession;
+/// Stops the current session.
+/// @param disconnectCompletionHandler Handler called when the session has been closed
+- (void)destroySessionWithCompletionHandler:(void (^)(void))disconnectCompletionHandler;
/**
* Creates a session with the accessory.
diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m
index c69efce6d..eaf79725f 100644
--- a/SmartDeviceLink/SDLIAPSession.m
+++ b/SmartDeviceLink/SDLIAPSession.m
@@ -39,7 +39,7 @@ NS_ASSUME_NONNULL_BEGIN
- (void)startSession {}
-- (void)destroySession {}
+- (void)destroySessionWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {}
#pragma mark - Private Stream Lifecycle Helpers
diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m
index a1be67a65..11da3a1d6 100644
--- a/SmartDeviceLink/SDLIAPTransport.m
+++ b/SmartDeviceLink/SDLIAPTransport.m
@@ -170,8 +170,8 @@ int const CreateSessionRetries = 3;
- (void)sdl_closeSessions {
self.retryCounter = 0;
self.sessionSetupInProgress = NO;
- [self.controlSession destroySession];
- [self.dataSession destroySession];
+
+ [self sdl_closeSessionsWithCompletionHandler:nil];
}
/**
@@ -181,8 +181,11 @@ int const CreateSessionRetries = 3;
self.retryCounter = 0;
self.sessionSetupInProgress = NO;
self.transportDestroyed = YES;
- [self disconnect];
- [self.delegate onTransportDisconnected];
+ __weak typeof(self) weakSelf = self;
+ [self disconnectWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ [strongSelf.delegate onTransportDisconnected];
+ }];
}
#pragma mark - Stream Lifecycle
@@ -212,7 +215,8 @@ int const CreateSessionRetries = 3;
/**
* Cleans up after a disconnected accessory by closing any open I/O streams.
*/
-- (void)disconnect {
+- (void)disconnectWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {
+ SDLLogD(@"Disconnecting IAP transport");
// Stop event listening here so that even if the transport is disconnected by `SDLProxy` when there is a start session timeout, the class unregisters for accessory notifications
[self sdl_stopEventListening];
@@ -220,8 +224,7 @@ int const CreateSessionRetries = 3;
self.sessionSetupInProgress = NO;
self.transportDestroyed = YES;
- [self.controlSession destroySession];
- [self.dataSession destroySession];
+ [self sdl_closeSessionsWithCompletionHandler:disconnectCompletionHandler];
}
@@ -285,11 +288,46 @@ int const CreateSessionRetries = 3;
- (void)sdl_retryEstablishSession {
// Current strategy disallows automatic retries.
self.sessionSetupInProgress = NO;
- [self.controlSession destroySession];
- [self.dataSession destroySession];
- // Search connected accessories
- [self sdl_connect:nil];
+ __weak typeof(self) weakSelf = self;
+ [self sdl_closeSessionsWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ // Search connected accessories
+ [strongSelf sdl_connect:nil];
+ }];
+}
+
+/// 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 {
+ 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);
+ }];
+ }
+
+ if (self.dataSession != nil) {
+ dispatch_group_enter(endSessionsTask);
+ [self.dataSession destroySessionWithCompletionHandler:^{
+ SDLLogV(@"Data session destroyed");
+ 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();
+ }
+ });
}
@@ -519,19 +557,6 @@ int const CreateSessionRetries = 3;
return NO;
}
-
-#pragma mark - Lifecycle Destruction
-
-- (void)dealloc {
- SDLLogV(@"SDLIAPTransport dealloc");
- [self disconnect];
- self.controlSession = nil;
- self.dataSession = nil;
- self.delegate = nil;
- self.sessionSetupInProgress = NO;
- self.accessoryConnectDuringActiveSession = NO;
-}
-
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLImageField+ScreenManagerExtensions.h b/SmartDeviceLink/SDLImageField+ScreenManagerExtensions.h
index 6c21266d7..5db85093c 100644
--- a/SmartDeviceLink/SDLImageField+ScreenManagerExtensions.h
+++ b/SmartDeviceLink/SDLImageField+ScreenManagerExtensions.h
@@ -6,7 +6,7 @@
// Copyright © 2020 smartdevicelink. All rights reserved.
//
-#import <SmartDeviceLink/SmartDeviceLink.h>
+#import "SDLImageField.h"
NS_ASSUME_NONNULL_BEGIN
diff --git a/SmartDeviceLink/SDLLifecycleManager.h b/SmartDeviceLink/SDLLifecycleManager.h
index e3fcd2cb2..1911c4877 100644
--- a/SmartDeviceLink/SDLLifecycleManager.h
+++ b/SmartDeviceLink/SDLLifecycleManager.h
@@ -77,12 +77,6 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
@property (strong, nonatomic, readonly) SDLResponseDispatcher *responseDispatcher;
@property (strong, nonatomic, readonly) SDLStateMachine *lifecycleStateMachine;
-// Deprecated internal proxy object
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-@property (strong, nonatomic, nullable) SDLProxy *proxy;
-#pragma clang diagnostic pop
-
@property (copy, nonatomic, readonly) SDLLifecycleState *lifecycleState;
@property (copy, nonatomic, nullable) SDLHMILevel hmiLevel;
@property (copy, nonatomic, nullable) SDLAudioStreamingState audioStreamingState;
diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m
index f4d9daa22..97842dcd1 100644
--- a/SmartDeviceLink/SDLLifecycleManager.m
+++ b/SmartDeviceLink/SDLLifecycleManager.m
@@ -11,6 +11,8 @@
#import "SDLLifecycleManager.h"
#import "NSMapTable+Subscripting.h"
+#import "SDLLifecycleRPCAdapter.h"
+#import "SDLAsynchronousRPCOperation.h"
#import "SDLAsynchronousRPCRequestOperation.h"
#import "SDLBackgroundTaskManager.h"
#import "SDLChangeRegistration.h"
@@ -24,8 +26,12 @@
#import "SDLFileManager.h"
#import "SDLFileManagerConfiguration.h"
#import "SDLGlobals.h"
+#import "SDLIAPTransport.h"
#import "SDLLifecycleConfiguration.h"
#import "SDLLifecycleConfigurationUpdate.h"
+#import "SDLLifecycleMobileHMIStateHandler.h"
+#import "SDLLifecycleSyncPDataHandler.h"
+#import "SDLLifecycleSystemRequestHandler.h"
#import "SDLLockScreenConfiguration.h"
#import "SDLLockScreenManager.h"
#import "SDLLockScreenPresenter.h"
@@ -40,12 +46,11 @@
#import "SDLPermissionManager.h"
#import "SDLPredefinedWindows.h"
#import "SDLProtocol.h"
-#import "SDLProxy.h"
+#import "SDLLifecycleProtocolHandler.h"
#import "SDLRPCNotificationNotification.h"
#import "SDLRegisterAppInterface.h"
#import "SDLRegisterAppInterfaceResponse.h"
#import "SDLResponseDispatcher.h"
-#import "SDLAsynchronousRPCOperation.h"
#import "SDLResult.h"
#import "SDLScreenManager.h"
#import "SDLSecondaryTransportManager.h"
@@ -55,6 +60,7 @@
#import "SDLStreamingMediaConfiguration.h"
#import "SDLStreamingMediaManager.h"
#import "SDLSystemCapabilityManager.h"
+#import "SDLTCPTransport.h"
#import "SDLUnregisterAppInterface.h"
#import "SDLVersion.h"
#import "SDLWindowCapability.h"
@@ -79,7 +85,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
@interface SDLStreamingMediaManager ()
@property (strong, nonatomic, nullable) SDLSecondaryTransportManager *secondaryTransportManager;
-- (void)startSecondaryTransportWithProtocol:(SDLProtocol *)protocol;
@end
@@ -94,15 +99,25 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
@property (strong, nonatomic, readwrite) SDLResponseDispatcher *responseDispatcher;
@property (strong, nonatomic, readwrite) SDLStateMachine *lifecycleStateMachine;
-// Private properties
+// Private Managers
@property (strong, nonatomic, nullable) SDLSecondaryTransportManager *secondaryTransportManager;
+@property (strong, nonatomic) SDLEncryptionLifecycleManager *encryptionLifecycleManager;
+
+// Private properties
@property (copy, nonatomic) SDLManagerReadyBlock readyHandler;
@property (copy, nonatomic) dispatch_queue_t lifecycleQueue;
@property (assign, nonatomic) int32_t lastCorrelationId;
@property (copy, nonatomic) SDLBackgroundTaskManager *backgroundTaskManager;
-@property (copy, nonatomic) SDLEncryptionLifecycleManager *encryptionLifecycleManager;
@property (strong, nonatomic) SDLLanguage currentVRLanguage;
+// RPC Handlers
+@property (strong, nonatomic) SDLLifecycleSyncPDataHandler *syncPDataHandler;
+@property (strong, nonatomic) SDLLifecycleSystemRequestHandler *systemRequestHandler;
+@property (strong, nonatomic) SDLLifecycleMobileHMIStateHandler *mobileHMIStateHandler;
+
+// Protocol and Transport
+@property (strong, nonatomic, nullable) SDLLifecycleProtocolHandler *protocolHandler;
+
@end
@@ -111,7 +126,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
#pragma mark Lifecycle
- (instancetype)init {
- return [self initWithConfiguration:[SDLConfiguration configurationWithLifecycle:[SDLLifecycleConfiguration defaultConfigurationWithAppName:@"SDL APP" fullAppId:@"001"] lockScreen:[SDLLockScreenConfiguration disabledConfiguration] logging:[SDLLogConfiguration defaultConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration]] delegate:nil];
+ return [self initWithConfiguration:[[SDLConfiguration alloc] initWithLifecycle:[SDLLifecycleConfiguration defaultConfigurationWithAppName:@"SDL APP" fullAppId:@"001"] lockScreen:[SDLLockScreenConfiguration enabledConfiguration] logging:[SDLLogConfiguration defaultConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration] encryption:nil] delegate:nil];
}
- (instancetype)initWithConfiguration:(SDLConfiguration *)configuration delegate:(nullable id<SDLManagerDelegate>)delegate {
@@ -120,8 +135,6 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return nil;
}
- SDLLogV(@"Initializing Lifecycle Manager");
-
// Dependencies
_configuration = [configuration copy];
_delegate = delegate;
@@ -129,6 +142,12 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
// Logging
[SDLLogManager setConfiguration:_configuration.loggingConfig];
+ SDLLogD(@"Initializing Lifecycle Manager");
+ SDLLogD(@"SDL iOS Library Version: %@", [NSBundle bundleForClass:self.class].infoDictionary[@"CFBundleShortVersionString"]);
+ SDLLogD(@"iOS Version: %@", [NSBundle bundleForClass:self.class].infoDictionary[@"DTPlatformVersion"]);
+ SDLLogD(@"SDK Version: %@", [NSBundle bundleForClass:self.class].infoDictionary[@"DTSDKName"]);
+ SDLLogD(@"Minimum OS Version: %@", [NSBundle bundleForClass:self.class].infoDictionary[@"MinimumOSVersion"]);
+
// Private properties
_lifecycleStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLLifecycleStateStopped states:[self.class sdl_stateTransitionDictionary]];
_lastCorrelationId = 0;
@@ -162,24 +181,29 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
}
if (configuration.encryptionConfig.securityManagers != nil) {
- _encryptionLifecycleManager = [[SDLEncryptionLifecycleManager alloc] initWithConnectionManager:self configuration:_configuration.encryptionConfig];
+ _encryptionLifecycleManager = [[SDLEncryptionLifecycleManager alloc] initWithConnectionManager:self configuration:_configuration];
}
+ // RPC Handlers
+ _syncPDataHandler = [[SDLLifecycleSyncPDataHandler alloc] initWithConnectionManager:self];
+ _systemRequestHandler = [[SDLLifecycleSystemRequestHandler alloc] initWithConnectionManager:self];
+ _mobileHMIStateHandler = [[SDLLifecycleMobileHMIStateHandler alloc] initWithConnectionManager:self];
+
// Notifications
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transportDidConnect) name:SDLTransportDidConnect object:_notificationDispatcher];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transportDidDisconnect) name:SDLTransportDidDisconnect object:_notificationDispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_rpcServiceDidConnect) name:SDLRPCServiceDidConnect object:_notificationDispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_transportDidDisconnect) name:SDLTransportDidDisconnect object:_notificationDispatcher];
[[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];
+ _backgroundTaskManager = [[SDLBackgroundTaskManager alloc] initWithBackgroundTaskName:BackgroundTaskTransportName];
return self;
}
- (void)startWithReadyHandler:(SDLManagerReadyBlock)readyHandler {
- dispatch_sync(_lifecycleQueue, ^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
[self sdl_startWithReadyHandler:readyHandler];
- });
+ }];
}
- (void)sdl_startWithReadyHandler:(SDLManagerReadyBlock)readyHandler {
@@ -195,14 +219,14 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
}
- (void)stop {
- dispatch_sync(_lifecycleQueue, ^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
SDLLogD(@"Lifecycle manager stopped");
if ([self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) {
[self sdl_transitionToState:SDLLifecycleStateUnregistering];
} else {
[self sdl_transitionToState:SDLLifecycleStateStopped];
}
- });
+ }];
}
- (void)startRPCEncryption {
@@ -238,28 +262,29 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
// Start a background task so a session can be established even when the app is backgrounded.
[self.backgroundTaskManager startBackgroundTask];
- // Start up the internal proxy object
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ // Start up the internal protocol, transport, and other internal managers
self.secondaryTransportManager = nil;
- if (self.configuration.lifecycleConfig.tcpDebugMode) {
- self.proxy = [SDLProxy tcpProxyWithListener:self.notificationDispatcher
- tcpIPAddress:self.configuration.lifecycleConfig.tcpDebugIPAddress
- tcpPort:@(self.configuration.lifecycleConfig.tcpDebugPort).stringValue
- secondaryTransportManager:self.secondaryTransportManager
- encryptionLifecycleManager:self.encryptionLifecycleManager];
- } else if (self.configuration.lifecycleConfig.allowedSecondaryTransports == SDLSecondaryTransportsNone) {
- self.proxy = [SDLProxy iapProxyWithListener:self.notificationDispatcher secondaryTransportManager:nil encryptionLifecycleManager:self.encryptionLifecycleManager];
+ SDLLifecycleConfiguration *lifecycleConfig = self.configuration.lifecycleConfig;
+ id<SDLTransportType> newTransport = nil;
+
+ if (lifecycleConfig.tcpDebugMode) {
+ newTransport = [[SDLTCPTransport alloc] initWithHostName:lifecycleConfig.tcpDebugIPAddress portNumber:@(lifecycleConfig.tcpDebugPort).stringValue];
} else {
- if ([self.class sdl_isStreamingConfiguration:self.configuration]) {
+ newTransport = [[SDLIAPTransport alloc] init];
+
+ if (self.configuration.lifecycleConfig.allowedSecondaryTransports != SDLSecondaryTransportsNone
+ && [self.class sdl_isStreamingConfiguration:self.configuration]) {
// Reuse the queue to run the secondary transport manager's state machine
self.secondaryTransportManager = [[SDLSecondaryTransportManager alloc] initWithStreamingProtocolDelegate:(id<SDLStreamingProtocolDelegate>)self.streamManager serialQueue:self.lifecycleQueue];
self.streamManager.secondaryTransportManager = self.secondaryTransportManager;
}
-
- self.proxy = [SDLProxy iapProxyWithListener:self.notificationDispatcher secondaryTransportManager:self.secondaryTransportManager encryptionLifecycleManager:self.encryptionLifecycleManager];
}
-#pragma clang diagnostic pop
+
+ SDLProtocol *newProtocol = [[SDLProtocol alloc] initWithTransport:newTransport encryptionManager:self.encryptionLifecycleManager];
+ self.protocolHandler = [[SDLLifecycleProtocolHandler alloc] initWithProtocol:newProtocol notificationDispatcher:self.notificationDispatcher configuration:self.configuration];
+ [self.protocolHandler start];
+
+ [self.secondaryTransportManager startWithPrimaryProtocol:self.protocolHandler.protocol]; // Will not run if secondaryTransportManager is nil
}
- (void)didEnterStateStopped {
@@ -270,24 +295,55 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
[self sdl_stopManager:YES];
}
+/// Shuts down the all the managers used to manage the lifecycle of the SDL app after the connection between the phone and SDL enabled accessory has closed. If a restart is desired, attempt to start looking for another SDL enabled accessory. If no restart is desired, another connection will not be made with a SDL enabled accessory during the current app session
+/// @param shouldRestart Whether or not to start looking for another SDL enabled accessory.
- (void)sdl_stopManager:(BOOL)shouldRestart {
SDLLogV(@"Stopping manager, %@", (shouldRestart ? @"will restart" : @"will not restart"));
- [self.proxy disconnectSession];
- self.proxy = nil;
+ dispatch_group_t stopManagersTask = dispatch_group_create();
+ dispatch_group_enter(stopManagersTask);
+
+ if (self.protocolHandler != nil) {
+ dispatch_group_enter(stopManagersTask);
+ [self.protocolHandler stopWithCompletionHandler:^{
+ dispatch_group_leave(stopManagersTask);
+ }];
+ }
+ if (self.secondaryTransportManager != nil) {
+ dispatch_group_enter(stopManagersTask);
+ [self.secondaryTransportManager stopWithCompletionHandler:^{
+ dispatch_group_leave(stopManagersTask);
+ }];
+ }
+
+ dispatch_group_leave(stopManagersTask);
+ // This will always run after all `leave`s
+ __weak typeof(self) weakSelf = self;
+ dispatch_group_notify(stopManagersTask, [SDLGlobals sharedGlobals].sdlProcessingQueue, ^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ [strongSelf sdl_stopManagersAndRestart:shouldRestart];
+ });
+}
+
+/// Helper method for shutting down the remaining managers that do not need extra time to shutdown. Once all the managers have been shutdown, attempt to start looking for another SDL enabled accessory.
+/// @param shouldRestart Whether or not to start looking for another SDL enabled accessory.
+- (void)sdl_stopManagersAndRestart:(BOOL)shouldRestart {
[self.fileManager stop];
[self.permissionManager stop];
[self.lockScreenManager stop];
[self.screenManager stop];
[self.encryptionLifecycleManager stop];
[self.streamManager stop];
- [self.secondaryTransportManager stop];
[self.systemCapabilityManager stop];
[self.responseDispatcher clear];
[self.rpcOperationQueue cancelAllOperations];
+ [self.syncPDataHandler stop];
+ [self.systemRequestHandler stop];
+ [self.mobileHMIStateHandler stop];
+
self.registerResponse = nil;
self.lastCorrelationId = 0;
self.hmiLevel = nil;
@@ -308,33 +364,16 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
[strongSelf sdl_transitionToState:SDLLifecycleStateStarted];
} else {
// End the background task because a session will not be established
- [self.backgroundTaskManager endBackgroundTask];
+ [strongSelf.backgroundTaskManager endBackgroundTask];
}
});
}
- (void)didEnterStateConnected {
- // Ignore the connection while we are reconnecting. The proxy needs to be disposed and restarted in order to ensure correct state. https://github.com/smartdevicelink/sdl_ios/issues/1172
- if ([self.lifecycleState isEqualToString:SDLLifecycleStateReconnecting]) { return; }
-
- // If we have security managers, add them to the proxy
- NSString *appId = self.configuration.lifecycleConfig.fullAppId ? self.configuration.lifecycleConfig.fullAppId : self.configuration.lifecycleConfig.appId;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- if (self.configuration.streamingMediaConfig.securityManagers != nil) {
- SDLLogD(@"Adding security managers from streamingMedia configuration");
- [self.proxy addSecurityManagers:self.configuration.streamingMediaConfig.securityManagers forAppId:appId];
- }
-#pragma clang diagnostic pop
- if (self.configuration.encryptionConfig.securityManagers != nil) {
- SDLLogD(@"Adding security managers from encryption configuration");
- [self.proxy addSecurityManagers:self.configuration.encryptionConfig.securityManagers forAppId:appId];
- }
-
// If the negotiated protocol version is greater than the minimum allowable version, we need to end service and disconnect
if ([self.configuration.lifecycleConfig.minimumProtocolVersion isGreaterThanVersion:[SDLGlobals sharedGlobals].protocolVersion]) {
SDLLogW(@"Disconnecting from head unit, protocol version %@ is less than configured minimum version %@", [SDLGlobals sharedGlobals].protocolVersion.stringVersion, self.configuration.lifecycleConfig.minimumProtocolVersion.stringVersion);
- [self.proxy.protocol endServiceWithType:SDLServiceTypeRPC];
+ [self.protocolHandler.protocol endServiceWithType:SDLServiceTypeRPC];
[self sdl_transitionToState:SDLLifecycleStateStopped];
return;
}
@@ -344,8 +383,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
// Send the request and depending on the response, post the notification
__weak typeof(self) weakSelf = self;
- [self sendConnectionManagerRequest:regRequest
- withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
+ [self sendConnectionManagerRequest:regRequest withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
// If the success BOOL is NO or we received an error at this point, we failed. Call the ready handler and transition to the DISCONNECTED state.
if (error != nil || ![response.success boolValue]) {
SDLLogE(@"Failed to register the app. Error: %@, Response: %@", error, response);
@@ -476,12 +514,12 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
}];
if (self.encryptionLifecycleManager != nil) {
- [self.encryptionLifecycleManager startWithProtocol:self.proxy.protocol];
+ [self.encryptionLifecycleManager startWithProtocol:self.protocolHandler.protocol];
}
// Starts the streaming media manager if only using the primary transport (i.e. secondary transports has been disabled in the lifecyle configuration). If using a secondary transport, setup is handled by the stream manager.
if (self.secondaryTransportManager == nil && self.streamManager != nil) {
- [self.streamManager startSecondaryTransportWithProtocol:self.proxy.protocol];
+ [self.streamManager startWithProtocol:self.protocolHandler.protocol];
}
dispatch_group_enter(managerGroup);
@@ -569,7 +607,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
SDLUnregisterAppInterface *unregisterRequest = [[SDLUnregisterAppInterface alloc] init];
__weak typeof(self) weakSelf = self;
- [self sdl_sendRequest:unregisterRequest
+ [self sdl_sendConnectionRequest:unregisterRequest
withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
if (error != nil || ![response.success boolValue]) {
SDLLogE(@"SDL Error unregistering, we are going to hard disconnect: %@, response: %@", error, response);
@@ -664,6 +702,8 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
[self.rpcOperationQueue addOperation:op];
}
+/// Send a request immediately without going through the RPC operation queue
+/// @param rpc The RPC to send
- (void)sendConnectionRPC:(__kindof SDLRPCMessage *)rpc {
NSAssert(([rpc isKindOfClass:SDLRPCResponse.class] || [rpc isKindOfClass:SDLRPCNotification.class]), @"Only RPCs of type `Response` or `Notfication` can be sent using this method. To send RPCs of type `Request` use sendConnectionRequest:withResponseHandler:.");
@@ -672,11 +712,24 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return;
}
- [self sdl_runOnProcessingQueue:^{
- [self sdl_sendRequest:rpc withResponseHandler:nil];
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
+ [self sdl_sendConnectionRequest:rpc withResponseHandler:nil];
+ }];
+}
+
+/// Send a non-request RPC immediately without going through the RPC operation queue, and allow requests to be sent before the managers have completed setup.
+/// @param rpc The RPC to send
+- (void)sendConnectionManagerRPC:(__kindof SDLRPCMessage *)rpc {
+ NSAssert(([rpc isKindOfClass:SDLRPCResponse.class] || [rpc isKindOfClass:SDLRPCNotification.class]), @"Only RPCs of type `Response` or `Notfication` can be sent using this method. To send RPCs of type `Request` use sendConnectionRequest:withResponseHandler:.");
+
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
+ [self sdl_sendConnectionRequest:rpc withResponseHandler:nil];
}];
}
+/// Send a request immediately without going through the RPC operation queue
+/// @param request The request to send
+/// @param handler A callback handler for responses to the request
- (void)sendConnectionRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
if (![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) {
SDLLogW(@"Manager not ready, request not sent (%@)", request);
@@ -700,24 +753,29 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return;
}
- [self sdl_runOnProcessingQueue:^{
- [self sdl_sendRequest:request withResponseHandler:handler];
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
+ [self sdl_sendConnectionRequest:request withResponseHandler:handler];
}];
}
-// Managers need to avoid state checking. Part of <SDLConnectionManagerType>.
+/// Send a request immediately without going through the RPC operation queue, and allow requests to be sent before the managers have completed setup.
+/// @param request The request to send
+/// @param handler A callback handler for responses to the request
- (void)sendConnectionManagerRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler {
- [self sdl_runOnProcessingQueue:^{
- [self sdl_sendRequest:request withResponseHandler:handler];
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
+ [self sdl_sendConnectionRequest:request withResponseHandler:handler];
}];
}
-- (void)sdl_sendRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+/// Send a request by sending it directly through the protocol, without going through the RPC operation queue
+/// @param request The request to send
+/// @param handler A callback handler for responses to the request
+- (void)sdl_sendConnectionRequest:(__kindof SDLRPCMessage *)request withResponseHandler:(nullable SDLResponseHandler)handler {
// We will allow things to be sent in a "SDLLifecycleStateConnected" state in the private method, but block it in the public method sendRequest:withCompletionHandler: so that the lifecycle manager can complete its setup without being bothered by developer error
NSParameterAssert(request != nil);
// If, for some reason, the request is nil we should error out.
- if (!request) {
+ if (request == nil) {
NSError *error = [NSError sdl_lifecycle_rpcErrorWithDescription:@"Nil Request Sent" andReason:@"A nil RPC request was passed and cannot be sent."];
SDLLogW(@"%@", error);
if (handler) {
@@ -726,17 +784,21 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return;
}
- if ([request isKindOfClass:SDLRPCRequest.class]) {
- // Generate and add a correlation ID to the request. When a response for the request is returned from Core, it will have the same correlation ID
- SDLRPCRequest *requestRPC = (SDLRPCRequest *)request;
- NSNumber *corrID = [self sdl_getNextCorrelationId];
- requestRPC.correlationID = corrID;
- [self.responseDispatcher storeRequest:requestRPC handler:handler];
- [self.proxy sendRPC:requestRPC];
- } else if ([request isKindOfClass:SDLRPCResponse.class] || [request isKindOfClass:SDLRPCNotification.class]) {
- [self.proxy sendRPC:request];
- } else {
- SDLLogE(@"Attempting to send an RPC with unknown type, %@. The request should be of type request, response or notification. Returning...", request.class);
+ // Before we send a message, we have to check if we need to adapt the RPC. When adapting the RPC, there could be multiple RPCs that need to be sent.
+ NSArray<SDLRPCMessage *> *messages = [SDLLifecycleRPCAdapter adaptRPC:request direction:SDLRPCDirectionOutgoing];
+ for (SDLRPCMessage *message in messages) {
+ if ([request isKindOfClass:SDLRPCRequest.class]) {
+ // Generate and add a correlation ID to the request. When a response for the request is returned from Core, it will have the same correlation ID
+ SDLRPCRequest *requestRPC = (SDLRPCRequest *)message;
+ NSNumber *corrID = [self sdl_getNextCorrelationId];
+ requestRPC.correlationID = corrID;
+ [self.responseDispatcher storeRequest:requestRPC handler:handler];
+ [self.protocolHandler.protocol sendRPC:requestRPC];
+ } else if ([request isKindOfClass:SDLRPCResponse.class] || [request isKindOfClass:SDLRPCNotification.class]) {
+ [self.protocolHandler.protocol sendRPC:message];
+ } else {
+ SDLLogE(@"Will not send an RPC with unknown type, %@. The request should be of type SDLRPCRequest, SDLRPCResponse, or SDLRPCNotification.", request.class);
+ }
}
}
@@ -772,17 +834,8 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
return YES;
}
-// this is to make sure that the transition happens on the dedicated queue
-- (void)sdl_runOnProcessingQueue:(void (^)(void))block {
- if (dispatch_get_specific(SDLProcessingQueueName) != nil) {
- block();
- } else {
- dispatch_sync(self.lifecycleQueue, block);
- }
-}
-
- (void)sdl_transitionToState:(SDLState *)state {
- [self sdl_runOnProcessingQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
[self.lifecycleStateMachine transitionToState:state];
}];
}
@@ -793,13 +846,15 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
* @return An authentication token
*/
- (nullable NSString *)authToken {
- return self.proxy.protocol.authToken;
+ return self.protocolHandler.protocol.authToken;
}
#pragma mark SDL notification observers
-- (void)transportDidConnect {
- if (![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) {
+- (void)sdl_rpcServiceDidConnect {
+ // Ignore the connection while we are reconnecting. The proxy needs to be disposed and restarted in order to ensure correct state. https://github.com/smartdevicelink/sdl_ios/issues/1172
+ if (![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]
+ && ![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReconnecting]) {
SDLLogD(@"Transport connected");
dispatch_async(self.lifecycleQueue, ^{
@@ -808,22 +863,22 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
}
}
-- (void)transportDidDisconnect {
+- (void)sdl_transportDidDisconnect {
SDLLogD(@"Transport Disconnected");
- dispatch_async(self.lifecycleQueue, ^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
if (self.lifecycleState == SDLLifecycleStateUnregistering || self.lifecycleState == SDLLifecycleStateStopped) {
[self sdl_transitionToState:SDLLifecycleStateStopped];
} else {
[self sdl_transitionToState:SDLLifecycleStateReconnecting];
}
- });
+ }];
}
- (void)hmiStatusDidChange:(SDLRPCNotificationNotification *)notification {
- dispatch_async(self.lifecycleQueue, ^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
[self sdl_hmiStatusDidChange:notification];
- });
+ }];
}
- (void)sdl_hmiStatusDidChange:(SDLRPCNotificationNotification *)notification {
@@ -898,9 +953,9 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
}
- (void)remoteHardwareDidUnregister:(SDLRPCNotificationNotification *)notification {
- dispatch_async(self.lifecycleQueue, ^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.lifecycleQueue block:^{
[self sdl_remoteHardwareDidUnregister:notification];
- });
+ }];
}
- (void)sdl_remoteHardwareDidUnregister:(SDLRPCNotificationNotification *)notification {
@@ -915,8 +970,9 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
[self sdl_transitionToState:SDLLifecycleStateStopped];
} else if ([self.lifecycleStateMachine isCurrentState:SDLLifecycleStateStopped]) {
return;
- } else if (appUnregisteredNotification.reason != nil && ([appUnregisteredNotification.reason isEqualToEnum:SDLAppInterfaceUnregisteredReasonAppUnauthorized] || [appUnregisteredNotification.reason isEqualToString:SDLAppInterfaceUnregisteredReasonProtocolViolation])) {
- // HAX: The string check is due to a core "feature" that could cause -1 to be sent as the enum value, which will crash here.
+ } else if (appUnregisteredNotification.reason != nil
+ && ([appUnregisteredNotification.reason isEqualToEnum:SDLAppInterfaceUnregisteredReasonAppUnauthorized]
+ || [appUnregisteredNotification.reason isEqualToEnum:SDLAppInterfaceUnregisteredReasonProtocolViolation])) {
[self sdl_transitionToState:SDLLifecycleStateStopped];
} else {
[self sdl_transitionToState:SDLLifecycleStateReconnecting];
diff --git a/SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.h b/SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.h
new file mode 100644
index 000000000..0463995e3
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.h
@@ -0,0 +1,28 @@
+//
+// SDLLifecycleMobileHMIStateHandler.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@protocol SDLConnectionManagerType;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLifecycleMobileHMIStateHandler : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/// Initialize the object
+/// @param connectionManager The connection manager to send RPCs
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager;
+
+/// Stops the manager from checking for app background / foreground notifications.
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.m b/SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.m
new file mode 100644
index 000000000..5a9be2543
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleMobileHMIStateHandler.m
@@ -0,0 +1,94 @@
+//
+// SDLLifecycleMobileHMIStateHandler.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/9/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "SDLLifecycleMobileHMIStateHandler.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLLogMacros.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLRPCResponseNotification.h"
+#import "SDLMsgVersion.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLifecycleMobileHMIStateHandler ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+
+@end
+
+@implementation SDLLifecycleMobileHMIStateHandler
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _connectionManager = connectionManager;
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registerResponseReceived:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil];
+
+ return self;
+}
+
+- (void)stop {
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
+}
+
+/// This method sends an OnHMIStatus with the Mobile's HMI level to the head unit.
+/// This was originally designed to make sure that the head unit properly knew about the mobile app's ability to run timers in the background, which affected heartbeat.
+/// It may still affect some features on the head unit and the ability for the head unit to know which app is in the foreground is useful. It should not be removed due to unknown backward compatibility issues.
+- (void)sdl_sendMobileHMIState {
+ __block UIApplicationState appState = UIApplicationStateInactive;
+ if ([NSThread isMainThread]) {
+ appState = [UIApplication sharedApplication].applicationState;
+ } else {
+ dispatch_sync(dispatch_get_main_queue(), ^{
+ appState = [UIApplication sharedApplication].applicationState;
+ });
+ }
+
+ SDLOnHMIStatus *hmiStatus = [[SDLOnHMIStatus alloc] init];
+ hmiStatus.audioStreamingState = SDLAudioStreamingStateNotAudible;
+ hmiStatus.systemContext = SDLSystemContextMain;
+
+ switch (appState) {
+ case UIApplicationStateActive: {
+ hmiStatus.hmiLevel = SDLHMILevelFull;
+ } break;
+ case UIApplicationStateBackground: // Fallthrough
+ case UIApplicationStateInactive: {
+ hmiStatus.hmiLevel = SDLHMILevelBackground;
+ } break;
+ default: break;
+ }
+
+ SDLLogD(@"Mobile UIApplication state changed, sending to remote system: %@", hmiStatus.hmiLevel);
+ [self.connectionManager sendConnectionManagerRPC:hmiStatus];
+}
+
+#pragma mark - Actions
+
+- (void)registerResponseReceived:(SDLRPCResponseNotification *)notification {
+ SDLRegisterAppInterfaceResponse *response = (SDLRegisterAppInterfaceResponse *)notification.response;
+
+ if (response.sdlMsgVersion.majorVersion.unsignedIntegerValue >= 4) {
+ [self sdl_sendMobileHMIState];
+ // Send SDL updates to application state
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_sendMobileHMIState) name:UIApplicationDidBecomeActiveNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_sendMobileHMIState) name:UIApplicationDidEnterBackgroundNotification object:nil];
+ }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleProtocolHandler.h b/SmartDeviceLink/SDLLifecycleProtocolHandler.h
new file mode 100644
index 000000000..f39964e8b
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleProtocolHandler.h
@@ -0,0 +1,38 @@
+//
+// SDLProtocolDelegateHandler.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLProtocolDelegate.h"
+
+@class SDLConfiguration;
+@class SDLNotificationDispatcher;
+@class SDLProtocol;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLifecycleProtocolHandler : NSObject <SDLProtocolDelegate>
+
+@property (strong, nonatomic) SDLProtocol *protocol;
+
+/// Initialize the object
+/// @param protocol A protocol to receive protocol messages from and to send RPC data to
+/// @param notificationDispatcher A notification dispatcher to send notifications through
+/// @param configuration The configuration to use pass the app id to the protocol
+- (instancetype)initWithProtocol:(SDLProtocol *)protocol notificationDispatcher:(SDLNotificationDispatcher *)notificationDispatcher configuration:(SDLConfiguration *)configuration;
+
+/// Starts the manager and the underlying protocol.
+- (void)start;
+
+/// Stops the manager and the underlying protocol, which disconnects the underlying transport
+/// @param disconnectCompletionHandler A handler called when the transport finishes its disconnection
+- (void)stopWithCompletionHandler:(void (^)(void))disconnectCompletionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleProtocolHandler.m b/SmartDeviceLink/SDLLifecycleProtocolHandler.m
new file mode 100644
index 000000000..49a789637
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleProtocolHandler.m
@@ -0,0 +1,215 @@
+//
+// SDLProtocolDelegateHandler.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/10/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLLifecycleProtocolHandler.h"
+
+#import "SDLConfiguration.h"
+#import "SDLControlFramePayloadRPCStartService.h"
+#import "SDLError.h"
+#import "SDLGlobals.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLifecycleRPCAdapter.h"
+#import "SDLLogMacros.h"
+#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLProtocol.h"
+#import "SDLProtocolHeader.h"
+#import "SDLProtocolMessage.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLRPCMessage.h"
+#import "SDLRPCMessageType.h"
+#import "SDLTimer.h"
+
+static const float StartSessionTime = 10.0;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLifecycleProtocolHandler ()
+
+@property (weak, nonatomic) SDLNotificationDispatcher *notificationDispatcher;
+
+@property (strong, nonatomic) SDLTimer *rpcStartServiceTimeoutTimer;
+@property (copy, nonatomic) NSString *appId;
+
+@end
+
+@implementation SDLLifecycleProtocolHandler
+
+- (instancetype)initWithProtocol:(SDLProtocol *)protocol notificationDispatcher:(SDLNotificationDispatcher *)notificationDispatcher configuration:(SDLConfiguration *)configuration {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _protocol = protocol;
+ _notificationDispatcher = notificationDispatcher;
+
+ _appId = configuration.lifecycleConfig.fullAppId ? configuration.lifecycleConfig.fullAppId : configuration.lifecycleConfig.appId;
+ _protocol.appId = _appId;
+
+ [_protocol.protocolDelegateTable addObject:self];
+
+ return self;
+}
+
+- (void)start {
+ [self.protocol start];
+}
+
+- (void)stopWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {
+ [self.protocol stopWithCompletionHandler:^{
+ disconnectCompletionHandler();
+ }];
+}
+
+
+#pragma mark - SDLProtocolDelegate
+
+/// Called when the transport is opened. We will send the RPC Start Service and wait for the RPC Start Service ACK
+- (void)protocolDidOpen:(SDLProtocol *)protocol {
+ if (self.protocol != protocol) { return; }
+
+ SDLLogD(@"Transport opened, sending an RPC Start Service, and starting timer for RPC Start Service ACK to be received.");
+ [self.notificationDispatcher postNotificationName:SDLTransportDidConnect infoObject:nil];
+
+ SDLControlFramePayloadRPCStartService *startServicePayload = [[SDLControlFramePayloadRPCStartService alloc] initWithVersion:SDLMaxProxyProtocolVersion];
+ [self.protocol startServiceWithType:SDLServiceTypeRPC payload:startServicePayload.data];
+
+ if (self.rpcStartServiceTimeoutTimer == nil) {
+ self.rpcStartServiceTimeoutTimer = [[SDLTimer alloc] initWithDuration:StartSessionTime repeat:NO];
+ __weak typeof(self) weakSelf = self;
+ self.rpcStartServiceTimeoutTimer.elapsedBlock = ^{
+ SDLLogE(@"Start session timed out after %f seconds, closing the connection.", StartSessionTime);
+ [weakSelf.protocol stopWithCompletionHandler:^{}];
+ };
+ }
+ [self.rpcStartServiceTimeoutTimer start];
+}
+
+/// Called when the transport is closed.
+- (void)protocolDidClose:(SDLProtocol *)protocol {
+ if (self.protocol != protocol) { return; }
+
+ SDLLogW(@"Transport disconnected");
+ [self.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
+}
+
+- (void)protocol:(SDLProtocol *)protocol transportDidError:(NSError *)error {
+ if (self.protocol != protocol) { return; }
+
+ SDLLogW(@"Transport error: %@", error);
+ [self.notificationDispatcher postNotificationName:SDLTransportConnectError infoObject:error];
+}
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
+ if (self.protocol != protocol) { return; }
+
+ SDLLogD(@"Start Service (ACK) SessionId: %d for serviceType %d", startServiceACK.header.sessionID, startServiceACK.header.serviceType);
+
+ if (startServiceACK.header.serviceType == SDLServiceTypeRPC) {
+ [self.rpcStartServiceTimeoutTimer cancel];
+ [self.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
+ }
+}
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK {
+ if (self.protocol != protocol) { return; }
+
+ SDLLogD(@"Start Service (NAK): SessionId: %d for serviceType %d", startServiceNAK.header.sessionID, startServiceNAK.header.serviceType);
+
+ if (startServiceNAK.header.serviceType == SDLServiceTypeRPC) {
+ [self.rpcStartServiceTimeoutTimer cancel];
+ [self.notificationDispatcher postNotificationName:SDLRPCServiceConnectionDidError infoObject:nil];
+ }
+}
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK {
+ if (self.protocol != protocol) { return; }
+
+ SDLLogD(@"End Service (ACK): SessionId: %d for serviceType %d", endServiceACK.header.sessionID, endServiceACK.header.serviceType);
+
+ if (endServiceACK.header.serviceType == SDLServiceTypeRPC) {
+ [self.rpcStartServiceTimeoutTimer cancel];
+ [self.notificationDispatcher postNotificationName:SDLRPCServiceDidDisconnect infoObject:nil];
+ }
+}
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK {
+ if (self.protocol != protocol) { return; }
+
+ if (endServiceNAK.header.serviceType == SDLServiceTypeRPC) {
+ NSError *error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:@"RPC Service failed to stop" andReason:nil];
+ [self.notificationDispatcher postNotificationName:SDLRPCServiceConnectionDidError infoObject:error];
+ }
+}
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveMessage:(SDLProtocolMessage *)msg {
+ if (self.protocol != protocol) { return; }
+
+ NSDictionary<NSString *, id> *rpcMessageAsDictionary = [msg rpcDictionary];
+ SDLRPCMessage *receivedMessage = [[SDLRPCMessage alloc] initWithDictionary:rpcMessageAsDictionary];
+ NSString *fullName = [self sdl_fullNameForMessage:receivedMessage];
+
+ // From the function name, create the corresponding RPCObject and initialize it
+ NSString *functionClassName = [NSString stringWithFormat:@"SDL%@", fullName];
+ SDLRPCMessage *newMessage = [[NSClassFromString(functionClassName) alloc] initWithDictionary:rpcMessageAsDictionary];
+
+ // If we were unable to create the message, it's an unknown type; discard it
+ if (newMessage == nil) { return; }
+
+ // Adapt the incoming message then call the callback
+ NSArray<SDLRPCMessage *> *adaptedMessages = [SDLLifecycleRPCAdapter adaptRPC:newMessage direction:SDLRPCDirectionIncoming];
+ for (SDLRPCMessage *message in adaptedMessages) {
+ [self sdl_sendCallbackForMessage:message];
+ }
+}
+
+#pragma mark - Utilities
+
+- (void)sdl_sendCallbackForMessage:(SDLRPCMessage *)message {
+ // Log the RPC message
+ SDLLogV(@"Sending callback for RPC message: %@", message);
+
+ SDLNotificationName notificationName = [self sdl_notificationNameForMessage:message];
+ if ([message.messageType isEqualToEnum:SDLRPCMessageTypeNameResponse]) {
+ [self.notificationDispatcher postRPCResponseNotification:notificationName response:(SDLRPCResponse *)message];
+ } else if ([message.messageType isEqualToEnum:SDLRPCMessageTypeNameRequest]) {
+ [self.notificationDispatcher postRPCRequestNotification:notificationName request:(SDLRPCRequest *)message];
+ } else if ([message.messageType isEqualToEnum:SDLRPCMessageTypeNameNotification]) {
+ [self.notificationDispatcher postRPCNotificationNotification:notificationName notification:(SDLRPCNotification *)message];
+ }
+}
+
+- (SDLNotificationName)sdl_notificationNameForMessage:(SDLRPCMessage *)message {
+ NSString *messageName = message.name;
+ if ([message.messageType isEqualToEnum:SDLRPCMessageTypeNameResponse]) {
+ return [NSString stringWithFormat:@"com.sdl.response.%@", messageName];
+ } else if ([message.messageType isEqualToEnum:SDLRPCMessageTypeNameRequest]) {
+ return [NSString stringWithFormat:@"com.sdl.request.%@", messageName];
+ } else if ([message.messageType isEqualToEnum:SDLRPCMessageTypeNameNotification]) {
+ return [NSString stringWithFormat:@"com.sdl.notification.%@", messageName];
+ }
+
+ return messageName;
+}
+
+- (NSString *)sdl_fullNameForMessage:(SDLRPCMessage *)message {
+ NSString *functionName = message.name;
+ NSString *messageType = message.messageType;
+
+ // If it's a response, append "response"
+ if ([messageType isEqualToEnum:SDLRPCMessageTypeNameResponse]) {
+ if (![functionName isEqualToEnum:SDLRPCFunctionNameGenericResponse]) {
+ functionName = [NSString stringWithFormat:@"%@Response", functionName];
+ }
+ }
+
+ return functionName;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleRPCAdapter.h b/SmartDeviceLink/SDLLifecycleRPCAdapter.h
new file mode 100644
index 000000000..1eea483d4
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleRPCAdapter.h
@@ -0,0 +1,29 @@
+//
+// SDLLifecycleRPCAdapter.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/15/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLRPCMessage;
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NS_ENUM(NSUInteger, SDLRPCDirection) {
+ SDLRPCDirectionIncoming,
+ SDLRPCDirectionOutgoing
+};
+
+@interface SDLLifecycleRPCAdapter : NSObject
+
+/// Takes an RPC message (request, response, or notification) and adapts for the negotiated RPC spec version. This may need to happen before being sent or received.
+/// @param message The message to be adapted
+/// @return The message or messages to be sent or recieved
++ (NSArray<SDLRPCMessage *> *)adaptRPC:(SDLRPCMessage *)message direction:(SDLRPCDirection)direction;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleRPCAdapter.m b/SmartDeviceLink/SDLLifecycleRPCAdapter.m
new file mode 100644
index 000000000..3b965172c
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleRPCAdapter.m
@@ -0,0 +1,164 @@
+//
+// SDLLifecycleRPCAdapter.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/15/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLLifecycleRPCAdapter.h"
+
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLOnButtonEvent.h"
+#import "SDLOnButtonPress.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLRPCMessage.h"
+#import "SDLSubscribeButton.h"
+#import "SDLUnsubscribeButton.h"
+#import "SDLVersion.h"
+
+@implementation SDLLifecycleRPCAdapter
+
++ (NSArray<SDLRPCMessage *> *)adaptRPC:(SDLRPCMessage *)message direction:(SDLRPCDirection)direction {
+ switch (direction) {
+ case SDLRPCDirectionIncoming:
+ if ([message.name isEqualToEnum:SDLRPCFunctionNameOnButtonPress]) {
+ return [self adaptOnButtonPress:(SDLOnButtonPress *)message];
+ } else if ([message.name isEqualToEnum:SDLRPCFunctionNameOnButtonEvent]) {
+ return [self adaptOnButtonEvent:(SDLOnButtonEvent *)message];
+ }
+ break;
+ case SDLRPCDirectionOutgoing:
+ if ([message.name isEqualToEnum:SDLRPCFunctionNameSubscribeButton]) {
+ return [self adaptSubscribeButton:(SDLSubscribeButton *)message];
+ } else if ([message.name isEqualToEnum:SDLRPCFunctionNameUnsubscribeButton]) {
+ return [self adaptUnsubscribeButton:(SDLUnsubscribeButton *)message];
+ }
+ break;
+ }
+
+ return @[message];
+}
+
+#pragma mark - Individual RPC Adaptations
+
+#pragma mark Incoming
+
+#pragma mark Notifications
+
+// https://github.com/smartdevicelink/sdl_java_suite/pull/864
++ (NSArray<SDLRPCMessage *> *)adaptOnButtonPress:(SDLOnButtonPress *)message {
+ SDLLogD(@"Adapting onButtonPress message: %@", message);
+ if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
+ if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
+ // Force receive PlayPause & OK notifications
+ SDLOnButtonPress *okPress = [message copy];
+ okPress.buttonName = SDLButtonNameOk;
+
+ return @[message, okPress];
+ } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
+ // Force receive PlayPause and OK notifications
+ SDLOnButtonPress *playPausePress = [message copy];
+ playPausePress.buttonName = SDLButtonNamePlayPause;
+
+ return @[message, playPausePress];
+ }
+ } else { // Major version < 5
+ if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
+ // Force receive Ok and Play/Pause notifications
+ SDLOnButtonPress *playPausePress = [message copy];
+ playPausePress.buttonName = SDLButtonNamePlayPause;
+
+ return @[message, playPausePress];
+ } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
+ // Drop
+ return @[];
+ }
+ }
+
+ return @[message];
+}
+
+// https://github.com/smartdevicelink/sdl_java_suite/pull/864
++ (NSArray<SDLRPCMessage *> *)adaptOnButtonEvent:(SDLOnButtonEvent *)message {
+ SDLLogD(@"Adapting onButtonEvent message: %@", message);
+ if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
+ if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
+ // Force receive PlayPause & OK notifications
+ SDLOnButtonEvent *okEvent = [message copy];
+ okEvent.buttonName = SDLButtonNameOk;
+
+ return @[message, okEvent];
+ } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
+ // Force receive PlayPause and OK notifications
+ SDLOnButtonEvent *playPauseEvent = [message copy];
+ playPauseEvent.buttonName = SDLButtonNamePlayPause;
+
+ return @[message, playPauseEvent];
+ }
+ } else { // Major version < 5
+ if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
+ // Force receive Ok and Play/Pause notifications
+ SDLOnButtonEvent *playPauseEvent = [message copy];
+ playPauseEvent.buttonName = SDLButtonNamePlayPause;
+
+ return @[message, playPauseEvent];
+ } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
+ // Drop
+ return @[];
+ }
+ }
+
+ return @[message];
+}
+
+#pragma mark Outgoing
+
+#pragma mark Requests
+
+// See table here https://github.com/smartdevicelink/sdl_java_suite/pull/864
++ (NSArray<SDLRPCMessage *> *)adaptSubscribeButton:(SDLSubscribeButton *)message {
+ SDLLogD(@"Adapting SubscribeButton message: %@", message);
+ if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
+ if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
+ SDLSubscribeButton *playPauseMessage = [message copy];
+ playPauseMessage.buttonName = SDLButtonNamePlayPause;
+
+ return @[message, playPauseMessage];
+ }
+ } else { // Major version < 5
+ if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
+ SDLSubscribeButton *okMessage = [message copy];
+ okMessage.buttonName = SDLButtonNameOk;
+
+ return @[okMessage];
+ }
+ }
+
+ return @[message];
+}
+
+// https://github.com/smartdevicelink/sdl_java_suite/pull/864
++ (NSArray<SDLRPCMessage *> *)adaptUnsubscribeButton:(SDLUnsubscribeButton *)message {
+ SDLLogD(@"Adapting UnsubscribeButton message: %@", message);
+ if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
+ if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
+ SDLUnsubscribeButton *playPauseMessage = [message copy];
+ playPauseMessage.buttonName = SDLButtonNamePlayPause;
+
+ return @[message, playPauseMessage];
+ }
+ } else { // Major version < 5
+ if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
+ SDLUnsubscribeButton *okMessage = [message copy];
+ okMessage.buttonName = SDLButtonNameOk;
+
+ return @[okMessage];
+ }
+ }
+
+ return @[message];
+}
+
+@end
diff --git a/SmartDeviceLink/SDLLifecycleSyncPDataHandler.h b/SmartDeviceLink/SDLLifecycleSyncPDataHandler.h
new file mode 100644
index 000000000..f80ca385d
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleSyncPDataHandler.h
@@ -0,0 +1,29 @@
+//
+// SDLLifecycleSyncPDataHandler.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/8/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLConnectionManagerType;
+
+/// Handles decoding OnSyncPData RPCs, then performing network requests and creating a SyncPData RPC request for legacy head units.
+@interface SDLLifecycleSyncPDataHandler : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/// Initialize the object
+/// @param manager The connection manager to send RPCs through
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager;
+
+/// Stops the manager cancels all URL session tasks
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleSyncPDataHandler.m b/SmartDeviceLink/SDLLifecycleSyncPDataHandler.m
new file mode 100644
index 000000000..58ef27696
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleSyncPDataHandler.m
@@ -0,0 +1,153 @@
+//
+// SDLLifecycleSyncPDataHandler.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/8/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "SDLLifecycleSyncPDataHandler.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLEncodedSyncPData.h"
+#import "SDLLogMacros.h"
+#import "SDLOnEncodedSyncPData.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCParameterNames.h"
+
+static const float DefaultConnectionTimeout = 45.0;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLifecycleSyncPDataHandler ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> manager;
+@property (strong, nonatomic) NSURLSession *urlSession;
+
+@end
+
+@implementation SDLLifecycleSyncPDataHandler
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager {
+ self = [super init];
+ if (!self) { return nil; }
+
+ SDLLogV(@"Initializing SyncPData handler");
+ _manager = manager;
+
+ NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
+ configuration.timeoutIntervalForRequest = DefaultConnectionTimeout;
+ configuration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
+ _urlSession = [NSURLSession sessionWithConfiguration:configuration];
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_encodedSyncPDataReceived:) name:SDLDidReceiveEncodedDataNotification object:nil];
+#pragma clang diagnostic pop
+
+ return self;
+}
+
+- (void)stop {
+ SDLLogV(@"Stopping SyncPData handler and stopping all URL session tasks");
+ [self.urlSession getTasksWithCompletionHandler:^(NSArray<NSURLSessionDataTask *> * _Nonnull dataTasks, NSArray<NSURLSessionUploadTask *> * _Nonnull uploadTasks, NSArray<NSURLSessionDownloadTask *> * _Nonnull downloadTasks) {
+ for (NSURLSessionTask *task in dataTasks) {
+ [task cancel];
+ }
+
+ for (NSURLSessionTask *task in uploadTasks) {
+ [task cancel];
+ }
+
+ for (NSURLSessionTask *task in downloadTasks) {
+ [task cancel];
+ }
+ }];
+}
+
+#pragma mark - Utilities
+
+- (void)sdl_sendEncodedSyncPData:(NSDictionary<NSString *, id> *)encodedSyncPData toURL:(NSString *)urlString withTimeout:(NSNumber *)timeout {
+ // Configure HTTP URL & Request
+ NSURL *url = [NSURL URLWithString:urlString];
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
+ request.HTTPMethod = @"POST";
+ [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
+ request.timeoutInterval = 60;
+
+ // Prepare the data in the required format
+ NSString *encodedSyncPDataString = [[NSString stringWithFormat:@"%@", encodedSyncPData] componentsSeparatedByString:@"\""][1];
+ NSArray<NSString *> *array = [NSArray arrayWithObject:encodedSyncPDataString];
+ NSDictionary<NSString *, id> *dictionary = @{ @"data": array };
+ NSError *JSONSerializationError = nil;
+ NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:&JSONSerializationError];
+ if (JSONSerializationError) {
+ SDLLogW(@"Error attempting to create SyncPData for HTTP request: %@", JSONSerializationError);
+ return;
+ }
+
+ // Send the HTTP Request
+ __weak typeof(self) weakSelf = self;
+ [[self.urlSession uploadTaskWithRequest:request
+ fromData:data
+ completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
+ [weakSelf sdl_syncPDataNetworkRequestCompleteWithData:data response:response error:error];
+ }] resume];
+
+ SDLLogV(@"OnEncodedSyncPData (HTTP Request)");
+}
+
+// Handle the OnEncodedSyncPData HTTP Response
+- (void)sdl_syncPDataNetworkRequestCompleteWithData:(NSData *)data response:(NSURLResponse *)response error:(NSError *)error {
+ // Sample of response: {"data":["SDLKGLSDKFJLKSjdslkfjslkJLKDSGLKSDJFLKSDJF"]}
+ SDLLogV(@"OnEncodedSyncPData (HTTP Response): %@", response);
+
+ // Validate response data.
+ if (data == nil || data.length == 0) {
+ SDLLogW(@"OnEncodedSyncPData (HTTP Response): no data returned");
+ return;
+ }
+
+ // Convert data to RPCRequest
+ NSError *JSONConversionError = nil;
+ NSDictionary<NSString *, id> *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONConversionError];
+ if (JSONConversionError) {
+ SDLLogE(@"Error converting EncodedSyncPData response dictionary: %@", JSONConversionError);
+ return;
+ }
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLEncodedSyncPData *request = [[SDLEncodedSyncPData alloc] init];
+#pragma clang diagnostic pop
+ request.data = responseDictionary[@"data"];
+
+ [self.manager sendConnectionManagerRequest:request withResponseHandler:nil];
+}
+
+
+#pragma mark - Notifications
+
+- (void)sdl_encodedSyncPDataReceived:(SDLRPCNotificationNotification *)notification {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLOnEncodedSyncPData *message = notification.notification;
+#pragma clang diagnostic pop
+
+ // If URL != nil, perform HTTP Post and don't pass the notification to proxy listeners
+ SDLLogV(@"OnEncodedSyncPData: %@", message);
+
+ NSString *urlString = (NSString *)message.parameters[SDLRPCParameterNameURLUppercase];
+ NSDictionary<NSString *, id> *encodedSyncPData = (NSDictionary<NSString *, id> *)message.parameters[SDLRPCParameterNameData];
+ NSNumber *encodedSyncPTimeout = (NSNumber *)message.parameters[SDLRPCParameterNameTimeoutCapitalized];
+
+ if (urlString && encodedSyncPData && encodedSyncPTimeout) {
+ [self sdl_sendEncodedSyncPData:encodedSyncPData toURL:urlString withTimeout:encodedSyncPTimeout];
+ }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleSystemRequestHandler.h b/SmartDeviceLink/SDLLifecycleSystemRequestHandler.h
new file mode 100644
index 000000000..40865361a
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleSystemRequestHandler.h
@@ -0,0 +1,29 @@
+//
+// SDLLifecycleSystemRequestHandler.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/8/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLConnectionManagerType;
+
+/// Handles decoding OnSystemRequest RPCs, then performing network requests and creating a SystemRequest RPC request for head units.
+@interface SDLLifecycleSystemRequestHandler : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/// Initialize the object
+/// @param manager A connection manager to send RPCs
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager;
+
+/// Stops the manager and clears all URL Session tasks
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleSystemRequestHandler.m b/SmartDeviceLink/SDLLifecycleSystemRequestHandler.m
new file mode 100644
index 000000000..354dca8dd
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleSystemRequestHandler.m
@@ -0,0 +1,336 @@
+//
+// SDLLifecycleSystemRequestHandler.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/8/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "SDLLifecycleSystemRequestHandler.h"
+
+#import "SDLCacheFileManager.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnSystemRequest.h"
+#import "SDLPutFile.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLSystemRequest.h"
+
+static const float DefaultConnectionTimeout = 45.0;
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void (^URLSessionTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error);
+typedef void (^URLSessionDownloadTaskCompletionHandler)(NSURL *location, NSURLResponse *response, NSError *error);
+
+@interface SDLLifecycleSystemRequestHandler ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> manager;
+@property (strong, nonatomic) SDLCacheFileManager *cacheFileManager;
+@property (strong, nonatomic) NSURLSession *urlSession;
+
+@end
+
+@implementation SDLLifecycleSystemRequestHandler
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager {
+ self = [super init];
+ if (!self) { return nil; }
+
+ SDLLogV(@"Initializing SystemRequest handler");
+ _manager = manager;
+
+ _cacheFileManager = [[SDLCacheFileManager alloc] init];
+
+ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
+ configuration.timeoutIntervalForRequest = DefaultConnectionTimeout;
+ configuration.timeoutIntervalForResource = DefaultConnectionTimeout;
+ configuration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
+ _urlSession = [NSURLSession sessionWithConfiguration:configuration];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(systemRequestReceived:) name:SDLDidReceiveSystemRequestNotification object:nil];
+
+ return self;
+}
+
+- (void)stop {
+ SDLLogV(@"Stopping SystemRequest handler and stopping all URL session tasks");
+ [self.urlSession getTasksWithCompletionHandler:^(NSArray<NSURLSessionDataTask *> * _Nonnull dataTasks, NSArray<NSURLSessionUploadTask *> * _Nonnull uploadTasks, NSArray<NSURLSessionDownloadTask *> * _Nonnull downloadTasks) {
+ for (NSURLSessionTask *task in dataTasks) {
+ [task cancel];
+ }
+
+ for (NSURLSessionTask *task in uploadTasks) {
+ [task cancel];
+ }
+
+ for (NSURLSessionTask *task in downloadTasks) {
+ [task cancel];
+ }
+ }];
+}
+
+#pragma mark - Handle OnSystemRequest
+- (void)sdl_handleSystemRequestLaunchApp:(SDLOnSystemRequest *)request {
+ NSURL *urlScheme = [NSURL URLWithString:request.url];
+ if (urlScheme == nil) {
+ SDLLogW(@"System request LaunchApp failed: invalid URL sent from module: %@", request.url);
+ return;
+ }
+
+ // If system version is less than 9.0 http://stackoverflow.com/a/5337804/1370927
+ if (SDL_SYSTEM_VERSION_LESS_THAN(@"9.0")) {
+ // Return early if we can't openURL because openURL will crash instead of fail silently in < 9.0
+ if (![[UIApplication sharedApplication] canOpenURL:urlScheme]) {
+ return;
+ }
+ }
+
+ [[UIApplication sharedApplication] openURL:urlScheme];
+}
+
+- (void)sdl_handleSystemRequestProprietary:(SDLOnSystemRequest *)request {
+ NSDictionary<NSString *, id> *jsonDict = [self sdl_validateAndParseProprietarySystemRequest:request];
+ if (jsonDict == nil || request.url == nil) {
+ return;
+ }
+
+ // Send the HTTP Request
+ __weak typeof(self) weakSelf = self;
+ [self sdl_uploadForBodyDataDictionary:jsonDict
+ urlString:request.url
+ completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+
+ if (error) {
+ SDLLogW(@"OnSystemRequest HTTP response error: %@", error);
+ return;
+ }
+ if (data == nil || data.length == 0) {
+ SDLLogW(@"OnSystemRequest HTTP response error: no data received");
+ return;
+ }
+
+ // Create the SystemRequest RPC to send to module.
+ SDLLogV(@"OnSystemRequest HTTP response");
+ SDLSystemRequest *request = [[SDLSystemRequest alloc] init];
+ request.requestType = SDLRequestTypeProprietary;
+ request.bulkData = data;
+
+ // Send the RPC Request
+ [strongSelf.manager sendConnectionManagerRequest:request withResponseHandler:nil];
+ }];
+}
+
+// TODO: Move to lock screen manager
+- (void)sdl_handleSystemRequestLockScreenIconURL:(SDLOnSystemRequest *)request {
+ [self.cacheFileManager retrieveImageForRequest:request withCompletionHandler:^(UIImage * _Nullable image, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogW(@"Failed to retrieve lock screen icon: %@", error.localizedDescription);
+ return;
+ }
+
+ NSDictionary<NSString *, id> *userInfo = nil;
+ if (image != nil) {
+ userInfo = @{SDLNotificationUserInfoObject: image};
+ }
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveLockScreenIcon object:nil userInfo:userInfo];
+ }];
+}
+
+- (void)sdl_handleSystemRequestIconURL:(SDLOnSystemRequest *)request {
+ __weak typeof(self) weakSelf = self;
+ [self sdl_sendDataTaskWithURL:[NSURL URLWithString:request.url]
+ completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (error != nil) {
+ SDLLogW(@"OnSystemRequest (icon url) HTTP download task failed: %@", error.localizedDescription);
+ return;
+ } else if (data.length == 0) {
+ SDLLogW(@"OnSystemRequest (icon url) HTTP download task failed to get the cloud app icon image data");
+ return;
+ }
+
+ SDLSystemRequest *iconURLSystemRequest = [[SDLSystemRequest alloc] initWithType:SDLRequestTypeIconURL fileName:request.url];
+ iconURLSystemRequest.bulkData = data;
+
+ [strongSelf.manager sendConnectionManagerRequest:iconURLSystemRequest withResponseHandler:nil];
+ }];
+}
+
+- (void)sdl_handleSystemRequestHTTP:(SDLOnSystemRequest *)request {
+ if (request.bulkData.length == 0) {
+ // TODO: not sure how we want to handle http requests that don't have bulk data (maybe as GET?)
+ return;
+ }
+
+ __weak typeof(self) weakSelf = self;
+ [self sdl_uploadData:request.bulkData
+ toURLString:request.url
+ completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (error != nil) {
+ SDLLogW(@"OnSystemRequest (HTTP) error: %@", error.localizedDescription);
+ return;
+ }
+
+ if (data.length == 0) {
+ SDLLogW(@"OnSystemRequest (HTTP) error: no data returned");
+ return;
+ }
+
+ // Show the HTTP response
+ SDLLogV(@"OnSystemRequest (HTTP) response: %@", response);
+
+ // Create the PutFile RPC to send to module.
+ SDLPutFile *putFile = [[SDLPutFile alloc] init];
+ putFile.fileType = SDLFileTypeJSON;
+ putFile.sdlFileName = @"response_data";
+ putFile.bulkData = data;
+
+ // Send RPC Request
+ [strongSelf.manager sendConnectionManagerRequest:putFile withResponseHandler:nil];
+ }];
+}
+
+#pragma mark - HTTP
+
+/**
+ * Start an upload for some data to a web address specified
+ *
+ * @param data The data to be passed to the server
+ * @param urlString The URL the data should be POSTed to
+ * @param completionHandler A completion handler of what to do when the server responds
+ */
+- (void)sdl_uploadData:(NSData *_Nonnull)data toURLString:(NSString *_Nonnull)urlString completionHandler:(URLSessionTaskCompletionHandler _Nullable)completionHandler {
+ // NSURLRequest configuration
+ NSURL *url = [NSURL URLWithString:urlString];
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
+ [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
+ request.HTTPMethod = @"POST";
+
+ SDLLogV(@"OnSystemRequest (HTTP) upload task created for URL: %@", urlString);
+
+ // Create the upload task
+ [self sdl_sendUploadRequest:request withData:data completionHandler:completionHandler];
+}
+
+/**
+ * Start an upload for a body data dictionary, this is used by the "proprietary" system request needed for backward compatibility
+ *
+ * @param dictionary The system request dictionary that contains the HTTP data to be sent
+ * @param urlString A string containing the URL to send the upload to
+ * @param completionHandler A completion handler returning the response from the server to the upload task
+ */
+- (void)sdl_uploadForBodyDataDictionary:(NSDictionary<NSString *, id> *)dictionary urlString:(NSString *)urlString completionHandler:(URLSessionTaskCompletionHandler)completionHandler {
+ NSParameterAssert(dictionary != nil);
+ NSParameterAssert(urlString != nil);
+ NSParameterAssert(completionHandler != NULL);
+
+ // Extract data from the dictionary
+ NSDictionary<NSString *, id> *requestData = dictionary[@"HTTPRequest"];
+ NSDictionary *headers = requestData[@"headers"];
+ NSString *contentType = headers[@"ContentType"];
+ NSTimeInterval timeout = [headers[@"ConnectTimeout"] doubleValue];
+ NSString *method = headers[@"RequestMethod"];
+ NSString *bodyString = requestData[@"body"];
+ NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
+
+ // NSURLRequest configuration
+ NSURL *url = [NSURL URLWithString:urlString];
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
+ [request setValue:contentType forHTTPHeaderField:@"content-type"];
+ request.timeoutInterval = timeout;
+ request.HTTPMethod = method;
+
+ SDLLogV(@"OnSystemRequest (Proprietary) upload task created for URL: %@", urlString);
+
+ // Create the upload task
+ [self sdl_sendUploadRequest:request withData:bodyData completionHandler:completionHandler];
+}
+
+- (void)sdl_sendUploadRequest:(NSURLRequest*)request withData:(NSData*)data completionHandler:(URLSessionTaskCompletionHandler)completionHandler {
+ NSMutableURLRequest* mutableRequest = [request mutableCopy];
+
+ if ([mutableRequest.URL.scheme isEqualToString:@"http"]) {
+ mutableRequest.URL = [NSURL URLWithString:[mutableRequest.URL.absoluteString stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:@"https"]];
+ }
+
+ [[self.urlSession uploadTaskWithRequest:request fromData:data completionHandler:completionHandler] resume];
+}
+
+- (void)sdl_sendDataTaskWithURL:(NSURL*)url completionHandler:(URLSessionTaskCompletionHandler)completionHandler {
+ if ([url.scheme isEqualToString:@"http"]) {
+ url = [NSURL URLWithString:[url.absoluteString stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:@"https"]];
+ }
+
+ [[self.urlSession dataTaskWithURL:url completionHandler:completionHandler] resume];
+}
+
+#pragma mark - Validation
+
+/**
+ * Determine if the System Request is valid and return it's JSON dictionary, if available.
+ *
+ * @param request The system request to parse
+ *
+ * @return A parsed JSON dictionary, or nil if it couldn't be parsed
+ */
+- (nullable NSDictionary<NSString *, id> *)sdl_validateAndParseProprietarySystemRequest:(SDLOnSystemRequest *)request {
+ NSString *urlString = request.url;
+ SDLFileType fileType = request.fileType;
+
+ // Validate input
+ if (urlString == nil || [NSURL URLWithString:urlString] == nil) {
+ SDLLogW(@"OnSystemRequest validation failure: URL is nil");
+ return nil;
+ }
+ if (![fileType isEqualToEnum:SDLFileTypeJSON]) {
+ SDLLogW(@"OnSystemRequest validation failure: file type is not JSON");
+ return nil;
+ }
+
+ // Get data dictionary from the bulkData
+ NSError *error = nil;
+ NSDictionary<NSString *, id> *JSONDictionary = [NSJSONSerialization JSONObjectWithData:request.bulkData options:kNilOptions error:&error];
+ if (error != nil) {
+ SDLLogW(@"OnSystemRequest validation failure: data is not valid JSON");
+ return nil;
+ }
+
+ return JSONDictionary;
+}
+
+#pragma mark - Notifications
+
+- (void)systemRequestReceived:(SDLRPCNotificationNotification *)notification {
+ SDLOnSystemRequest *onSystemRequest = notification.notification;
+ SDLRequestType requestType = onSystemRequest.requestType;
+
+ // Handle the various OnSystemRequest types
+ if ([requestType isEqualToEnum:SDLRequestTypeProprietary]) {
+ [self sdl_handleSystemRequestProprietary:onSystemRequest];
+ } else if ([requestType isEqualToEnum:SDLRequestTypeLockScreenIconURL]) {
+ [self sdl_handleSystemRequestLockScreenIconURL:onSystemRequest];
+ } else if ([requestType isEqualToEnum:SDLRequestTypeIconURL]) {
+ [self sdl_handleSystemRequestIconURL:onSystemRequest];
+ } else if ([requestType isEqualToEnum:SDLRequestTypeHTTP]) {
+ [self sdl_handleSystemRequestHTTP:onSystemRequest];
+ } else if ([requestType isEqualToEnum:SDLRequestTypeLaunchApp]) {
+ if ([NSThread isMainThread]) {
+ [self sdl_handleSystemRequestLaunchApp:onSystemRequest];
+ } else {
+ dispatch_sync(dispatch_get_main_queue(), ^{
+ [self sdl_handleSystemRequestLaunchApp:onSystemRequest];
+ });
+ }
+ }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLockScreenManager.h b/SmartDeviceLink/SDLLockScreenManager.h
index 3e5279878..e4ef48666 100644
--- a/SmartDeviceLink/SDLLockScreenManager.h
+++ b/SmartDeviceLink/SDLLockScreenManager.h
@@ -10,6 +10,8 @@
@class SDLLockScreenConfiguration;
@class SDLLockScreenViewController;
+@class SDLNotificationDispatcher;
+
@protocol SDLViewControllerPresentable;
@@ -61,7 +63,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return An instance of `SDLLockScreenManager`.
*/
-- (instancetype)initWithConfiguration:(SDLLockScreenConfiguration *)config notificationDispatcher:(nullable id)dispatcher presenter:(id<SDLViewControllerPresentable>)presenter;
+- (instancetype)initWithConfiguration:(SDLLockScreenConfiguration *)config notificationDispatcher:(SDLNotificationDispatcher *)dispatcher presenter:(id<SDLViewControllerPresentable>)presenter;
/**
* Start the manager. This is used internally.
diff --git a/SmartDeviceLink/SDLLockScreenManager.m b/SmartDeviceLink/SDLLockScreenManager.m
index 1d4bc9e4a..34ceee0bd 100644
--- a/SmartDeviceLink/SDLLockScreenManager.m
+++ b/SmartDeviceLink/SDLLockScreenManager.m
@@ -11,9 +11,11 @@
#import "NSBundle+SDLBundle.h"
#import "SDLLogMacros.h"
#import "SDLLockScreenConfiguration.h"
+#import "SDLLockScreenStatusManager.h"
#import "SDLLockScreenStatus.h"
#import "SDLLockScreenViewController.h"
#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
#import "SDLOnLockScreenStatus.h"
#import "SDLOnDriverDistraction.h"
#import "SDLRPCNotificationNotification.h"
@@ -27,6 +29,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (assign, nonatomic) BOOL canPresent;
@property (strong, nonatomic, readwrite) SDLLockScreenConfiguration *config;
@property (strong, nonatomic) id<SDLViewControllerPresentable> presenter;
+@property (strong, nonatomic) SDLLockScreenStatusManager *statusManager;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -42,7 +45,7 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLLockScreenManager
-- (instancetype)initWithConfiguration:(SDLLockScreenConfiguration *)config notificationDispatcher:(nullable id)dispatcher presenter:(id<SDLViewControllerPresentable>)presenter {
+- (instancetype)initWithConfiguration:(SDLLockScreenConfiguration *)config notificationDispatcher:(SDLNotificationDispatcher *)dispatcher presenter:(id<SDLViewControllerPresentable>)presenter {
self = [super init];
if (!self) {
return nil;
@@ -53,12 +56,13 @@ NS_ASSUME_NONNULL_BEGIN
_config = config;
_presenter = presenter;
_lockScreenDismissedByUser = NO;
+ _statusManager = [[SDLLockScreenStatusManager alloc] initWithNotificationDispatcher:dispatcher];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_lockScreenStatusDidChange:) name:SDLDidChangeLockScreenStatusNotification object:dispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_lockScreenStatusDidChange:) name:SDLDidChangeLockScreenStatusNotification object:_statusManager];
#pragma clang diagnostic pop
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_lockScreenIconReceived:) name:SDLDidReceiveLockScreenIcon object:dispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_lockScreenIconReceived:) name:SDLDidReceiveLockScreenIcon object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_driverDistractionStateDidChange:) name:SDLDidChangeDriverDistractionStateNotification object:dispatcher];
@@ -144,7 +148,6 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdl_lockScreenIconReceived:(NSNotification *)notification {
- NSAssert([notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[UIImage class]], @"A notification was sent with an unanticipated object");
if (![notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[UIImage class]]) {
return;
}
diff --git a/SmartDeviceLink/SDLLockScreenStatusManager.h b/SmartDeviceLink/SDLLockScreenStatusManager.h
index a6ac19b01..4230f6d2a 100644
--- a/SmartDeviceLink/SDLLockScreenStatusManager.h
+++ b/SmartDeviceLink/SDLLockScreenStatusManager.h
@@ -8,6 +8,7 @@
#import "SDLHMILevel.h"
#import "SDLLockScreenStatus.h"
+@class SDLNotificationDispatcher;
@class SDLOnLockScreenStatus;
NS_ASSUME_NONNULL_BEGIN
@@ -23,6 +24,9 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readonly) SDLOnLockScreenStatus *lockScreenStatusNotification;
#pragma clang diagnostic pop
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithNotificationDispatcher:(SDLNotificationDispatcher *)dispatcher;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLockScreenStatusManager.m b/SmartDeviceLink/SDLLockScreenStatusManager.m
index 3c240edf9..e661abd80 100644
--- a/SmartDeviceLink/SDLLockScreenStatusManager.m
+++ b/SmartDeviceLink/SDLLockScreenStatusManager.m
@@ -6,7 +6,13 @@
#import "SDLLockScreenStatusManager.h"
#import "SDLLockScreenStatus.h"
+#import "SDLLogMacros.h"
+#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLOnDriverDistraction.h"
+#import "SDLOnHMIStatus.h"
#import "SDLOnLockScreenStatus.h"
+#import "SDLRPCNotificationNotification.h"
NS_ASSUME_NONNULL_BEGIN
@@ -21,13 +27,17 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Lifecycle
-- (instancetype)init {
+- (instancetype)initWithNotificationDispatcher:(SDLNotificationDispatcher *)dispatcher {
self = [super init];
- if (self) {
- _userSelected = NO;
- _driverDistracted = NO;
- _haveDriverDistractionStatus = NO;
- }
+ if (!self) { return nil; }
+
+ _userSelected = NO;
+ _driverDistracted = NO;
+ _haveDriverDistractionStatus = NO;
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusDidUpdate:) name:SDLDidChangeHMIStatusNotification object:dispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_driverDistractionDidUpdate:) name:SDLDidChangeDriverDistractionStateNotification object:dispatcher];
+
return self;
}
@@ -125,6 +135,35 @@ NS_ASSUME_NONNULL_BEGIN
}
}
+#pragma mark - Utilities
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+- (void)sdl_postLockScreenStatus:(SDLOnLockScreenStatus *)statusNotification {
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:self rpcNotification:statusNotification];
+#pragma clang diagnostic pop
+
+ SDLLogD(@"Lock screen status changed. Sending new notification: %@", notification);
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+}
+
+
+#pragma mark - Observers
+
+- (void)sdl_hmiStatusDidUpdate:(SDLRPCNotificationNotification *)notification {
+ SDLOnHMIStatus *hmiStatus = notification.notification;
+
+ self.hmiLevel = hmiStatus.hmiLevel;
+ [self sdl_postLockScreenStatus:self.lockScreenStatusNotification];
+}
+
+- (void)sdl_driverDistractionDidUpdate:(SDLRPCNotificationNotification *)notification {
+ SDLOnDriverDistraction *driverDistraction = notification.notification;
+
+ self.driverDistracted = [driverDistraction.state isEqualToEnum:SDLDriverDistractionStateOn];
+ [self sdl_postLockScreenStatus:self.lockScreenStatusNotification];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLogFileModuleMap.m b/SmartDeviceLink/SDLLogFileModuleMap.m
index a706cf152..3d25be5d9 100644
--- a/SmartDeviceLink/SDLLogFileModuleMap.m
+++ b/SmartDeviceLink/SDLLogFileModuleMap.m
@@ -17,7 +17,6 @@
[self sdl_tcpTransportModule],
[self sdl_iapTransportModule],
[self sdl_secondaryTransportModule],
- [self sdl_proxyModule],
[self sdl_protocolModule],
[self sdl_rpcModule],
[self sdl_dispatcherModule],
@@ -34,6 +33,7 @@
[self sdl_screenManagerModule],
[self sdl_screenManagerTextAndGraphicModule],
[self sdl_screenManagerSoftButtonModule],
+ [self sdl_screenManagerSubscribeButtonModule],
[self sdl_screenManagerMenuModule],
[self sdl_screenManagerChoiceSetModule],
[self sdl_utilitiesModule]]];
@@ -59,10 +59,6 @@
#pragma mark Low-Level
-+ (SDLLogFileModule *)sdl_proxyModule {
- return [SDLLogFileModule moduleWithName:@"Proxy" files:[NSSet setWithArray:@[@"SDLProxy", @"SDLPolicyDataParser", @"SDLCacheFileManager"]]];
-}
-
+ (SDLLogFileModule *)sdl_protocolModule {
return [SDLLogFileModule moduleWithName:@"Protocol" files:[NSSet setWithArray:@[@"SDLProtocol", @"SDLProtocolMessageAssembler", @"SDLProtocolMessageDisassembler", @"SDLProtocolReceivedMessageRouter", @"SDLV1ProtocolMessage", @"SDLV2ProtocolMessage", @"SDLV1ProtocolHeader", @"SDLV2ProtocolHeader", @"SDLGlobals"]]];
}
@@ -86,7 +82,7 @@
}
+ (SDLLogFileModule *)sdl_lifecycleManagerModule {
- return [SDLLogFileModule moduleWithName:@"Lifecycle" files:[NSSet setWithArray:@[@"SDLLifecycleManager", @"SDLManager", @"SDLAsynchronousOperation", @"SDLBackgroundTaskManager"]]];
+ return [SDLLogFileModule moduleWithName:@"Lifecycle" files:[NSSet setWithArray:@[@"SDLLifecycleManager", @"SDLManager", @"SDLAsynchronousOperation", @"SDLBackgroundTaskManager", @"SDLPolicyDataParser", @"SDLLifecycleProtocolHandler", @"SDLLifecycleRPCAdapter", @"SDLLifecycleSyncPDataHandler", @"SDLLifecycleSystemRequestHandler", @"SDLLifecycleMobileHMIStateHandler"]]];
}
+ (SDLLogFileModule *)sdl_systemCapabilityModule {
@@ -94,7 +90,7 @@
}
+ (SDLLogFileModule *)sdl_lockscreenManagerModule {
- return [SDLLogFileModule moduleWithName:@"Lockscreen" files:[NSSet setWithArray:@[@"SDLLockScreenManager", @"SDLLockScreenViewController", @"SDLLockScreenPresenter"]]];
+ return [SDLLogFileModule moduleWithName:@"Lockscreen" files:[NSSet setWithArray:@[@"SDLLockScreenManager", @"SDLLockScreenViewController", @"SDLLockScreenPresenter", @"SDLCacheFileManager", @"SDLLockScreenStatusManager"]]];
}
+ (SDLLogFileModule *)sdl_streamingMediaManagerModule {
@@ -129,6 +125,10 @@
return [SDLLogFileModule moduleWithName:@"Screen/SoftButton" files:[NSSet setWithArray:@[@"SDLSoftButtonManager", @"SDLSoftButtonObject", @"SDLSoftButtonState", @"SDLSoftButtonTransitionOperation", @"SDLSoftButtonReplaceOperation"]]];
}
++ (SDLLogFileModule *)sdl_screenManagerSubscribeButtonModule {
+ return [SDLLogFileModule moduleWithName:@"Screen/SubscribeButton" files:[NSSet setWithArray:@[@"SDLSubscribeButtonManager", @"SDLSubscribeButtonObserver"]]];
+}
+
+ (SDLLogFileModule *)sdl_screenManagerMenuModule {
return [SDLLogFileModule moduleWithName:@"Screen/Menu" files:[NSSet setWithArray:@[@"SDLMenuManager", @"SDLVoiceCommandManager"]]];
}
diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h
index 3e73385d3..ec0a45877 100644
--- a/SmartDeviceLink/SDLManager.h
+++ b/SmartDeviceLink/SDLManager.h
@@ -102,15 +102,6 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
*/
@property (copy, nonatomic, readonly) NSArray<__kindof NSOperation *> *pendingRPCTransactions;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-/**
-* Deprecated internal proxy object. This should only be accessed when the Manager is READY. This property may go to nil at any time.
-* All the other functionality exists on managers in sdl_ios 4.3+.
-*/
-@property (strong, nonatomic, readonly, nullable) SDLProxy *proxy;
-#pragma clang diagnostic pop
-
#pragma mark Lifecycle
diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m
index d835eba71..41fc1c927 100644
--- a/SmartDeviceLink/SDLManager.m
+++ b/SmartDeviceLink/SDLManager.m
@@ -42,7 +42,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Lifecycle
- (instancetype)init {
- return [self initWithConfiguration:[SDLConfiguration configurationWithLifecycle:[SDLLifecycleConfiguration defaultConfigurationWithAppName:@"SDL APP" fullAppId:@"001"] lockScreen:[SDLLockScreenConfiguration enabledConfiguration] logging:[SDLLogConfiguration defaultConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration]] delegate:nil];
+ return [self initWithConfiguration:[[SDLConfiguration alloc] initWithLifecycle:[SDLLifecycleConfiguration defaultConfigurationWithAppName:@"SDL APP" fullAppId:@"001"] lockScreen:[SDLLockScreenConfiguration enabledConfiguration] logging:[SDLLogConfiguration defaultConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration] encryption:nil] delegate:nil];
}
- (instancetype)initWithConfiguration:(SDLConfiguration *)configuration delegate:(nullable id<SDLManagerDelegate>)delegate {
@@ -118,13 +118,6 @@ NS_ASSUME_NONNULL_BEGIN
return self.lifecycleManager.rpcOperationQueue.operations;
}
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (nullable SDLProxy *)proxy {
- return self.lifecycleManager.proxy;
-}
-#pragma clang diagnostic pop
-
#pragma mark SDLConnectionManager Protocol
diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m
index 4d2d0737a..8cef8caef 100644
--- a/SmartDeviceLink/SDLMenuManager.m
+++ b/SmartDeviceLink/SDLMenuManager.m
@@ -665,7 +665,7 @@ UInt32 const MenuCellIdMin = 1;
submenuLayout = self.menuConfiguration.defaultSubmenuLayout;
}
- return [[SDLAddSubMenu alloc] initWithId:cell.cellId menuName:cell.title menuLayout:submenuLayout menuIcon:icon position:(UInt8)position];
+ return [[SDLAddSubMenu alloc] initWithMenuID:cell.cellId menuName:cell.title position:@(position) menuIcon:icon menuLayout:submenuLayout parentID:nil];
}
#pragma mark - Calling handlers
diff --git a/SmartDeviceLink/SDLMenuParams.m b/SmartDeviceLink/SDLMenuParams.m
index 0fcfbd60e..85cf5880a 100644
--- a/SmartDeviceLink/SDLMenuParams.m
+++ b/SmartDeviceLink/SDLMenuParams.m
@@ -35,11 +35,11 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)setParentID:(nullable NSNumber<SDLInt> *)parentID {
- [self.store sdl_setObject:parentID forName:SDLRPCParameterNameParentId];
+ [self.store sdl_setObject:parentID forName:SDLRPCParameterNameParentID];
}
- (nullable NSNumber<SDLInt> *)parentID {
- return [self.store sdl_objectForName:SDLRPCParameterNameParentId ofClass:NSNumber.class error:nil];
+ return [self.store sdl_objectForName:SDLRPCParameterNameParentID ofClass:NSNumber.class error:nil];
}
- (void)setPosition:(nullable NSNumber<SDLInt> *)position {
diff --git a/SmartDeviceLink/SDLNotificationConstants.h b/SmartDeviceLink/SDLNotificationConstants.h
index 06be369af..d99e0724c 100644
--- a/SmartDeviceLink/SDLNotificationConstants.h
+++ b/SmartDeviceLink/SDLNotificationConstants.h
@@ -118,6 +118,15 @@ extern SDLNotificationName const SDLTransportDidConnect;
/// Name for a error during connection notification
extern SDLNotificationName const SDLTransportConnectError;
+/// Name for a disconnection notification
+extern SDLNotificationName const SDLRPCServiceDidDisconnect;
+
+/// Name for a connection notification
+extern SDLNotificationName const SDLRPCServiceDidConnect;
+
+/// Name for a error during connection notification
+extern SDLNotificationName const SDLRPCServiceConnectionDidError;
+
/// Name for a general error notification
extern SDLNotificationName const SDLDidReceiveError;
@@ -130,6 +139,9 @@ extern SDLNotificationName const SDLDidBecomeReady;
/// Name for a notification sent by the user when their CarWindow view has been updated
extern SDLNotificationName const SDLDidUpdateProjectionView;
+/// Name for a LockScreenStatus notification RPC
+extern SDLNotificationName const SDLDidChangeLockScreenStatusNotification __deprecated_msg("This will be replaced in a future version where a fake RPC is not sent");
+
/**
* NSNotification names associated with specific RPC responses.
*/
@@ -306,6 +318,9 @@ extern SDLNotificationName const SDLDidReceiveSubscribeWaypointsResponse;
/// Name for a SyncPData response RPC
extern SDLNotificationName const SDLDidReceiveSyncPDataResponse __deprecated;
+/// Name for a SystemRequest response RPC
+extern SDLNotificationName const SDLDidReceiveSystemRequestResponse;
+
/// Name for an UpdateTurnList response RPC
extern SDLNotificationName const SDLDidReceiveUpdateTurnListResponse;
@@ -547,7 +562,7 @@ extern SDLNotificationName const SDLDidReceiveButtonPressNotification;
/// Name for a Command notification RPC
extern SDLNotificationName const SDLDidReceiveCommandNotification;
-/// Name for a EncodedData notification RPC
+/// Name for a EncodedSyncPData notification RPC
extern SDLNotificationName const SDLDidReceiveEncodedDataNotification __deprecated;
/// Name for a InteriorVehicleData notification RPC
@@ -559,9 +574,6 @@ extern SDLNotificationName const SDLDidReceiveKeyboardInputNotification;
/// Name for a Language notification RPC
extern SDLNotificationName const SDLDidChangeLanguageNotification;
-/// Name for a LockScreenStatus notification RPC
-extern SDLNotificationName const SDLDidChangeLockScreenStatusNotification __deprecated;
-
/// Name for a NewHash notification RPC
extern SDLNotificationName const SDLDidReceiveNewHashNotification;
diff --git a/SmartDeviceLink/SDLNotificationConstants.m b/SmartDeviceLink/SDLNotificationConstants.m
index 3f9fe3f1a..d4cb7c9bc 100644
--- a/SmartDeviceLink/SDLNotificationConstants.m
+++ b/SmartDeviceLink/SDLNotificationConstants.m
@@ -17,166 +17,170 @@ SDLNotificationUserInfoKey const SDLNotificationUserInfoObject = @"SDLNotificati
SDLNotificationName const SDLTransportDidDisconnect = @"com.sdl.transport.disconnect";
SDLNotificationName const SDLTransportDidConnect = @"com.sdl.transport.connect";
SDLNotificationName const SDLTransportConnectError = @"com.sdl.transport.connectError";
+SDLNotificationName const SDLRPCServiceDidDisconnect = @"com.sdl.rpcService.disconnect";
+SDLNotificationName const SDLRPCServiceDidConnect = @"com.sdl.rpcService.connect";
+SDLNotificationName const SDLRPCServiceConnectionDidError = @"com.sdl.rpcService.connectError";
SDLNotificationName const SDLDidReceiveError = @"com.sdl.general.error";
SDLNotificationName const SDLDidReceiveLockScreenIcon = @"com.sdl.general.lockscreenIconReceived";
SDLNotificationName const SDLDidBecomeReady = @"com.sdl.notification.managerReady";
SDLNotificationName const SDLDidReceiveVehicleIconNotification = @"com.sdl.notification.vehicleIcon";
SDLNotificationName const SDLDidUpdateProjectionView = @"com.sdl.notification.projectionViewUpdate";
+SDLNotificationName const SDLDidChangeLockScreenStatusNotification = @"com.sdl.notification.lockScreenStatus";
#pragma mark - RPC Responses
-SDLNotificationName const SDLDidReceiveAddCommandResponse = @"com.sdl.response.addCommand";
-SDLNotificationName const SDLDidReceiveAddSubMenuResponse = @"com.sdl.response.addSubMenu";
-SDLNotificationName const SDLDidReceiveAlertResponse = @"com.sdl.response.alert";
-SDLNotificationName const SDLDidReceiveAlertManeuverResponse = @"com.sdl.response.alertManeuver";
-SDLNotificationName const SDLDidReceiveButtonPressResponse = @"com.sdl.response.buttonPress";
-SDLNotificationName const SDLDidReceiveCancelInteractionResponse = @"com.sdl.response.cancelInteraction";
-SDLNotificationName const SDLDidReceiveChangeRegistrationResponse = @"com.sdl.response.changeRegistration";
-SDLNotificationName const SDLDidReceiveCloseApplicationResponse = @"com.sdl.response.closeApplication";
-SDLNotificationName const SDLDidReceiveCreateInteractionChoiceSetResponse = @"com.sdl.response.createInteractionChoiceSet";
-SDLNotificationName const SDLDidReceiveCreateWindowResponse = @"com.sdl.response.createWindow";
-SDLNotificationName const SDLDidReceiveDeleteCommandResponse = @"com.sdl.response.deleteCommand";
-SDLNotificationName const SDLDidReceiveDeleteFileResponse = @"com.sdl.response.deleteFile";
-SDLNotificationName const SDLDidReceiveDeleteInteractionChoiceSetResponse = @"com.sdl.response.deleteInteractionChoiceSet";
-SDLNotificationName const SDLDidReceiveDeleteSubmenuResponse = @"com.sdl.response.deleteSubmenu";
-SDLNotificationName const SDLDidReceiveDeleteWindowResponse = @"com.sdl.response.deleteWindow";
-SDLNotificationName const SDLDidReceiveDiagnosticMessageResponse = @"com.sdl.response.diagnosticMessage";
-SDLNotificationName const SDLDidReceiveDialNumberResponse = @"com.sdl.response.dialNumber";
-SDLNotificationName const SDLDidReceiveEncodedSyncPDataResponse = @"com.sdl.response.encodedSyncPData";
-SDLNotificationName const SDLDidReceiveEndAudioPassThruResponse = @"com.sdl.response.endAudioPassThru";
-SDLNotificationName const SDLDidReceiveGenericResponse = @"com.sdl.response.generic";
-SDLNotificationName const SDLDidReceiveGetCloudAppPropertiesResponse = @"com.sdl.response.getCloudAppProperties";
-SDLNotificationName const SDLDidReceiveGetAppServiceDataResponse = @"com.sdl.response.getAppServiceData";
-SDLNotificationName const SDLDidReceiveGetDTCsResponse = @"com.sdl.response.getDTCs";
-SDLNotificationName const SDLDidReceiveGetFileResponse = @"com.sdl.response.getFile";
-SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataResponse = @"com.sdl.response.getInteriorVehicleData";
-SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataConsentResponse = @"com.sdl.response.getInteriorVehicleDataConsent";
-SDLNotificationName const SDLDidReceiveGetSystemCapabilitiesResponse = @"com.sdl.response.getSystemCapabilities";
-SDLNotificationName const SDLDidReceiveGetVehicleDataResponse = @"com.sdl.response.getVehicleData";
-SDLNotificationName const SDLDidReceiveGetWaypointsResponse = @"com.sdl.response.getWaypoints";
-SDLNotificationName const SDLDidReceiveListFilesResponse = @"com.sdl.response.listFiles";
-SDLNotificationName const SDLDidReceivePerformAppServiceInteractionResponse = @"com.sdl.response.performAppServiceInteraction";
-SDLNotificationName const SDLDidReceivePerformAudioPassThruResponse = @"com.sdl.response.performAudioPassThru";
-SDLNotificationName const SDLDidReceivePerformInteractionResponse = @"com.sdl.response.performInteraction";
-SDLNotificationName const SDLDidReceivePublishAppServiceResponse = @"com.sdl.response.publishAppService";
-SDLNotificationName const SDLDidReceivePutFileResponse = @"com.sdl.response.putFile";
-SDLNotificationName const SDLDidReceiveReadDIDResponse = @"com.sdl.response.readDID";
-SDLNotificationName const SDLDidReceiveRegisterAppInterfaceResponse = @"com.sdl.response.registerAppInterface";
-SDLNotificationName const SDLDidReceiveReleaseInteriorVehicleDataModuleResponse = @"com.sdl.response.releaseInteriorVehicleDataModule";
-SDLNotificationName const SDLDidReceiveResetGlobalPropertiesResponse = @"com.sdl.response.resetGlobalProperties";
-SDLNotificationName const SDLDidReceiveScrollableMessageResponse = @"com.sdl.response.scrollableMessage";
-SDLNotificationName const SDLDidReceiveSendHapticDataResponse = @"com.sdl.response.sendHapticData";
-SDLNotificationName const SDLDidReceiveSendLocationResponse = @"com.sdl.response.sendLocation";
-SDLNotificationName const SDLDidReceiveSetAppIconResponse = @"com.sdl.response.setAppIcon";
-SDLNotificationName const SDLDidReceiveSetCloudAppPropertiesResponse = @"com.sdl.response.setCloudAppProperties";
-SDLNotificationName const SDLDidReceiveSetDisplayLayoutResponse = @"com.sdl.response.setDisplayLayout";
-SDLNotificationName const SDLDidReceiveSetGlobalPropertiesResponse = @"com.sdl.response.setGlobalProperties";
-SDLNotificationName const SDLDidReceiveSetInteriorVehicleDataResponse = @"com.sdl.response.setInteriorVehicleData";
-SDLNotificationName const SDLDidReceiveSetMediaClockTimerResponse = @"com.sdl.response.setMediaClockTimer";
-SDLNotificationName const SDLDidReceiveShowConstantTBTResponse = @"com.sdl.response.showConstantTBT";
-SDLNotificationName const SDLDidReceiveShowResponse = @"com.sdl.response.show";
-SDLNotificationName const SDLDidReceiveShowAppMenuResponse = @"com.sdl.response.showAppMenu";
-SDLNotificationName const SDLDidReceiveSliderResponse = @"com.sdl.response.slider";
-SDLNotificationName const SDLDidReceiveSpeakResponse = @"com.sdl.response.speak";
-SDLNotificationName const SDLDidReceiveSubscribeButtonResponse = @"com.sdl.response.subscribeButton";
-SDLNotificationName const SDLDidReceiveSubscribeVehicleDataResponse = @"com.sdl.response.subscribeVehicleData";
-SDLNotificationName const SDLDidReceiveSubscribeWaypointsResponse = @"com.sdl.response.subscribeWaypoints";
-SDLNotificationName const SDLDidReceiveSyncPDataResponse = @"com.sdl.response.syncPData";
-SDLNotificationName const SDLDidReceiveUpdateTurnListResponse = @"com.sdl.response.updateTurnList";
-SDLNotificationName const SDLDidReceiveUnpublishAppServiceResponse = @"com.sdl.response.unpublishAppService";
-SDLNotificationName const SDLDidReceiveUnregisterAppInterfaceResponse = @"com.sdl.response.unregisterAppInterface";
-SDLNotificationName const SDLDidReceiveUnsubscribeButtonResponse = @"com.sdl.response.unsubscribeButton";
-SDLNotificationName const SDLDidReceiveUnsubscribeVehicleDataResponse = @"com.sdl.response.unsubscribeVehicleData";
-SDLNotificationName const SDLDidReceiveUnsubscribeWaypointsResponse = @"com.sdl.response.unsubscribeWaypoints";
+SDLNotificationName const SDLDidReceiveAddCommandResponse = @"com.sdl.response.AddCommand";
+SDLNotificationName const SDLDidReceiveAddSubMenuResponse = @"com.sdl.response.AddSubMenu";
+SDLNotificationName const SDLDidReceiveAlertResponse = @"com.sdl.response.Alert";
+SDLNotificationName const SDLDidReceiveAlertManeuverResponse = @"com.sdl.response.AlertManeuver";
+SDLNotificationName const SDLDidReceiveButtonPressResponse = @"com.sdl.response.ButtonPress";
+SDLNotificationName const SDLDidReceiveCancelInteractionResponse = @"com.sdl.response.CancelInteraction";
+SDLNotificationName const SDLDidReceiveChangeRegistrationResponse = @"com.sdl.response.ChangeRegistration";
+SDLNotificationName const SDLDidReceiveCloseApplicationResponse = @"com.sdl.response.CloseApplication";
+SDLNotificationName const SDLDidReceiveCreateInteractionChoiceSetResponse = @"com.sdl.response.CreateInteractionChoiceSet";
+SDLNotificationName const SDLDidReceiveCreateWindowResponse = @"com.sdl.response.CreateWindow";
+SDLNotificationName const SDLDidReceiveDeleteCommandResponse = @"com.sdl.response.DeleteCommand";
+SDLNotificationName const SDLDidReceiveDeleteFileResponse = @"com.sdl.response.DeleteFile";
+SDLNotificationName const SDLDidReceiveDeleteInteractionChoiceSetResponse = @"com.sdl.response.DeleteInteractionChoiceSet";
+SDLNotificationName const SDLDidReceiveDeleteSubmenuResponse = @"com.sdl.response.DeleteSubMenu";
+SDLNotificationName const SDLDidReceiveDeleteWindowResponse = @"com.sdl.response.DeleteWindow";
+SDLNotificationName const SDLDidReceiveDiagnosticMessageResponse = @"com.sdl.response.DiagnosticMessage";
+SDLNotificationName const SDLDidReceiveDialNumberResponse = @"com.sdl.response.DialNumber";
+SDLNotificationName const SDLDidReceiveEncodedSyncPDataResponse = @"com.sdl.response.EncodedSyncPData";
+SDLNotificationName const SDLDidReceiveEndAudioPassThruResponse = @"com.sdl.response.EndAudioPassThru";
+SDLNotificationName const SDLDidReceiveGenericResponse = @"com.sdl.response.GenericResponse";
+SDLNotificationName const SDLDidReceiveGetCloudAppPropertiesResponse = @"com.sdl.response.GetCloudAppProperties";
+SDLNotificationName const SDLDidReceiveGetAppServiceDataResponse = @"com.sdl.response.GetAppServiceData";
+SDLNotificationName const SDLDidReceiveGetDTCsResponse = @"com.sdl.response.GetDTCs";
+SDLNotificationName const SDLDidReceiveGetFileResponse = @"com.sdl.response.GetFile";
+SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataResponse = @"com.sdl.response.GetInteriorVehicleData";
+SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataConsentResponse = @"com.sdl.response.GetInteriorVehicleDataConsent";
+SDLNotificationName const SDLDidReceiveGetSystemCapabilitiesResponse = @"com.sdl.response.GetSystemCapability";
+SDLNotificationName const SDLDidReceiveGetVehicleDataResponse = @"com.sdl.response.GetVehicleData";
+SDLNotificationName const SDLDidReceiveGetWaypointsResponse = @"com.sdl.response.GetWayPoints";
+SDLNotificationName const SDLDidReceiveListFilesResponse = @"com.sdl.response.ListFiles";
+SDLNotificationName const SDLDidReceivePerformAppServiceInteractionResponse = @"com.sdl.response.PerformAppServiceInteraction";
+SDLNotificationName const SDLDidReceivePerformAudioPassThruResponse = @"com.sdl.response.PerformAudioPassThru";
+SDLNotificationName const SDLDidReceivePerformInteractionResponse = @"com.sdl.response.PerformInteraction";
+SDLNotificationName const SDLDidReceivePublishAppServiceResponse = @"com.sdl.response.PublishAppService";
+SDLNotificationName const SDLDidReceivePutFileResponse = @"com.sdl.response.PutFile";
+SDLNotificationName const SDLDidReceiveReadDIDResponse = @"com.sdl.response.ReadDID";
+SDLNotificationName const SDLDidReceiveRegisterAppInterfaceResponse = @"com.sdl.response.RegisterAppInterface";
+SDLNotificationName const SDLDidReceiveReleaseInteriorVehicleDataModuleResponse = @"com.sdl.response.ReleaseInteriorVehicleDataModule";
+SDLNotificationName const SDLDidReceiveResetGlobalPropertiesResponse = @"com.sdl.response.ResetGlobalProperties";
+SDLNotificationName const SDLDidReceiveScrollableMessageResponse = @"com.sdl.response.ScrollableMessage";
+SDLNotificationName const SDLDidReceiveSendHapticDataResponse = @"com.sdl.response.SendHapticData";
+SDLNotificationName const SDLDidReceiveSendLocationResponse = @"com.sdl.response.SendLocation";
+SDLNotificationName const SDLDidReceiveSetAppIconResponse = @"com.sdl.response.SetAppIcon";
+SDLNotificationName const SDLDidReceiveSetCloudAppPropertiesResponse = @"com.sdl.response.SetCloudAppProperties";
+SDLNotificationName const SDLDidReceiveSetDisplayLayoutResponse = @"com.sdl.response.SetDisplayLayout";
+SDLNotificationName const SDLDidReceiveSetGlobalPropertiesResponse = @"com.sdl.response.SetGlobalProperties";
+SDLNotificationName const SDLDidReceiveSetInteriorVehicleDataResponse = @"com.sdl.response.SetInteriorVehicleData";
+SDLNotificationName const SDLDidReceiveSetMediaClockTimerResponse = @"com.sdl.response.SetMediaClockTimer";
+SDLNotificationName const SDLDidReceiveShowConstantTBTResponse = @"com.sdl.response.ShowConstantTBT";
+SDLNotificationName const SDLDidReceiveShowResponse = @"com.sdl.response.Show";
+SDLNotificationName const SDLDidReceiveShowAppMenuResponse = @"com.sdl.response.ShowAppMenu";
+SDLNotificationName const SDLDidReceiveSliderResponse = @"com.sdl.response.Slider";
+SDLNotificationName const SDLDidReceiveSpeakResponse = @"com.sdl.response.Speak";
+SDLNotificationName const SDLDidReceiveSubscribeButtonResponse = @"com.sdl.response.SubscribeButton";
+SDLNotificationName const SDLDidReceiveSubscribeVehicleDataResponse = @"com.sdl.response.SubscribeVehicleData";
+SDLNotificationName const SDLDidReceiveSubscribeWaypointsResponse = @"com.sdl.response.SubscribeWayPoints";
+SDLNotificationName const SDLDidReceiveSyncPDataResponse = @"com.sdl.response.SyncPData";
+SDLNotificationName const SDLDidReceiveSystemRequestResponse = @"com.sdl.response.SystemRequest";
+SDLNotificationName const SDLDidReceiveUpdateTurnListResponse = @"com.sdl.response.UpdateTurnList";
+SDLNotificationName const SDLDidReceiveUnpublishAppServiceResponse = @"com.sdl.response.UnpublishAppService";
+SDLNotificationName const SDLDidReceiveUnregisterAppInterfaceResponse = @"com.sdl.response.UnregisterAppInterface";
+SDLNotificationName const SDLDidReceiveUnsubscribeButtonResponse = @"com.sdl.response.UnsubscribeButton";
+SDLNotificationName const SDLDidReceiveUnsubscribeVehicleDataResponse = @"com.sdl.response.UnsubscribeVehicleData";
+SDLNotificationName const SDLDidReceiveUnsubscribeWaypointsResponse = @"com.sdl.response.UnsubscribeWayPoints";
#pragma mark - RPC Requests
-SDLNotificationName const SDLDidReceiveAddCommandRequest = @"com.sdl.request.addCommand";
-SDLNotificationName const SDLDidReceiveAddSubMenuRequest = @"com.sdl.request.addSubMenu";
-SDLNotificationName const SDLDidReceiveAlertRequest = @"com.sdl.request.alert";
-SDLNotificationName const SDLDidReceiveAlertManeuverRequest = @"com.sdl.request.alertManeuver";
-SDLNotificationName const SDLDidReceiveButtonPressRequest = @"com.sdl.request.buttonPress";
-SDLNotificationName const SDLDidReceiveCancelInteractionRequest = @"com.sdl.request.cancelInteraction";
-SDLNotificationName const SDLDidReceiveChangeRegistrationRequest = @"com.sdl.request.changeRegistration";
-SDLNotificationName const SDLDidReceiveCloseApplicationRequest = @"com.sdl.request.closeApplication";
-SDLNotificationName const SDLDidReceiveCreateWindowRequest = @"com.sdl.request.createWindow";
-SDLNotificationName const SDLDidReceiveCreateInteractionChoiceSetRequest = @"com.sdl.request.createInteractionChoiceSet";
-SDLNotificationName const SDLDidReceiveDeleteCommandRequest = @"com.sdl.request.deleteCommand";
-SDLNotificationName const SDLDidReceiveDeleteFileRequest = @"com.sdl.request.deleteFile";
-SDLNotificationName const SDLDidReceiveDeleteInteractionChoiceSetRequest = @"com.sdl.request.deleteInteractionChoiceSet";
-SDLNotificationName const SDLDidReceiveDeleteSubMenuRequest = @"com.sdl.request.deleteSubMenu";
-SDLNotificationName const SDLDidReceiveDeleteWindowRequest = @"com.sdl.request.deleteWindow";
-SDLNotificationName const SDLDidReceiveDiagnosticMessageRequest = @"com.sdl.request.diagnosticMessage";
-SDLNotificationName const SDLDidReceiveDialNumberRequest = @"com.sdl.request.dialNumber";
-SDLNotificationName const SDLDidReceiveEncodedSyncPDataRequest = @"com.sdl.request.encodedSyncPData";
-SDLNotificationName const SDLDidReceiveEndAudioPassThruRequest = @"com.sdl.request.endAudioPassThru";
-SDLNotificationName const SDLDidReceiveGetAppServiceDataRequest = @"com.sdl.request.getAppServiceData";
-SDLNotificationName const SDLDidReceiveGetCloudAppPropertiesRequest = @"com.sdl.request.getCloudAppProperties";
-SDLNotificationName const SDLDidReceiveGetDTCsRequest = @"com.sdl.request.getDTCs";
-SDLNotificationName const SDLDidReceiveGetFileRequest = @"com.sdl.request.getFile";
-SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataRequest = @"com.sdl.request.getInteriorVehicleData";
-SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataConsentRequest = @"com.sdl.request.getInteriorVehicleDataConsent";
-SDLNotificationName const SDLDidReceiveGetSystemCapabilityRequest = @"com.sdl.request.getSystemCapability";
-SDLNotificationName const SDLDidReceiveGetVehicleDataRequest = @"com.sdl.request.getVehicleData";
-SDLNotificationName const SDLDidReceiveGetWayPointsRequest = @"com.sdl.request.getWayPoints";
-SDLNotificationName const SDLDidReceiveListFilesRequest = @"com.sdl.request.listFiles";
-SDLNotificationName const SDLDidReceivePerformAppServiceInteractionRequest = @"com.sdl.request.performAppServiceInteraction";
-SDLNotificationName const SDLDidReceivePerformAudioPassThruRequest = @"com.sdl.request.performAudioPassThru";
-SDLNotificationName const SDLDidReceivePerformInteractionRequest = @"com.sdl.request.performInteraction";
-SDLNotificationName const SDLDidReceivePublishAppServiceRequest = @"com.sdl.request.publishAppService";
-SDLNotificationName const SDLDidReceivePutFileRequest = @"com.sdl.request.putFile";
-SDLNotificationName const SDLDidReceiveReadDIDRequest = @"com.sdl.request.readDID";
-SDLNotificationName const SDLDidReceiveRegisterAppInterfaceRequest = @"com.sdl.request.registerAppInterface";
-SDLNotificationName const SDLDidReceiveReleaseInteriorVehicleDataModuleRequest = @"com.sdl.request.releaseInteriorVehicleDataModule";
-SDLNotificationName const SDLDidReceiveResetGlobalPropertiesRequest = @"com.sdl.request.resetGlobalProperties";
-SDLNotificationName const SDLDidReceiveScrollableMessageRequest = @"com.sdl.request.scrollableMessage";
-SDLNotificationName const SDLDidReceiveSendHapticDataRequest = @"com.sdl.request.sendHapticData";
-SDLNotificationName const SDLDidReceiveSendLocationRequest = @"com.sdl.request.sendLocation";
-SDLNotificationName const SDLDidReceiveSetAppIconRequest = @"com.sdl.request.setAppIcon";
-SDLNotificationName const SDLDidReceiveSetCloudAppPropertiesRequest = @"com.sdl.request.setCloudAppProperties";
-SDLNotificationName const SDLDidReceiveSetDisplayLayoutRequest = @"com.sdl.request.setDisplayLayout";
-SDLNotificationName const SDLDidReceiveSetGlobalPropertiesRequest = @"com.sdl.request.setGlobalProperties";
-SDLNotificationName const SDLDidReceiveSetInteriorVehicleDataRequest = @"com.sdl.request.setInteriorVehicleData";
-SDLNotificationName const SDLDidReceiveSetMediaClockTimerRequest = @"com.sdl.request.setMediaClockTimer";
-SDLNotificationName const SDLDidReceiveShowRequest = @"com.sdl.request.show";
-SDLNotificationName const SDLDidReceiveShowAppMenuRequest = @"com.sdl.request.showAppMenu";
-SDLNotificationName const SDLDidReceiveShowConstantTBTRequest = @"com.sdl.request.showConstantTBT";
-SDLNotificationName const SDLDidReceiveSliderRequest = @"com.sdl.request.slider";
-SDLNotificationName const SDLDidReceiveSpeakRequest = @"com.sdl.request.speak";
-SDLNotificationName const SDLDidReceiveSubscribeButtonRequest = @"com.sdl.request.subscribeButton";
-SDLNotificationName const SDLDidReceiveSubscribeVehicleDataRequest = @"com.sdl.request.subscribeVehicleData";
-SDLNotificationName const SDLDidReceiveSubscribeWayPointsRequest = @"com.sdl.request.subscribeWayPoints";
-SDLNotificationName const SDLDidReceiveSyncPDataRequest = @"com.sdl.request.syncPData";
-SDLNotificationName const SDLDidReceiveSystemRequestRequest = @"com.sdl.request.systemRequest";
-SDLNotificationName const SDLDidReceiveUnpublishAppServiceRequest = @"com.sdl.request.unpublishAppService";
-SDLNotificationName const SDLDidReceiveUnregisterAppInterfaceRequest = @"com.sdl.request.unregisterAppInterface";
-SDLNotificationName const SDLDidReceiveUnsubscribeButtonRequest = @"com.sdl.request.unsubscribeButton";
-SDLNotificationName const SDLDidReceiveUnsubscribeVehicleDataRequest = @"com.sdl.request.unsubscribeVehicleData";
-SDLNotificationName const SDLDidReceiveUnsubscribeWayPointsRequest = @"com.sdl.request.unsubscribeWayPoints";
-SDLNotificationName const SDLDidReceiveUpdateTurnListRequest = @"com.sdl.request.updateTurnList";
+SDLNotificationName const SDLDidReceiveAddCommandRequest = @"com.sdl.request.AddCommand";
+SDLNotificationName const SDLDidReceiveAddSubMenuRequest = @"com.sdl.request.AddSubMenu";
+SDLNotificationName const SDLDidReceiveAlertRequest = @"com.sdl.request.Alert";
+SDLNotificationName const SDLDidReceiveAlertManeuverRequest = @"com.sdl.request.AlertManeuver";
+SDLNotificationName const SDLDidReceiveButtonPressRequest = @"com.sdl.request.ButtonPress";
+SDLNotificationName const SDLDidReceiveCancelInteractionRequest = @"com.sdl.request.CancelInteraction";
+SDLNotificationName const SDLDidReceiveChangeRegistrationRequest = @"com.sdl.request.ChangeRegistration";
+SDLNotificationName const SDLDidReceiveCloseApplicationRequest = @"com.sdl.request.CloseApplication";
+SDLNotificationName const SDLDidReceiveCreateWindowRequest = @"com.sdl.request.CreateWindow";
+SDLNotificationName const SDLDidReceiveCreateInteractionChoiceSetRequest = @"com.sdl.request.CreateInteractionChoiceSet";
+SDLNotificationName const SDLDidReceiveDeleteCommandRequest = @"com.sdl.request.DeleteCommand";
+SDLNotificationName const SDLDidReceiveDeleteFileRequest = @"com.sdl.request.DeleteFile";
+SDLNotificationName const SDLDidReceiveDeleteInteractionChoiceSetRequest = @"com.sdl.request.DeleteInteractionChoiceSet";
+SDLNotificationName const SDLDidReceiveDeleteSubMenuRequest = @"com.sdl.request.DeleteSubMenu";
+SDLNotificationName const SDLDidReceiveDeleteWindowRequest = @"com.sdl.request.DeleteWindow";
+SDLNotificationName const SDLDidReceiveDiagnosticMessageRequest = @"com.sdl.request.DiagnosticMessage";
+SDLNotificationName const SDLDidReceiveDialNumberRequest = @"com.sdl.request.DialNumber";
+SDLNotificationName const SDLDidReceiveEncodedSyncPDataRequest = @"com.sdl.request.EncodedSyncPData";
+SDLNotificationName const SDLDidReceiveEndAudioPassThruRequest = @"com.sdl.request.EndAudioPassThru";
+SDLNotificationName const SDLDidReceiveGetAppServiceDataRequest = @"com.sdl.request.GetAppServiceData";
+SDLNotificationName const SDLDidReceiveGetCloudAppPropertiesRequest = @"com.sdl.request.GetCloudAppProperties";
+SDLNotificationName const SDLDidReceiveGetDTCsRequest = @"com.sdl.request.GetDTCs";
+SDLNotificationName const SDLDidReceiveGetFileRequest = @"com.sdl.request.GetFile";
+SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataRequest = @"com.sdl.request.GetInteriorVehicleData";
+SDLNotificationName const SDLDidReceiveGetInteriorVehicleDataConsentRequest = @"com.sdl.request.GetInteriorVehicleDataConsent";
+SDLNotificationName const SDLDidReceiveGetSystemCapabilityRequest = @"com.sdl.request.GetSystemCapability";
+SDLNotificationName const SDLDidReceiveGetVehicleDataRequest = @"com.sdl.request.GetVehicleData";
+SDLNotificationName const SDLDidReceiveGetWayPointsRequest = @"com.sdl.request.GetWayPoints";
+SDLNotificationName const SDLDidReceiveListFilesRequest = @"com.sdl.request.ListFiles";
+SDLNotificationName const SDLDidReceivePerformAppServiceInteractionRequest = @"com.sdl.request.PerformAppServiceInteraction";
+SDLNotificationName const SDLDidReceivePerformAudioPassThruRequest = @"com.sdl.request.PerformAudioPassThru";
+SDLNotificationName const SDLDidReceivePerformInteractionRequest = @"com.sdl.request.PerformInteraction";
+SDLNotificationName const SDLDidReceivePublishAppServiceRequest = @"com.sdl.request.PublishAppService";
+SDLNotificationName const SDLDidReceivePutFileRequest = @"com.sdl.request.PutFile";
+SDLNotificationName const SDLDidReceiveReadDIDRequest = @"com.sdl.request.ReadDID";
+SDLNotificationName const SDLDidReceiveRegisterAppInterfaceRequest = @"com.sdl.request.RegisterAppInterface";
+SDLNotificationName const SDLDidReceiveReleaseInteriorVehicleDataModuleRequest = @"com.sdl.request.ReleaseInteriorVehicleDataModule";
+SDLNotificationName const SDLDidReceiveResetGlobalPropertiesRequest = @"com.sdl.request.ResetGlobalProperties";
+SDLNotificationName const SDLDidReceiveScrollableMessageRequest = @"com.sdl.request.ScrollableMessage";
+SDLNotificationName const SDLDidReceiveSendHapticDataRequest = @"com.sdl.request.SendHapticData";
+SDLNotificationName const SDLDidReceiveSendLocationRequest = @"com.sdl.request.SendLocation";
+SDLNotificationName const SDLDidReceiveSetAppIconRequest = @"com.sdl.request.SetAppIcon";
+SDLNotificationName const SDLDidReceiveSetCloudAppPropertiesRequest = @"com.sdl.request.SetCloudAppProperties";
+SDLNotificationName const SDLDidReceiveSetDisplayLayoutRequest = @"com.sdl.request.SetDisplayLayout";
+SDLNotificationName const SDLDidReceiveSetGlobalPropertiesRequest = @"com.sdl.request.SetGlobalProperties";
+SDLNotificationName const SDLDidReceiveSetInteriorVehicleDataRequest = @"com.sdl.request.SetInteriorVehicleData";
+SDLNotificationName const SDLDidReceiveSetMediaClockTimerRequest = @"com.sdl.request.SetMediaClockTimer";
+SDLNotificationName const SDLDidReceiveShowRequest = @"com.sdl.request.Show";
+SDLNotificationName const SDLDidReceiveShowAppMenuRequest = @"com.sdl.request.ShowAppMenu";
+SDLNotificationName const SDLDidReceiveShowConstantTBTRequest = @"com.sdl.request.ShowConstantTBT";
+SDLNotificationName const SDLDidReceiveSliderRequest = @"com.sdl.request.Slider";
+SDLNotificationName const SDLDidReceiveSpeakRequest = @"com.sdl.request.Speak";
+SDLNotificationName const SDLDidReceiveSubscribeButtonRequest = @"com.sdl.request.SubscribeButton";
+SDLNotificationName const SDLDidReceiveSubscribeVehicleDataRequest = @"com.sdl.request.SubscribeVehicleData";
+SDLNotificationName const SDLDidReceiveSubscribeWayPointsRequest = @"com.sdl.request.SubscribeWayPoints";
+SDLNotificationName const SDLDidReceiveSyncPDataRequest = @"com.sdl.request.SyncPData";
+SDLNotificationName const SDLDidReceiveSystemRequestRequest = @"com.sdl.request.SystemRequest";
+SDLNotificationName const SDLDidReceiveUnpublishAppServiceRequest = @"com.sdl.request.UnpublishAppService";
+SDLNotificationName const SDLDidReceiveUnregisterAppInterfaceRequest = @"com.sdl.request.UnregisterAppInterface";
+SDLNotificationName const SDLDidReceiveUnsubscribeButtonRequest = @"com.sdl.request.UnsubscribeButton";
+SDLNotificationName const SDLDidReceiveUnsubscribeVehicleDataRequest = @"com.sdl.request.UnsubscribeVehicleData";
+SDLNotificationName const SDLDidReceiveUnsubscribeWayPointsRequest = @"com.sdl.request.UnsubscribeWayPoints";
+SDLNotificationName const SDLDidReceiveUpdateTurnListRequest = @"com.sdl.request.UpdateTurnList";
#pragma mark - RPC Notifications
-SDLNotificationName const SDLDidChangeDriverDistractionStateNotification = @"com.sdl.notification.changeDriverDistractionStateNotification";
-SDLNotificationName const SDLDidChangeHMIStatusNotification = @"com.sdl.notification.changeHMIStatus";
-SDLNotificationName const SDLDidReceiveAppServiceDataNotification = @"com.sdl.notification.appServiceData";
-SDLNotificationName const SDLDidReceiveAppUnregisteredNotification = @"com.sdl.notification.appUnregistered";
-SDLNotificationName const SDLDidReceiveAudioPassThruNotification = @"com.sdl.notification.audioPassThru";
-SDLNotificationName const SDLDidReceiveButtonEventNotification = @"com.sdl.notification.buttonEvent";
-SDLNotificationName const SDLDidReceiveButtonPressNotification = @"com.sdl.notification.buttonPress";
-SDLNotificationName const SDLDidReceiveCommandNotification = @"com.sdl.notification.command";
-SDLNotificationName const SDLDidReceiveEncodedDataNotification = @"com.sdl.notification.encodedData";
-SDLNotificationName const SDLDidReceiveInteriorVehicleDataNotification = @"com.sdl.notification.interiorVehicleData";
-SDLNotificationName const SDLDidReceiveKeyboardInputNotification = @"com.sdl.notification.keyboardInput";
-SDLNotificationName const SDLDidChangeLanguageNotification = @"com.sdl.notification.changeLanguage";
-SDLNotificationName const SDLDidChangeLockScreenStatusNotification = @"com.sdl.notification.lockScreenStatus";
-SDLNotificationName const SDLDidReceiveNewHashNotification = @"com.sdl.notification.newHash";
-SDLNotificationName const SDLDidChangePermissionsNotification = @"com.sdl.notification.changePermission";
-SDLNotificationName const SDLDidReceiveRemoteControlStatusNotification = @"com.sdl.notification.rcStatus";
-SDLNotificationName const SDLDidReceiveSyncPDataNotification = @"com.sdl.notification.syncpdata";
-SDLNotificationName const SDLDidReceiveSystemCapabilityUpdatedNotification = @"com.sdl.notification.systemCapabilityUpdated";
-SDLNotificationName const SDLDidReceiveSystemRequestNotification = @"com.sdl.notification.receiveSystemRequest";
-SDLNotificationName const SDLDidChangeTurnByTurnStateNotification = @"com.sdl.notification.changeTurnByTurnState";
-SDLNotificationName const SDLDidReceiveTouchEventNotification = @"com.sdl.notification.touchEvent";
-SDLNotificationName const SDLDidReceiveVehicleDataNotification = @"com.sdl.notification.vehicleData";
-SDLNotificationName const SDLDidReceiveWaypointNotification = @"com.sdl.notification.waypoint";
+SDLNotificationName const SDLDidChangeDriverDistractionStateNotification = @"com.sdl.notification.OnDriverDistraction";
+SDLNotificationName const SDLDidChangeHMIStatusNotification = @"com.sdl.notification.OnHMIStatus";
+SDLNotificationName const SDLDidReceiveAppServiceDataNotification = @"com.sdl.notification.OnAppServiceData";
+SDLNotificationName const SDLDidReceiveAppUnregisteredNotification = @"com.sdl.notification.OnAppInterfaceUnregistered";
+SDLNotificationName const SDLDidReceiveAudioPassThruNotification = @"com.sdl.notification.OnAudioPassThru";
+SDLNotificationName const SDLDidReceiveButtonEventNotification = @"com.sdl.notification.OnButtonEvent";
+SDLNotificationName const SDLDidReceiveButtonPressNotification = @"com.sdl.notification.OnButtonPress";
+SDLNotificationName const SDLDidReceiveCommandNotification = @"com.sdl.notification.OnCommand";
+SDLNotificationName const SDLDidReceiveEncodedDataNotification = @"com.sdl.notification.OnEncodedSyncPData";
+SDLNotificationName const SDLDidReceiveInteriorVehicleDataNotification = @"com.sdl.notification.OnInteriorVehicleData";
+SDLNotificationName const SDLDidReceiveKeyboardInputNotification = @"com.sdl.notification.OnKeyboardInput";
+SDLNotificationName const SDLDidChangeLanguageNotification = @"com.sdl.notification.OnLanguageChange";
+SDLNotificationName const SDLDidReceiveNewHashNotification = @"com.sdl.notification.OnHashChange";
+SDLNotificationName const SDLDidChangePermissionsNotification = @"com.sdl.notification.OnPermissionsChange";
+SDLNotificationName const SDLDidReceiveRemoteControlStatusNotification = @"com.sdl.notification.OnRCStatus";
+SDLNotificationName const SDLDidReceiveSyncPDataNotification = @"com.sdl.notification.OnSyncPData";
+SDLNotificationName const SDLDidReceiveSystemCapabilityUpdatedNotification = @"com.sdl.notification.OnSystemCapabilityUpdated";
+SDLNotificationName const SDLDidReceiveSystemRequestNotification = @"com.sdl.notification.OnSystemRequest";
+SDLNotificationName const SDLDidChangeTurnByTurnStateNotification = @"com.sdl.notification.OnTBTClientState";
+SDLNotificationName const SDLDidReceiveTouchEventNotification = @"com.sdl.notification.OnTouchEvent";
+SDLNotificationName const SDLDidReceiveVehicleDataNotification = @"com.sdl.notification.OnVehicleData";
+SDLNotificationName const SDLDidReceiveWaypointNotification = @"com.sdl.notification.OnWayPointChange";
@implementation SDLNotificationConstants
@@ -245,6 +249,7 @@ SDLNotificationName const SDLDidReceiveWaypointNotification = @"com.sdl.notifica
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLDidReceiveSyncPDataResponse,
#pragma clang diagnostic pop
+ SDLDidReceiveSystemRequestResponse,
SDLDidReceiveUpdateTurnListResponse,
SDLDidReceiveUnpublishAppServiceResponse,
SDLDidReceiveUnregisterAppInterfaceResponse,
diff --git a/SmartDeviceLink/SDLNotificationDispatcher.h b/SmartDeviceLink/SDLNotificationDispatcher.h
index f820ddc91..a923879c0 100644
--- a/SmartDeviceLink/SDLNotificationDispatcher.h
+++ b/SmartDeviceLink/SDLNotificationDispatcher.h
@@ -8,8 +8,6 @@
#import <Foundation/Foundation.h>
-#import "SDLProxyListener.h"
-
@class SDLRPCRequest;
@class SDLRPCResponse;
@class SDLRPCNotification;
@@ -20,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
* The SDLNotificationDispatcher subscribes to SDLProxy notifications through SDLProxyListener and sends out actual NSNotifications with those contents. It can also be told to send out other types of notifications.
*/
-@interface SDLNotificationDispatcher : NSObject <SDLProxyListener>
+@interface SDLNotificationDispatcher : NSObject
/**
* Posts a notification with a specified name and object.
diff --git a/SmartDeviceLink/SDLNotificationDispatcher.m b/SmartDeviceLink/SDLNotificationDispatcher.m
index b1997c8a8..bd8ab7e7a 100644
--- a/SmartDeviceLink/SDLNotificationDispatcher.m
+++ b/SmartDeviceLink/SDLNotificationDispatcher.m
@@ -8,11 +8,12 @@
#import "SDLNotificationDispatcher.h"
-#import "SDLError.h"
#import "SDLNotificationConstants.h"
#import "SDLRPCNotification.h"
#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCRequest.h"
#import "SDLRPCRequestNotification.h"
+#import "SDLRPCResponse.h"
#import "SDLRPCResponseNotification.h"
NS_ASSUME_NONNULL_BEGIN
@@ -53,680 +54,6 @@ NS_ASSUME_NONNULL_BEGIN
[[NSNotificationCenter defaultCenter] postNotification:notification];
}
-#pragma mark - SDLProxyListener Delegate Methods
-
-- (void)onProxyOpened {
- [self postNotificationName:SDLTransportDidConnect infoObject:nil];
-}
-
-- (void)onProxyClosed {
- [self postNotificationName:SDLTransportDidDisconnect infoObject:nil];
-}
-
-- (void)onTransportError:(NSError *)error {
- [self postNotificationName:SDLTransportConnectError infoObject:error];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
-
-- (void)onOnHMIStatus:(SDLOnHMIStatus *)notification {
- [self postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:notification];
-}
-
-- (void)onOnDriverDistraction:(SDLOnDriverDistraction *)notification {
- [self postRPCNotificationNotification:SDLDidChangeDriverDistractionStateNotification notification:notification];
-}
-
-#pragma mark Optional Methods
-
-- (void)onError:(NSException *)e {
- NSError *error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:e.name andReason:e.reason];
- [self postNotificationName:SDLDidReceiveError infoObject:error];
-}
-
-# pragma mark - Responses
-
-- (void)onReceivedLockScreenIcon:(UIImage *)icon {
- [self postNotificationName:SDLDidReceiveLockScreenIcon infoObject:icon];
-}
-
-- (void)onAddCommandResponse:(SDLAddCommandResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveAddCommandResponse response:response];
-}
-
-- (void)onAddSubMenuResponse:(SDLAddSubMenuResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveAddSubMenuResponse response:response];
-}
-
-- (void)onAlertManeuverResponse:(SDLAlertManeuverResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveAlertManeuverResponse response:response];
-}
-
-- (void)onAlertResponse:(SDLAlertResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveAlertResponse response:response];
-}
-
-- (void)onButtonPressResponse:(SDLButtonPressResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveButtonPressResponse response:response];
-}
-
-- (void)onCancelInteractionResponse:(SDLCancelInteractionResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveCancelInteractionResponse response:response];
-}
-
-- (void)onChangeRegistrationResponse:(SDLChangeRegistrationResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveChangeRegistrationResponse response:response];
-}
-
-- (void)onCloseApplicationResponse:(SDLCloseApplicationResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveCloseApplicationResponse response:response];
-}
-
-- (void)onCreateInteractionChoiceSetResponse:(SDLCreateInteractionChoiceSetResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveCreateInteractionChoiceSetResponse response:response];
-}
-
-- (void)onCreateWindowResponse:(SDLCreateWindowResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveCreateWindowResponse response:response];
-}
-
-- (void)onDeleteCommandResponse:(SDLDeleteCommandResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDeleteCommandResponse response:response];
-}
-
-- (void)onDeleteFileResponse:(SDLDeleteFileResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDeleteFileResponse response:response];
-}
-
-- (void)onDeleteInteractionChoiceSetResponse:(SDLDeleteInteractionChoiceSetResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDeleteInteractionChoiceSetResponse response:response];
-}
-
-- (void)onDeleteSubMenuResponse:(SDLDeleteSubMenuResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDeleteSubmenuResponse response:response];
-}
-
-- (void)onDeleteWindowResponse:(SDLDeleteWindowResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDeleteWindowResponse response:response];
-}
-
-- (void)onDiagnosticMessageResponse:(SDLDiagnosticMessageResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDiagnosticMessageResponse response:response];
-}
-
-- (void)onDialNumberResponse:(SDLDialNumberResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveDialNumberResponse response:response];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onEncodedSyncPDataResponse:(SDLEncodedSyncPDataResponse *)response {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCResponseNotification:SDLDidReceiveEncodedSyncPDataResponse response:response];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
-- (void)onEndAudioPassThruResponse:(SDLEndAudioPassThruResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveEndAudioPassThruResponse response:response];
-}
-
-- (void)onGenericResponse:(SDLGenericResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGenericResponse response:response];
-}
-
-- (void)onGetCloudAppPropertiesResponse:(SDLGetCloudAppPropertiesResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetCloudAppPropertiesResponse response:response];
-}
-
-- (void)onGetAppServiceDataResponse:(SDLGetAppServiceDataResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetAppServiceDataResponse response:response];
-}
-
-- (void)onGetDTCsResponse:(SDLGetDTCsResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetDTCsResponse response:response];
-}
-
-- (void)onGetFileResponse:(SDLGetFileResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetFileResponse response:response];
-}
-
-- (void)onGetInteriorVehicleDataResponse:(SDLGetInteriorVehicleDataResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetInteriorVehicleDataResponse response:response];
-}
-
-- (void)onGetInteriorVehicleDataConsentResponse:(SDLGetInteriorVehicleDataConsentResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetInteriorVehicleDataConsentResponse response:response];
-}
-
-- (void)onGetSystemCapabilityResponse:(SDLGetSystemCapabilityResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetSystemCapabilitiesResponse response:response];
-}
-
-- (void)onGetVehicleDataResponse:(SDLGetVehicleDataResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetVehicleDataResponse response:response];
-}
-
-- (void)onGetWayPointsResponse:(SDLGetWayPointsResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveGetWaypointsResponse response:response];
-}
-
-- (void)onListFilesResponse:(SDLListFilesResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveListFilesResponse response:response];
-}
-
-- (void)onPerformAppServiceInteractionResponse:(SDLPerformAppServiceInteractionResponse *)response {
- [self postRPCResponseNotification:SDLDidReceivePerformAppServiceInteractionResponse response:response];
-}
-
-- (void)onPerformAudioPassThruResponse:(SDLPerformAudioPassThruResponse *)response {
- [self postRPCResponseNotification:SDLDidReceivePerformAudioPassThruResponse response:response];
-}
-
-- (void)onPerformInteractionResponse:(SDLPerformInteractionResponse *)response {
- [self postRPCResponseNotification:SDLDidReceivePerformInteractionResponse response:response];
-}
-
-- (void)onPublishAppServiceResponse:(SDLPublishAppServiceResponse *)response {
- [self postRPCResponseNotification:SDLDidReceivePublishAppServiceResponse response:response];
-}
-
-- (void)onPutFileResponse:(SDLPutFileResponse *)response {
- [self postRPCResponseNotification:SDLDidReceivePutFileResponse response:response];
-}
-
-- (void)onReadDIDResponse:(SDLReadDIDResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveReadDIDResponse response:response];
-}
-
-- (void)onRegisterAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveRegisterAppInterfaceResponse response:response];
-}
-
-- (void)onReleaseInteriorVehicleDataModuleResponse:(SDLReleaseInteriorVehicleDataModuleResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveReleaseInteriorVehicleDataModuleResponse response:response];
-}
-
-- (void)onResetGlobalPropertiesResponse:(SDLResetGlobalPropertiesResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveResetGlobalPropertiesResponse response:response];
-}
-
-- (void)onScrollableMessageResponse:(SDLScrollableMessageResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveScrollableMessageResponse response:response];
-}
-
-- (void)onSendHapticDataResponse:(SDLSendHapticDataResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSendHapticDataResponse response:response];
-}
-
-- (void)onSendLocationResponse:(SDLSendLocationResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSendLocationResponse response:response];
-}
-
-- (void)onSetAppIconResponse:(SDLSetAppIconResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSetAppIconResponse response:response];
-}
-
-- (void)onSetCloudAppPropertiesResponse:(SDLSetCloudAppPropertiesResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSetCloudAppPropertiesResponse response:response];
-}
-
-- (void)onSetDisplayLayoutResponse:(SDLSetDisplayLayoutResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSetDisplayLayoutResponse response:response];
-}
-
-- (void)onSetGlobalPropertiesResponse:(SDLSetGlobalPropertiesResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSetGlobalPropertiesResponse response:response];
-}
-
-- (void)onSetInteriorVehicleDataResponse:(SDLSetInteriorVehicleDataResponse *)response{
- [self postRPCResponseNotification:SDLDidReceiveSetInteriorVehicleDataResponse response:response];
-}
-
-- (void)onSetMediaClockTimerResponse:(SDLSetMediaClockTimerResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSetMediaClockTimerResponse response:response];
-}
-
-- (void)onShowConstantTBTResponse:(SDLShowConstantTBTResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveShowConstantTBTResponse response:response];
-}
-
-- (void)onShowResponse:(SDLShowResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveShowResponse response:response];
-}
-
-- (void)onShowAppMenuResponse:(SDLShowAppMenuResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveShowAppMenuResponse response:response];
-}
-
-- (void)onSliderResponse:(SDLSliderResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSliderResponse response:response];
-}
-
-- (void)onSpeakResponse:(SDLSpeakResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSpeakResponse response:response];
-}
-
-- (void)onSubscribeButtonResponse:(SDLSubscribeButtonResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSubscribeButtonResponse response:response];
-}
-
-- (void)onSubscribeVehicleDataResponse:(SDLSubscribeVehicleDataResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSubscribeVehicleDataResponse response:response];
-}
-
-- (void)onSubscribeWayPointsResponse:(SDLSubscribeWayPointsResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveSubscribeWaypointsResponse response:response];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onSyncPDataResponse:(SDLSyncPDataResponse *)response {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCResponseNotification:SDLDidReceiveSyncPDataResponse response:response];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
-- (void)onUpdateTurnListResponse:(SDLUpdateTurnListResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveUpdateTurnListResponse response:response];
-}
-
-- (void)onUnpublishAppServiceResponse:(SDLUnpublishAppServiceResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveUnpublishAppServiceResponse response:response];
-}
-
-- (void)onUnregisterAppInterfaceResponse:(SDLUnregisterAppInterfaceResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveUnregisterAppInterfaceResponse response:response];
-}
-
-- (void)onUnsubscribeButtonResponse:(SDLUnsubscribeButtonResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveUnsubscribeButtonResponse response:response];
-}
-
-- (void)onUnsubscribeVehicleDataResponse:(SDLUnsubscribeVehicleDataResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveUnsubscribeVehicleDataResponse response:response];
-}
-
-- (void)onUnsubscribeWayPointsResponse:(SDLUnsubscribeWayPointsResponse *)response {
- [self postRPCResponseNotification:SDLDidReceiveUnsubscribeWaypointsResponse response:response];
-}
-
-# pragma mark - Requests
-
-- (void)onAddCommand:(SDLAddCommand *)request {
- [self postRPCRequestNotification:SDLDidReceiveAddCommandRequest request:request];
-}
-
-- (void)onAddSubMenu:(SDLAddSubMenu *)request {
- [self postRPCRequestNotification:SDLDidReceiveAddSubMenuRequest request:request];
-}
-
-- (void)onAlert:(SDLAlert *)request {
- [self postRPCRequestNotification:SDLDidReceiveAlertRequest request:request];
-}
-
-- (void)onAlertManeuver:(SDLAlertManeuver *)request {
- [self postRPCRequestNotification:SDLDidReceiveAlertManeuverRequest request:request];
-}
-
-- (void)onButtonPress:(SDLButtonPress *)request {
- [self postRPCRequestNotification:SDLDidReceiveButtonPressRequest request:request];
-}
-
-- (void)onCancelInteraction:(SDLCancelInteraction *)request {
- [self postRPCRequestNotification:SDLDidReceiveCancelInteractionRequest request:request];
-}
-
-- (void)onChangeRegistration:(SDLChangeRegistration *)request {
- [self postRPCRequestNotification:SDLDidReceiveChangeRegistrationRequest request:request];
-}
-
-- (void)onCloseApplication:(SDLCloseApplication *)request {
- [self postRPCRequestNotification:SDLDidReceiveCloseApplicationRequest request:request];
-}
-
-- (void)onCreateInteractionChoiceSet:(SDLCreateInteractionChoiceSet *)request {
- [self postRPCRequestNotification:SDLDidReceiveCreateInteractionChoiceSetRequest request:request];
-}
-
-- (void)onCreateWindow:(SDLCreateWindow *)request {
- [self postRPCRequestNotification:SDLDidReceiveCreateWindowRequest request:request];
-}
-
-- (void)onDeleteCommand:(SDLDeleteCommand *)request {
- [self postRPCRequestNotification:SDLDidReceiveDeleteCommandRequest request:request];
-}
-
-- (void)onDeleteFile:(SDLDeleteFile *)request {
- [self postRPCRequestNotification:SDLDidReceiveDeleteFileRequest request:request];
-}
-
-- (void)onDeleteInteractionChoiceSet:(SDLDeleteInteractionChoiceSet *)request {
- [self postRPCRequestNotification:SDLDidReceiveDeleteInteractionChoiceSetRequest request:request];
-}
-
-- (void)onDeleteSubMenu:(SDLDeleteSubMenu *)request {
- [self postRPCRequestNotification:SDLDidReceiveDeleteSubMenuRequest request:request];
-}
-
-- (void)onDeleteWindow:(SDLDeleteWindow *)request {
- [self postRPCRequestNotification:SDLDidReceiveDeleteWindowRequest request:request];
-}
-
-- (void)onDiagnosticMessage:(SDLDiagnosticMessage *)request {
- [self postRPCRequestNotification:SDLDidReceiveDiagnosticMessageRequest request:request];
-}
-
-- (void)onDialNumber:(SDLDialNumber *)request {
- [self postRPCRequestNotification:SDLDidReceiveDialNumberRequest request:request];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onEncodedSyncPData:(SDLEncodedSyncPData *)request {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCRequestNotification:SDLDidReceiveEncodedSyncPDataRequest request:request];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
-- (void)onEndAudioPassThru:(SDLEndAudioPassThru *)request {
- [self postRPCRequestNotification:SDLDidReceiveEndAudioPassThruRequest request:request];
-}
-
-- (void)onGetAppServiceData:(SDLGetAppServiceData *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetAppServiceDataRequest request:request];
-}
-
-- (void)onGetCloudAppProperties:(SDLGetCloudAppProperties *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetCloudAppPropertiesRequest request:request];
-}
-
-- (void)onGetDTCs:(SDLGetDTCs *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetDTCsRequest request:request];
-}
-
-- (void)onGetFile:(SDLGetFile *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetFileRequest request:request];
-}
-
-- (void)onGetInteriorVehicleData:(SDLGetInteriorVehicleData *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetInteriorVehicleDataRequest request:request];
-}
-
-- (void)onGetInteriorVehicleDataConsent:(SDLGetInteriorVehicleDataConsent *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetInteriorVehicleDataConsentRequest request:request];
-}
-
-- (void)onGetSystemCapability:(SDLGetSystemCapability *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetSystemCapabilityRequest request:request];
-}
-
-- (void)onGetVehicleData:(SDLGetVehicleData *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetVehicleDataRequest request:request];
-}
-
-- (void)onGetWayPoints:(SDLGetWayPoints *)request {
- [self postRPCRequestNotification:SDLDidReceiveGetWayPointsRequest request:request];
-}
-
-- (void)onListFiles:(SDLListFiles *)request {
- [self postRPCRequestNotification:SDLDidReceiveListFilesRequest request:request];
-}
-
-- (void)onPerformAppServiceInteraction:(SDLPerformAppServiceInteraction *)request {
- [self postRPCRequestNotification:SDLDidReceivePerformAppServiceInteractionRequest request:request];
-}
-
-- (void)onPerformAudioPassThru:(SDLPerformAudioPassThru *)request {
- [self postRPCRequestNotification:SDLDidReceivePerformAudioPassThruRequest request:request];
-}
-
-- (void)onPerformInteraction:(SDLPerformInteraction *)request {
- [self postRPCRequestNotification:SDLDidReceivePerformInteractionRequest request:request];
-}
-
-- (void)onPublishAppService:(SDLPublishAppService *)request {
- [self postRPCRequestNotification:SDLDidReceivePublishAppServiceRequest request:request];
-}
-
-- (void)onPutFile:(SDLPutFile *)request {
- [self postRPCRequestNotification:SDLDidReceivePutFileRequest request:request];
-}
-
-- (void)onReadDID:(SDLReadDID *)request {
- [self postRPCRequestNotification:SDLDidReceiveReadDIDRequest request:request];
-}
-
-- (void)onRegisterAppInterface:(SDLRegisterAppInterface *)request {
- [self postRPCRequestNotification:SDLDidReceiveRegisterAppInterfaceRequest request:request];
-}
-
-- (void)onReleaseInteriorVehicleDataModule:(SDLReleaseInteriorVehicleDataModule *)request {
- [self postRPCRequestNotification:SDLDidReceiveReleaseInteriorVehicleDataModuleRequest request:request];
-}
-
-- (void)onResetGlobalProperties:(SDLResetGlobalProperties *)request {
- [self postRPCRequestNotification:SDLDidReceiveResetGlobalPropertiesRequest request:request];
-}
-
-- (void)onScrollableMessage:(SDLScrollableMessage *)request {
- [self postRPCRequestNotification:SDLDidReceiveScrollableMessageRequest request:request];
-}
-
-- (void)onSendHapticData:(SDLSendHapticData *)request {
- [self postRPCRequestNotification:SDLDidReceiveSendHapticDataRequest request:request];
-}
-
-- (void)onSendLocation:(SDLSendLocation *)request {
- [self postRPCRequestNotification:SDLDidReceiveSendLocationRequest request:request];
-}
-
-- (void)onSetAppIcon:(SDLSetAppIcon *)request {
- [self postRPCRequestNotification:SDLDidReceiveSetAppIconRequest request:request];
-}
-
-- (void)onSetCloudAppProperties:(SDLSetCloudAppProperties *)request {
- [self postRPCRequestNotification:SDLDidReceiveSetCloudAppPropertiesRequest request:request];
-}
-
-- (void)onSetDisplayLayout:(SDLSetDisplayLayout *)request {
- [self postRPCRequestNotification:SDLDidReceiveSetDisplayLayoutRequest request:request];
-}
-
-- (void)onSetGlobalProperties:(SDLSetGlobalProperties *)request {
- [self postRPCRequestNotification:SDLDidReceiveSetGlobalPropertiesRequest request:request];
-}
-
-- (void)onSetInteriorVehicleData:(SDLSetInteriorVehicleData *)request {
- [self postRPCRequestNotification:SDLDidReceiveSetInteriorVehicleDataRequest request:request];
-}
-
-- (void)onSetMediaClockTimer:(SDLSetMediaClockTimer *)request {
- [self postRPCRequestNotification:SDLDidReceiveSetMediaClockTimerRequest request:request];
-}
-
-- (void)onShow:(SDLShow *)request {
- [self postRPCRequestNotification:SDLDidReceiveShowRequest request:request];
-}
-
-- (void)onShowAppMenu:(SDLShowAppMenu *)request {
- [self postRPCRequestNotification:SDLDidReceiveShowAppMenuRequest request:request];
-}
-
-- (void)onShowConstantTBT:(SDLShowConstantTBT *)request {
- [self postRPCRequestNotification:SDLDidReceiveShowConstantTBTRequest request:request];
-}
-
-- (void)onSlider:(SDLSlider *)request {
- [self postRPCRequestNotification:SDLDidReceiveSliderRequest request:request];
-}
-
-- (void)onSpeak:(SDLSpeak *)request {
- [self postRPCRequestNotification:SDLDidReceiveSpeakRequest request:request];
-}
-
-- (void)onSubscribeButton:(SDLSubscribeButton *)request {
- [self postRPCRequestNotification:SDLDidReceiveSubscribeButtonRequest request:request];
-}
-
-- (void)onSubscribeVehicleData:(SDLSubscribeVehicleData *)request {
- [self postRPCRequestNotification:SDLDidReceiveSubscribeVehicleDataRequest request:request];
-}
-
-- (void)onSubscribeWayPoints:(SDLSubscribeWayPoints *)request {
- [self postRPCRequestNotification:SDLDidReceiveSubscribeWayPointsRequest request:request];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onSyncPData:(SDLSyncPData *)request {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCRequestNotification:SDLDidReceiveSyncPDataRequest request:request];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
--(void)onSystemRequest:(SDLSystemRequest *)request {
- [self postRPCRequestNotification:SDLDidReceiveSystemRequestRequest request:request];
-}
-
-- (void)onUnpublishAppService:(SDLUnpublishAppService *)request {
- [self postRPCRequestNotification:SDLDidReceiveUnpublishAppServiceRequest request:request];
-}
-
-- (void)onUnregisterAppInterface:(SDLUnregisterAppInterface *)request {
- [self postRPCRequestNotification:SDLDidReceiveUnregisterAppInterfaceRequest request:request];
-}
-
-- (void)onUnsubscribeButton:(SDLUnsubscribeButton *)request {
- [self postRPCRequestNotification:SDLDidReceiveUnsubscribeButtonRequest request:request];
-}
-
-- (void)onUnsubscribeVehicleData:(SDLUnsubscribeVehicleData *)request {
- [self postRPCRequestNotification:SDLDidReceiveUnsubscribeVehicleDataRequest request:request];
-}
-
-- (void)onUnsubscribeWayPoints:(SDLUnsubscribeWayPoints *)request {
- [self postRPCRequestNotification:SDLDidReceiveUnsubscribeWayPointsRequest request:request];
-}
-
-- (void)onUpdateTurnList:(SDLUpdateTurnList *)request {
- [self postRPCRequestNotification:SDLDidReceiveUpdateTurnListRequest request:request];
-}
-
-# pragma mark - Notifications
-
-- (void)onOnAppInterfaceUnregistered:(SDLOnAppInterfaceUnregistered *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveAppUnregisteredNotification notification:notification];
-}
-
-- (void)onOnAppServiceData:(SDLOnAppServiceData *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveAppServiceDataNotification notification:notification];
-}
-
-- (void)onOnAudioPassThru:(SDLOnAudioPassThru *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveAudioPassThruNotification notification:notification];
-}
-
-- (void)onOnButtonEvent:(SDLOnButtonEvent *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveButtonEventNotification notification:notification];
-}
-
-- (void)onOnButtonPress:(SDLOnButtonPress *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveButtonPressNotification notification:notification];
-}
-
-- (void)onOnCommand:(SDLOnCommand *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveCommandNotification notification:notification];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onOnEncodedSyncPData:(SDLOnEncodedSyncPData *)notification {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCNotificationNotification:SDLDidReceiveEncodedDataNotification notification:notification];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
-- (void)onOnHashChange:(SDLOnHashChange *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveNewHashNotification notification:notification];
-}
-
-- (void)onOnInteriorVehicleData:(SDLOnInteriorVehicleData *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveInteriorVehicleDataNotification notification:notification];
-}
-
-- (void)onOnKeyboardInput:(SDLOnKeyboardInput *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveKeyboardInputNotification notification:notification];
-}
-
-- (void)onOnLanguageChange:(SDLOnLanguageChange *)notification {
- [self postRPCNotificationNotification:SDLDidChangeLanguageNotification notification:notification];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onOnLockScreenNotification:(SDLOnLockScreenStatus *)notification {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCNotificationNotification:SDLDidChangeLockScreenStatusNotification notification:notification];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
-- (void)onOnPermissionsChange:(SDLOnPermissionsChange *)notification {
- [self postRPCNotificationNotification:SDLDidChangePermissionsNotification notification:notification];
-}
-
-- (void)onOnRCStatus:(SDLOnRCStatus *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveRemoteControlStatusNotification notification:notification];
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-implementations"
-- (void)onOnSyncPData:(SDLOnSyncPData *)notification {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self postRPCNotificationNotification:SDLDidReceiveSyncPDataNotification notification:notification];
-#pragma clang diagnostic pop
-}
-#pragma clang diagnostic pop
-
-- (void)onOnSystemCapabilityUpdated:(SDLOnSystemCapabilityUpdated *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveSystemCapabilityUpdatedNotification notification:notification];
-}
-
-- (void)onOnSystemRequest:(SDLOnSystemRequest *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveSystemRequestNotification notification:notification];
-}
-
-- (void)onOnTBTClientState:(SDLOnTBTClientState *)notification {
- [self postRPCNotificationNotification:SDLDidChangeTurnByTurnStateNotification notification:notification];
-}
-
-- (void)onOnTouchEvent:(SDLOnTouchEvent *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveTouchEventNotification notification:notification];
-}
-
-- (void)onOnVehicleData:(SDLOnVehicleData *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveVehicleDataNotification notification:notification];
-}
-
-- (void)onOnWayPointChange:(SDLOnWayPointChange *)notification {
- [self postRPCNotificationNotification:SDLDidReceiveWaypointNotification notification:notification];
-}
-
-#pragma clang diagnostic pop
-
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLOnVehicleData.h b/SmartDeviceLink/SDLOnVehicleData.h
index bd48b9112..9d3dd25b0 100644
--- a/SmartDeviceLink/SDLOnVehicleData.h
+++ b/SmartDeviceLink/SDLOnVehicleData.h
@@ -36,13 +36,11 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLOnVehicleData : SDLRPCNotification
/**
- * Convenience init.
+ * Initializes an instance of the SDLOnVehicleData class
*
* @param gps - gps
* @param speed - @(speed)
* @param rpm - rpm
- * @param fuelLevel - @(fuelLevel)
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - @(instantFuelConsumption)
* @param fuelRange - fuelRange
* @param externalTemperature - @(externalTemperature)
@@ -68,9 +66,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModeStatus - clusterModeStatus
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLOnVehicleData object
*/
-- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm fuelLevel:(float)fuelLevel fuelLevel_State:(nullable SDLComponentVolumeStatus)fuelLevel_State instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey;
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID 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;
/**
The car current Gear Status
@@ -95,12 +94,12 @@ NS_ASSUME_NONNULL_BEGIN
/**
The fuel level in the tank (percentage)
*/
-@property (nullable, strong, nonatomic) NSNumber<SDLFloat> *fuelLevel;
+@property (strong, nonatomic, nullable) NSNumber<SDLFloat> *fuelLevel __deprecated_msg("use fuelRange.level instead on 7.0+ RPC version connections");
/**
The fuel level state
*/
-@property (nullable, strong, nonatomic) SDLComponentVolumeStatus fuelLevel_State;
+@property (strong, nonatomic, nullable) SDLComponentVolumeStatus fuelLevel_State __deprecated_msg("use fuelRange.levelState instead on 7.0+ RPC version connections");
/**
The estimate range in KM the vehicle can travel based on fuel level and consumption
@@ -165,6 +164,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) SDLWiperStatus wiperStatus;
/**
+ To indicate whether driver hands are off the steering wheel
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *handsOffSteering;
+
+/**
Status of the head lamps
*/
@property (nullable, strong, nonatomic) SDLHeadLampStatus *headLampStatus;
@@ -231,7 +235,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.
-
+
@param vehicleDataName The name of the OEM custom vehicle data item.
@param vehicleDataState An object containing the OEM custom vehicle data item.
@@ -241,7 +245,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.
-
+
@param vehicleDataName The name of the OEM custom vehicle data item.
@return An OEM custom vehicle data object for the given vehicle data name.
diff --git a/SmartDeviceLink/SDLOnVehicleData.m b/SmartDeviceLink/SDLOnVehicleData.m
index 6deba2239..914a6246f 100644
--- a/SmartDeviceLink/SDLOnVehicleData.m
+++ b/SmartDeviceLink/SDLOnVehicleData.m
@@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma clang diagnostic pop
-- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm fuelLevel:(float)fuelLevel fuelLevel_State:(nullable SDLComponentVolumeStatus)fuelLevel_State instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID eCallInfo:(nullable SDLECallInfo *)eCallInfo airbagStatus:(nullable SDLAirbagStatus *)airbagStatus emergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent clusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus myKey:(nullable SDLMyKey *)myKey {
+- (instancetype)initWithGps:(nullable SDLGPSData *)gps speed:(float)speed rpm:(nullable NSNumber<SDLUInt> *)rpm instantFuelConsumption:(float)instantFuelConsumption fuelRange:(nullable NSArray<SDLFuelRange *> *)fuelRange externalTemperature:(float)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:(float)engineTorque accPedalPosition:(float)accPedalPosition steeringWheelAngle:(float)steeringWheelAngle engineOilLife:(float)engineOilLife electronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus cloudAppVehicleID:(nullable NSString *)cloudAppVehicleID 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 {
self = [self init];
if (!self) {
return nil;
@@ -43,8 +43,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = @(speed);
self.rpm = rpm;
- self.fuelLevel = @(fuelLevel);
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = @(instantFuelConsumption);
self.fuelRange = fuelRange;
self.externalTemperature = @(externalTemperature);
@@ -70,6 +68,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -330,6 +329,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSObject.class error:nil];
}
+- (void)setHandsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable NSNumber<SDLBool> *)handsOffSteering {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:NSNumber.class error:&error];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionConstants.h b/SmartDeviceLink/SDLPermissionConstants.h
index 05b528bfd..8c7c1f0da 100644
--- a/SmartDeviceLink/SDLPermissionConstants.h
+++ b/SmartDeviceLink/SDLPermissionConstants.h
@@ -10,6 +10,8 @@
#import "NSNumber+NumberType.h"
#import "SDLRPCFunctionNames.h"
+#import "SDLPermissionElement.h"
+#import "SDLRPCPermissionStatus.h"
NS_ASSUME_NONNULL_BEGIN
@@ -60,19 +62,19 @@ typedef NS_ENUM(NSUInteger, SDLPermissionGroupStatus) {
};
/**
- * The PermissionObserver is a block that is passed in to some methods that will be stored and called when specified permissions change.
+ * This is a block that is passed in to some methods that will be stored and called when specified permissions change.
*
- * @param change A dictionary of permission changes containing <key(String): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed>
- * @param status The change made to all of the RPCs in the changedDict. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed
+ * @param updatedPermissionStatuses A dictionary of the new current status of all subscription items; containing <key(String): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed>
+ * @param status The unified group status of the RPCs in the updatedPermissionStatuses dictionary. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed
*/
-typedef void (^SDLPermissionsChangedHandler)(NSDictionary<SDLPermissionRPCName, NSNumber *> *_Nonnull change, SDLPermissionGroupStatus status);
+typedef void (^SDLPermissionsChangedHandler)(NSDictionary<SDLPermissionRPCName, NSNumber *> *_Nonnull updatedPermissionStatuses, SDLPermissionGroupStatus status);
/**
- * The SDLObservedPermissionsChangedHandler is a block that is passed in to subscribeToRPCNames:groupType:withHandler: that will be stored and called when specified permissions change.
+ * 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.
*
- * @param change A dictionary of permission changes containing <key(SDLRPCFunctionName): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed>
- * @param status The change made to all of the RPCs in the changedDict. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed
+ * @param updatedPermissionStatuses A dictionary of the new current status of all subscription items; containing <key(String): SDLPermissionRPCName, object(SDLRPCPermissionStatus)>
+ * @param status The unified group status of the RPCs in the updatedPermissionStatuses dictionary. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed
*/
-typedef void (^SDLSubscribedPermissionsChangedHandler)(NSDictionary<SDLRPCFunctionName, NSNumber *> *_Nonnull change, SDLPermissionGroupStatus status);
+typedef void (^SDLRPCPermissionStatusChangedHandler)(NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *_Nonnull updatedPermissionStatuses, SDLPermissionGroupStatus status);
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionElement.h b/SmartDeviceLink/SDLPermissionElement.h
new file mode 100644
index 000000000..3edffe0c6
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionElement.h
@@ -0,0 +1,42 @@
+//
+// SDLPermissionElement.h
+// SmartDeviceLink
+//
+// Created by James Lapinski on 6/21/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLParameterPermissions.h"
+#import "SDLRPCFunctionNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// An object containing the RPC name and its parameter names that should be checked when checking permissions
+@interface SDLPermissionElement : NSObject <NSCopying>
+
+/**
+ * Name of the individual RPC.
+ * Required
+ */
+@property (strong, nonatomic) SDLRPCFunctionName rpcName;
+
+/**
+ * RPC parameters for the individual RPC
+ */
+@property (strong, nonatomic, nullable) NSArray<NSString *> *parameterPermissions;
+
+/**
+ * Creates a new permission element.
+ *
+ * @param rpcName The name of the RPC.
+ * @param parameterPermissions An array parameters for the RPC that should be checked if they are allowed. Note that not all head units may provide this data. If no parameter data is received, we assume that the parameter is not allowed.
+ *
+ * @return An instance of `SDLPermissionElement`.
+ */
+- (instancetype)initWithRPCName:(SDLRPCFunctionName)rpcName parameterPermissions:(nullable NSArray<NSString *> *)parameterPermissions;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionElement.m b/SmartDeviceLink/SDLPermissionElement.m
new file mode 100644
index 000000000..ea2aa6e4e
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionElement.m
@@ -0,0 +1,41 @@
+//
+// SDLPermissionElement.m
+// SmartDeviceLink
+//
+// Created by James Lapinski on 6/21/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLPermissionElement.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLPermissionElement
+
+- (instancetype)initWithRPCName:(SDLRPCFunctionName)rpcName parameterPermissions:(nullable NSArray<NSString *> *)parameterPermissions {
+ self = [super init];
+ if (!self) { return nil; }
+
+ self.rpcName = rpcName;
+ self.parameterPermissions = parameterPermissions;
+
+ return self;
+}
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLPermissionElement *newElement = [[self.class allocWithZone:zone] initWithRPCName:[_rpcName copyWithZone:zone] parameterPermissions:[_parameterPermissions copyWithZone:zone]];
+
+ return newElement;
+}
+
+#pragma mark - Description
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"RPC name: %@, parameter permissions: %@", self.rpcName, self.parameterPermissions];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionFilter.h b/SmartDeviceLink/SDLPermissionFilter.h
index f31666bec..e733d2331 100644
--- a/SmartDeviceLink/SDLPermissionFilter.h
+++ b/SmartDeviceLink/SDLPermissionFilter.h
@@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>
#import "SDLPermissionConstants.h"
+#import "SDLPermissionElement.h"
NS_ASSUME_NONNULL_BEGIN
@@ -21,11 +22,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (copy, nonatomic, readonly) SDLPermissionObserverIdentifier identifier;
/**
- * All of the RPC names in this filter group.
- */
-@property (copy, nonatomic, readonly) NSArray<SDLPermissionRPCName> *rpcNames;
-
-/**
* The type of this filter group.
*/
@property (assign, nonatomic, readonly) SDLPermissionGroupType groupType;
@@ -36,7 +32,20 @@ NS_ASSUME_NONNULL_BEGIN
@property (copy, nonatomic, readonly) SDLPermissionsChangedHandler handler;
/**
- * Create a new permission filter group.
+ * The block that will be called on status changes to RPC permission status objects
+ */
+@property (copy, nonatomic, readonly) SDLRPCPermissionStatusChangedHandler rpcPermissionStatusHandler;
+
+/**
+ * All of the permission elements in this filter group.
+ */
+@property (copy, nonatomic, readonly) NSArray<SDLPermissionElement *> *permissionElements;
+
+/// Initializer unavailable
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * Create a new permission filter group with a SDLPermissionsChangedHandler.
*
* @param rpcNames The names of the RPCs to watch permissions of.
* @param groupType The type of notifications to be sent for this filter group.
@@ -44,18 +53,18 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return An instance of `SDLPermissionFilter`.
*/
-- (instancetype)initWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)handler NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupType:(SDLPermissionGroupType)groupType permissionsHandler:(SDLPermissionsChangedHandler)handler;
/**
- * Create a new permission filter group.
+ * Create a new permission filter group with a SDLRPCPermissionStatusChangedHandler.
*
- * @param rpcNames The names of the RPCs to watch permissions of.
+ * @param rpcNames The names of the RPCs to watch permissions of.
* @param groupType The type of notifications to be sent for this filter group.
- * @param handler The block observer to be called when changes occur.
+ * @param permissionStatusHandler The block observer to be called when changes occur.
*
* @return An instance of `SDLPermissionFilter`.
*/
-+ (instancetype)filterWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)handler NS_SWIFT_UNAVAILABLE("Use the initializer");
+- (instancetype)initWithPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupType:(SDLPermissionGroupType)groupType permissionStatusHandler:(SDLRPCPermissionStatusChangedHandler)permissionStatusHandler;
/**
* Whether the current filter is equivalent with another filter or not.
@@ -66,6 +75,15 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (BOOL)isEqualToFilter:(SDLPermissionFilter *)otherFilter;
+/**
+ * Converts an array of SDLPermissionElement objects to an array of SDLPermissionRPCName objects
+ *
+ * @param permissionElements The permission elements to convert.
+ *
+ * @return An array of SDLPermissionRPCName objects
+ */
+- (NSArray<SDLPermissionRPCName> *)rpcNamesFromPermissionElements:(NSArray<SDLPermissionElement *> *)permissionElements;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionFilter.m b/SmartDeviceLink/SDLPermissionFilter.m
index 0d142b3a3..c2ed47a3e 100644
--- a/SmartDeviceLink/SDLPermissionFilter.m
+++ b/SmartDeviceLink/SDLPermissionFilter.m
@@ -11,46 +11,59 @@
NS_ASSUME_NONNULL_BEGIN
-
@implementation SDLPermissionFilter
#pragma mark - Lifecycle
-- (instancetype)init {
- return [self initWithRPCNames:@[]
- groupType:SDLPermissionGroupTypeAny
- observer:^(NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *_Nonnull change, SDLPermissionGroupStatus status){
- }];
-}
-
-- (instancetype)initWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)observer {
+- (instancetype)initWithPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupType:(SDLPermissionGroupType)groupType permissionsHandler:(SDLPermissionsChangedHandler)observer {
self = [super init];
if (!self) {
return nil;
}
_identifier = [NSUUID UUID];
- _rpcNames = rpcNames;
+ _permissionElements = rpcNames;
_groupType = groupType;
_handler = observer;
return self;
}
-+ (instancetype)filterWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)observer {
- return [[self alloc] initWithRPCNames:rpcNames groupType:groupType observer:observer];
+- (instancetype)initWithPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupType:(SDLPermissionGroupType)groupType permissionStatusHandler:(SDLRPCPermissionStatusChangedHandler)permissionStatusHandler {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _identifier = [NSUUID UUID];
+ _permissionElements = rpcNames;
+ _groupType = groupType;
+ _rpcPermissionStatusHandler = permissionStatusHandler;
+
+ return self;
+}
+
+#pragma mark - Helpers
+
+- (NSArray<SDLPermissionRPCName> *)rpcNamesFromPermissionElements:(NSArray<SDLPermissionElement *> *)permissionElements {
+ NSMutableArray *rpcNames = [[NSMutableArray alloc] init];
+ for (SDLPermissionElement *element in permissionElements) {
+ [rpcNames addObject:element.rpcName];
+ }
+
+ return [rpcNames copy];
}
#pragma mark - NSCopying
- (id)copyWithZone:(nullable NSZone *)zone {
- SDLPermissionFilter *newFilter = [[self.class allocWithZone:zone] initWithRPCNames:[_rpcNames copyWithZone:zone] groupType:_groupType observer:[_handler copyWithZone:zone]];
+ SDLPermissionFilter *newFilter = [[self.class allocWithZone:zone] initWithPermissions:[_permissionElements copyWithZone:zone] groupType:_groupType permissionsHandler:[_handler copyWithZone:zone]];
newFilter->_identifier = _identifier;
+ newFilter->_rpcPermissionStatusHandler = _rpcPermissionStatusHandler;
return newFilter;
}
+
#pragma mark - Equality
- (BOOL)isEqual:(id)object {
@@ -73,7 +86,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Description
- (NSString *)description {
- return [NSString stringWithFormat:@"identifier: %@, group type: %@, rpcs: %@", self.identifier, @(self.groupType), self.rpcNames];
+ return [NSString stringWithFormat:@"Permission Filter Identifier: %@, group type: %@, RPCs: %@", self.identifier, @(self.groupType), self.permissionElements];
}
@end
diff --git a/SmartDeviceLink/SDLPermissionManager.h b/SmartDeviceLink/SDLPermissionManager.h
index 873bf23c7..4a1fc4577 100644
--- a/SmartDeviceLink/SDLPermissionManager.h
+++ b/SmartDeviceLink/SDLPermissionManager.h
@@ -11,6 +11,7 @@
#import "SDLHMILevel.h"
#import "SDLPermissionConstants.h"
#import "SDLRPCFunctionNames.h"
+#import "SDLRPCPermissionStatus.h"
@class SDLPermissionItem;
@class SDLRPCMessage;
@@ -62,7 +63,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return AllAllowed if all of the permissions are allowed, AllDisallowed if all the permissions are disallowed, Any if some are allowed, and some are disallowed
*/
-- (SDLPermissionGroupStatus)groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames __deprecated_msg(("Use groupStatusOfRPCNames: instead"));
+- (SDLPermissionGroupStatus)groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames __deprecated_msg(("Use groupStatusOfRPCPermissions: instead"));
/**
* Determine if all RPCs are allowed for the current HMI level
@@ -71,7 +72,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return AllAllowed if all of the permissions are allowed, AllDisallowed if all the permissions are disallowed, Any if some are allowed, and some are disallowed
*/
-- (SDLPermissionGroupStatus)groupStatusOfRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames;
+- (SDLPermissionGroupStatus)groupStatusOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames;
/**
* 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
@@ -80,16 +81,16 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return A dictionary specifying if the passed in RPC names are currently allowed or not
*/
-- (NSDictionary<SDLPermissionRPCName, NSNumber *> *)statusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames __deprecated_msg(("Use statusesOfRPCNames: instead"));
+- (NSDictionary<SDLPermissionRPCName, NSNumber *> *)statusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames __deprecated_msg(("Use statusesOfRPCPermissions: instead"));
/**
* 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
*
- * @param rpcNames An array of RPC names to check
+ * @param rpcNames An array of permission elements to check
*
- * @return A dictionary specifying if the passed in RPC names are currently allowed or not
+ * @return A dictionary with specific RPC info contained in a SDLRPCPermissionStatus
*/
-- (NSDictionary<SDLRPCFunctionName, NSNumber *> *)statusesOfRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames;
+- (NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *)statusesOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames;
/**
* Add an observer for specified RPC names, with a callback that will be called whenever the value changes, as well as immediately with the current status.
@@ -104,20 +105,20 @@ NS_ASSUME_NONNULL_BEGIN
*
* @return An identifier that can be passed to removeObserverForIdentifer: to remove the observer
*/
-- (SDLPermissionObserverIdentifier)addObserverForRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(SDLPermissionsChangedHandler)handler __deprecated_msg(("Use subscribeToRPCNames:groupType:withHandler: instead"));
+- (SDLPermissionObserverIdentifier)addObserverForRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(SDLPermissionsChangedHandler)handler __deprecated_msg(("Use subscribeToRPCPermissions:groupType:withHandler: instead"));
/**
* Subscribe to specified RPC names, with a callback that will be called whenever the value changes. Unlike addObserverForRPCs:groupType:withHandler:, 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. That could send `nil` to removeObserverForIdentifier:. If you want functionality like that, call groupStatusOfRPCs: instead.
*
- * @param rpcNames The RPCs to be observed
+ * @param permissionElements The permission elements to be observed
* @param groupType Affects the times that the observer block will be called. If Any, any change to any RPC in rpcNames will cause the observer block to be called. If AllAllowed, the block will be called when: 1. Every RPC in rpcNames becomes allowed 2. The group of rpcNames goes from all being allowed to some or all being disallowed.
* @param handler The block that will be called whenever permissions change.
*
* @return An identifier that can be passed to removeObserverForIdentifer: to remove the observer
*/
-- (SDLPermissionObserverIdentifier)subscribeToRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(SDLSubscribedPermissionsChangedHandler)handler;
+- (SDLPermissionObserverIdentifier)subscribeToRPCPermissions:(NSArray<SDLPermissionElement *> *)permissionElements groupType:(SDLPermissionGroupType)groupType withHandler:(SDLRPCPermissionStatusChangedHandler)handler;
/**
* Remove every current observer
@@ -142,6 +143,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (BOOL)rpcNameRequiresEncryption:(SDLRPCFunctionName)rpcName;
+/**
+ * Check whether a parameter of an RPC is allowed
+ *
+ * @param rpcName The name of the RPC to be tested, for example, SDLRPCFunctionNameGetVehicleData
+ * @param parameter The name of the parameter to be tested, for example, rpm
+ *
+ * @return True if the parameter is allowed, false if it is not
+ */
+- (BOOL)isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionManager.m b/SmartDeviceLink/SDLPermissionManager.m
index 310dca0b2..aa9f14bf0 100644
--- a/SmartDeviceLink/SDLPermissionManager.m
+++ b/SmartDeviceLink/SDLPermissionManager.m
@@ -12,6 +12,7 @@
#import "SDLNotificationConstants.h"
#import "SDLOnHMIStatus.h"
#import "SDLOnPermissionsChange.h"
+#import "SDLParameterPermissions.h"
#import "SDLPermissionFilter.h"
#import "SDLPermissionItem.h"
#import "SDLPredefinedWindows.h"
@@ -70,27 +71,31 @@ NS_ASSUME_NONNULL_BEGIN
}
- (BOOL)isRPCNameAllowed:(SDLRPCFunctionName)rpcName {
- if (self.permissions[rpcName] == nil || self.currentHMILevel == nil) {
+ return [self.class isRPCNameAllowed:rpcName permissions:self.permissions hmiLevel:self.currentHMILevel];
+}
+
++ (BOOL)isRPCNameAllowed:(SDLRPCFunctionName)rpcName permissions:(NSDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel)hmiLevel {
+ if (permissions[rpcName] == nil || hmiLevel == nil) {
return NO;
}
- SDLPermissionItem *item = self.permissions[rpcName];
- return [item.hmiPermissions.allowed containsObject:self.currentHMILevel];
+ SDLPermissionItem *item = permissions[rpcName];
+ return [item.hmiPermissions.allowed containsObject:hmiLevel];
}
- (SDLPermissionGroupStatus)groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames {
- return [self groupStatusOfRPCNames:rpcNames];
+ return [self groupStatusOfRPCPermissions:[self sdl_createPermissionElementsFromRPCNames:rpcNames]];
}
-- (SDLPermissionGroupStatus)groupStatusOfRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames {
+- (SDLPermissionGroupStatus)groupStatusOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames {
if (self.currentHMILevel == nil) {
return SDLPermissionGroupStatusUnknown;
}
- return [self.class sdl_groupStatusOfRPCs:rpcNames withPermissions:[self.permissions copy] hmiLevel:self.currentHMILevel];
+ return [self.class sdl_groupStatusOfRPCPermissions:rpcNames withPermissions:[self.permissions copy] hmiLevel:self.currentHMILevel];
}
-+ (SDLPermissionGroupStatus)sdl_groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames withPermissions:(NSDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel)hmiLevel {
++ (SDLPermissionGroupStatus)sdl_groupStatusOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames withPermissions:(NSDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel)hmiLevel {
// If we don't have an HMI level, then just say everything is disallowed
if (hmiLevel == nil) {
return SDLPermissionGroupStatusUnknown;
@@ -100,7 +105,9 @@ NS_ASSUME_NONNULL_BEGIN
BOOL hasDisallowed = NO;
// Loop through all the RPCs we need to check
- for (NSString *rpcName in rpcNames) {
+ for (SDLPermissionElement *permissionElement in rpcNames) {
+ NSString *rpcName = permissionElement.rpcName;
+
// If at this point in the loop, we have both allowed and disallowed RPCs, return the mixed result
if (hasAllowed && hasDisallowed) {
return SDLPermissionGroupStatusMixed;
@@ -118,6 +125,16 @@ NS_ASSUME_NONNULL_BEGIN
} else {
hasDisallowed = YES;
}
+
+ if (permissionElement.parameterPermissions != nil) {
+ for (NSString *parameter in permissionElement.parameterPermissions) {
+ if ([self.class sdl_isPermissionParameterAllowed:permissionElement.rpcName parameter:parameter permissionItems:permissions hmiLevel:hmiLevel]) {
+ hasAllowed = YES;
+ } else {
+ hasDisallowed = YES;
+ }
+ }
+ }
}
if (hasAllowed && hasDisallowed) {
@@ -130,15 +147,28 @@ NS_ASSUME_NONNULL_BEGIN
}
- (NSDictionary<SDLPermissionRPCName, NSNumber *> *)statusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames {
- return [self statusesOfRPCNames:rpcNames];
+ NSArray *permissionElementsArray = [self sdl_createPermissionElementsFromRPCNames:rpcNames];
+
+ // Convert the dictionary returned from statusesOfRPCNames: to the correct return type
+ return [self sdl_convertPermissionsStatusDictionaryToPermissionsBoolDictionary:[self statusesOfRPCPermissions:permissionElementsArray]];
}
-- (NSDictionary<SDLRPCFunctionName,NSNumber *> *)statusesOfRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames {
- NSMutableDictionary<SDLRPCFunctionName, NSNumber *> *permissionAllowedDict = [NSMutableDictionary dictionary];
-
- for (SDLRPCFunctionName rpcName in rpcNames) {
- BOOL allowed = [self isRPCNameAllowed:rpcName];
- permissionAllowedDict[rpcName] = @(allowed);
+- (NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *)statusesOfRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames {
+ NSMutableDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *permissionAllowedDict = [NSMutableDictionary dictionary];
+
+ for (SDLPermissionElement *permissionElement in rpcNames) {
+ if (permissionElement == nil) { continue; }
+
+ NSMutableDictionary<NSString *, NSNumber *> *rpcParameters = [NSMutableDictionary dictionary];
+ if (permissionElement.parameterPermissions != nil) {
+ for (NSString *permissionParameter in permissionElement.parameterPermissions) {
+ BOOL isParameterAllowed = [self.class sdl_isPermissionParameterAllowed:permissionElement.rpcName parameter:permissionParameter permissionItems:self.permissions hmiLevel:self.currentHMILevel];
+ rpcParameters[permissionParameter] = @(isParameterAllowed);
+ }
+ }
+
+ SDLRPCPermissionStatus *permissionStatus = [[SDLRPCPermissionStatus alloc] initWithRPCName:permissionElement.rpcName isRPCAllowed:[self isRPCNameAllowed:permissionElement.rpcName] rpcParameters:rpcParameters];
+ permissionAllowedDict[permissionElement.rpcName] = permissionStatus;
}
return [permissionAllowedDict copy];
@@ -150,7 +180,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Add Observers
- (SDLPermissionObserverIdentifier)addObserverForRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(nonnull SDLPermissionsChangedHandler)handler {
- SDLPermissionFilter *filter = [SDLPermissionFilter filterWithRPCNames:rpcNames groupType:groupType observer:handler];
+ SDLPermissionFilter *filter = [[SDLPermissionFilter alloc] initWithPermissions:[self sdl_createPermissionElementsFromRPCNames:rpcNames] groupType:groupType permissionsHandler:handler];
// Store the filter for later use
[self.filters addObject:filter];
@@ -161,14 +191,14 @@ NS_ASSUME_NONNULL_BEGIN
return filter.identifier;
}
-- (SDLPermissionObserverIdentifier)subscribeToRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(SDLPermissionsChangedHandler)handler {
- SDLPermissionFilter *filter = [SDLPermissionFilter filterWithRPCNames:rpcNames groupType:groupType observer:handler];
+- (SDLPermissionObserverIdentifier)subscribeToRPCPermissions:(NSArray<SDLPermissionElement *> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(SDLRPCPermissionStatusChangedHandler)handler {
+ SDLPermissionFilter *filter = [[SDLPermissionFilter alloc] initWithPermissions:rpcNames groupType:groupType permissionStatusHandler:handler];
// Store the filter for later use
[self.filters addObject:filter];
// Check permission status and group type to see if we need to call handler immediately after setting the observer
- SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCNames:filter.rpcNames];
+ SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCPermissions:filter.permissionElements];
if ((groupType == SDLPermissionGroupTypeAny) || (groupType == SDLPermissionGroupTypeAllAllowed && permissionStatus == SDLPermissionGroupStatusAllowed)) {
[self sdl_callFilterObserver:filter];
}
@@ -177,10 +207,15 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdl_callFilterObserver:(SDLPermissionFilter *)filter {
- SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCNames:filter.rpcNames];
- NSDictionary<SDLPermissionRPCName, NSNumber *> *allowedDict = [self statusesOfRPCNames:filter.rpcNames];
-
- filter.handler(allowedDict, permissionStatus);
+ SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCPermissions:filter.permissionElements];
+
+ if (filter.rpcPermissionStatusHandler != nil) {
+ NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *allowedDict = [self statusesOfRPCPermissions:filter.permissionElements];
+ filter.rpcPermissionStatusHandler(allowedDict, permissionStatus);
+ } else if (filter.handler != nil) {
+ NSDictionary<SDLRPCFunctionName, NSNumber *> *allowedDict = [self sdl_convertPermissionsStatusDictionaryToPermissionsBoolDictionary:[self statusesOfRPCPermissions:filter.permissionElements]];
+ filter.handler(allowedDict, permissionStatus);
+ }
}
#pragma mark Remove Observers
@@ -230,7 +265,7 @@ NS_ASSUME_NONNULL_BEGIN
for (SDLPermissionFilter *filter in modifiedFilters) {
if (filter.groupType == SDLPermissionGroupTypeAllAllowed) {
SDLPermissionGroupStatus oldStatus = [allAllowedFiltersWithOldStatus[filter.identifier] unsignedIntegerValue];
- SDLPermissionGroupStatus newStatus = [self groupStatusOfRPCNames:filter.rpcNames];
+ SDLPermissionGroupStatus newStatus = [self groupStatusOfRPCPermissions:filter.permissionElements];
// We've already eliminated the case where the permissions could stay the same, so if the permissions changed *to* allowed or *away* from allowed, we need to call the observer.
if (newStatus == SDLPermissionGroupStatusAllowed || oldStatus == SDLPermissionGroupStatusAllowed) {
@@ -260,7 +295,7 @@ NS_ASSUME_NONNULL_BEGIN
if (hmiStatus.windowID != nil && hmiStatus.windowID.integerValue != SDLPredefinedWindowsDefaultWindow) {
return;
}
-
+
SDLHMILevel oldHMILevel = [self.currentHMILevel copy];
self.currentHMILevel = hmiStatus.hmiLevel;
NSArray<SDLPermissionFilter *> *filters = [self.filters copy];
@@ -288,6 +323,39 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Helper Methods
/**
+ * HAX: Remove this when statusOfRPCs: is no longer supported. Converts a dictionary from <SDLRPCFunctionName, SDLRPCPermissionStatus*> to <SDLPermissionRPCName, NSNumber *>.
+ *
+ * @param permissionStatusDictionary The dictionary containing <SDLRPCFunctionName, SDLRPCPermissionStatus*> to convert.
+ *
+ * @return A <SDLPermissionRPCName, NSNumber *> dictionary.
+ */
+- (NSDictionary<SDLPermissionRPCName, NSNumber *> *)sdl_convertPermissionsStatusDictionaryToPermissionsBoolDictionary:(NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus*> *)permissionStatusDictionary {
+ NSMutableDictionary *rpcNameDictionary = [[NSMutableDictionary alloc] init];
+ [permissionStatusDictionary enumerateKeysAndObjectsUsingBlock:^(SDLRPCFunctionName _Nonnull key, SDLRPCPermissionStatus * _Nonnull obj, BOOL * _Nonnull stop) {
+ [rpcNameDictionary setObject:@(obj.rpcAllowed) forKey:key];
+ }];
+
+ return rpcNameDictionary;
+}
+
+/**
+ * Converts an array of RPC name strings to permission elements.
+ *
+ * @param rpcNames The RPC names to convert.
+ *
+ * @return An array of permission elements.
+ */
+- (NSArray<SDLPermissionElement *> *)sdl_createPermissionElementsFromRPCNames:(NSArray<SDLRPCFunctionName> *)rpcNames {
+ NSMutableArray *permissionElements = [[NSMutableArray alloc] init];
+ for (NSString *rpcName in rpcNames) {
+ SDLPermissionElement *permissionElement = [[SDLPermissionElement alloc] initWithRPCName:rpcName parameterPermissions:nil];
+ [permissionElements addObject:permissionElement];
+ }
+
+ return [permissionElements copy];
+}
+
+/**
* Determine if a filter changes based on an HMI level change and the filter's group type settings. This will run through the filter's RPCs, check the permission for each and see if any permission within the filter changes based on some permission now being allowed when it wasn't, or not allowed when it was. This also takes into account the group type setting, so an All Allowed filter will return YES if and only if some permission changed *and* that causes a status change *to* or *from* Allowed.
*
* @param filter The filter to check
@@ -298,7 +366,7 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (BOOL)sdl_didFilterChange:(SDLPermissionFilter *)filter fromHMILevel:(SDLHMILevel)oldHMILevel toHMILevel:(SDLHMILevel)newHMILevel {
BOOL changed = NO;
- for (NSString *rpcName in filter.rpcNames) {
+ for (NSString *rpcName in [filter rpcNamesFromPermissionElements:filter.permissionElements]) {
SDLPermissionItem *item = self.permissions[rpcName];
BOOL newAllowed = [item.hmiPermissions.allowed containsObject:self.currentHMILevel];
BOOL oldAllowed = [item.hmiPermissions.allowed containsObject:oldHMILevel];
@@ -316,8 +384,8 @@ NS_ASSUME_NONNULL_BEGIN
// This is only for the All Allowed group type. Unlike with the Any group type, we need to know if the group status has changed
if (changed) {
- SDLPermissionGroupStatus oldStatus = [self.class sdl_groupStatusOfRPCs:filter.rpcNames withPermissions:self.permissions hmiLevel:oldHMILevel];
- SDLPermissionGroupStatus newStatus = [self.class sdl_groupStatusOfRPCs:filter.rpcNames withPermissions:self.permissions hmiLevel:newHMILevel];
+ SDLPermissionGroupStatus oldStatus = [self.class sdl_groupStatusOfRPCPermissions:filter.permissionElements withPermissions:self.permissions hmiLevel:oldHMILevel];
+ SDLPermissionGroupStatus newStatus = [self.class sdl_groupStatusOfRPCPermissions:filter.permissionElements withPermissions:self.permissions hmiLevel:newHMILevel];
// We've already eliminated the case where the permissions could stay the same, so if the permissions changed *to* allowed or *away* from allowed, we need to call the observer.
if (newStatus == SDLPermissionGroupStatusAllowed || oldStatus == SDLPermissionGroupStatusAllowed) {
@@ -340,7 +408,7 @@ NS_ASSUME_NONNULL_BEGIN
NSMutableDictionary<SDLPermissionFilter *, NSNumber<SDLInt> *> *filtersWithStatus = [NSMutableDictionary dictionary];
for (SDLPermissionFilter *filter in filters) {
if (filter.groupType == SDLPermissionGroupTypeAllAllowed) {
- filtersWithStatus[filter.identifier] = @([self groupStatusOfRPCNames:filter.rpcNames]);
+ filtersWithStatus[filter.identifier] = @([self groupStatusOfRPCPermissions:filter.permissionElements]);
}
}
@@ -362,7 +430,7 @@ NS_ASSUME_NONNULL_BEGIN
for (SDLPermissionFilter *filter in filters) {
NSArray<SDLPermissionItem *> *modifiedPermissionItems = [self sdl_modifiedUpdatedPermissions:updatedPermissions comparedToCurrentPermissions:currentPermissions];
for (SDLPermissionItem *item in modifiedPermissionItems) {
- if ([filter.rpcNames containsObject:item.rpcName]) {
+ if ([[filter rpcNamesFromPermissionElements:filter.permissionElements] containsObject:item.rpcName]) {
[modifiedFilters addObject:filter];
break;
}
@@ -405,6 +473,21 @@ NS_ASSUME_NONNULL_BEGIN
return NO;
}
+- (BOOL)isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter {
+ return [self.class sdl_isPermissionParameterAllowed:rpcName parameter:parameter permissionItems:self.permissions hmiLevel:self.currentHMILevel];
+}
+
++ (BOOL)sdl_isPermissionParameterAllowed:(SDLRPCFunctionName)rpcName parameter:(NSString *)parameter permissionItems:(NSDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissionItems hmiLevel:(SDLHMILevel)hmiLevel {
+ SDLPermissionItem *permissionItem = permissionItems[rpcName];
+ if (permissionItem == nil || ![self isRPCNameAllowed:rpcName permissions:permissionItems hmiLevel:hmiLevel] || permissionItem.parameterPermissions == nil || permissionItem.parameterPermissions.allowed == nil) {
+ return NO;
+ } else if (permissionItem.parameterPermissions.userDisallowed != nil) {
+ return [permissionItem.parameterPermissions.allowed containsObject:parameter] && ![permissionItem.parameterPermissions.userDisallowed containsObject:parameter];
+ } else {
+ return [permissionItem.parameterPermissions.allowed containsObject:parameter];
+ }
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPolicyDataParser.h b/SmartDeviceLink/SDLPolicyDataParser.h
deleted file mode 100644
index cdc763b1e..000000000
--- a/SmartDeviceLink/SDLPolicyDataParser.h
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// PolicyDataParser.h
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface SDLPolicyDataParser : NSObject
-
-@property (assign, nonatomic) Byte protocolVersion;
-@property (assign, nonatomic) BOOL isResponseRequired;
-@property (assign, nonatomic) BOOL isHighBandwidth;
-@property (assign, nonatomic) BOOL isSigned;
-@property (assign, nonatomic) BOOL isEncrypted;
-@property (assign, nonatomic) BOOL hasESN;
-@property (assign, nonatomic) Byte serviceType;
-@property (assign, nonatomic) Byte commandType;
-@property (assign, nonatomic) BOOL CPUDestination;
-@property (assign, nonatomic) Byte encryptionKeyIndex;
-@property (assign, nonatomic) UInt32 payloadSize;
-@property (strong, nonatomic) NSData *ESN;
-@property (assign, nonatomic) UInt32 moduleMessageId;
-@property (assign, nonatomic) UInt32 serverMessageId;
-@property (assign, nonatomic) Byte messageStatus;
-@property (strong, nonatomic) NSData *initializationVector;
-@property (strong, nonatomic) NSData *payload;
-@property (strong, nonatomic) NSData *signatureTag;
-
-- (nullable NSData *)unwrap:(NSData *)wrappedData;
-- (void)parsePolicyData:(NSData *)data;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPolicyDataParser.m b/SmartDeviceLink/SDLPolicyDataParser.m
deleted file mode 100644
index 9e23aeedc..000000000
--- a/SmartDeviceLink/SDLPolicyDataParser.m
+++ /dev/null
@@ -1,143 +0,0 @@
-//
-// PolicyDataParser.m
-//
-
-#import "SDLPolicyDataParser.h"
-#import "SDLLogMacros.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@implementation SDLPolicyDataParser
-
-- (nullable NSData *)unwrap:(NSData *)wrappedData {
- NSData *decodedData = nil;
-
- @try {
- NSError *errorJSONSerialization = nil;
- NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:wrappedData options:kNilOptions error:&errorJSONSerialization];
- NSArray<NSString *> *array = dictionary[@"data"];
- NSString *base64EncodedString = array[0];
-
- if ([NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) {
- decodedData = [[NSData alloc] initWithBase64EncodedString:base64EncodedString options:0];
- } else {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- decodedData = [[NSData alloc] initWithBase64Encoding:base64EncodedString];
-#pragma clang diagnostic pop
- }
- }
- @catch (NSException *exception) {
- decodedData = nil;
- SDLLogW(@"%@", exception);
- }
-
- return decodedData;
-}
-
-- (void)parsePolicyData:(NSData *)data {
- @try {
- Byte *bytes = (Byte *)data.bytes;
-
- Byte firstByte = bytes[0];
- self.protocolVersion = (firstByte & 0b11100000) >> 5;
- self.isResponseRequired = (firstByte & 0b00010000) != 0;
- self.isHighBandwidth = (firstByte & 0b00001000) != 0;
- self.isSigned = (firstByte & 0b00000100) != 0;
- self.isEncrypted = (firstByte & 0b00000010) != 0;
- self.hasESN = (firstByte & 0b00000001) != 0;
-
- self.serviceType = bytes[1];
-
- Byte thirdByte = bytes[2];
- self.commandType = (thirdByte & 0b11110000) >> 4;
- self.CPUDestination = (thirdByte & 0b00001000) != 0;
- self.encryptionKeyIndex = (thirdByte & 0b00000111);
-
- const int PayloadSizeOffset = 3;
- if (self.isHighBandwidth) {
- self.payloadSize = ntohl(*(UInt32 *)(bytes + PayloadSizeOffset));
- } else {
- self.payloadSize = ntohs(*(UInt16 *)(bytes + PayloadSizeOffset));
- }
-
- if (self.hasESN) {
- int esnOffset = self.isHighBandwidth ? 7 : 5;
- self.ESN = [NSData dataWithBytes:(bytes + esnOffset) length:8];
- }
-
- if (self.isHighBandwidth) {
- int moduleMessageIdOffset = 7;
- if (self.hasESN)
- moduleMessageIdOffset += self.ESN.length;
- self.moduleMessageId = ntohl(*(UInt32 *)(bytes + moduleMessageIdOffset));
-
- int serverMessageIdOffset = 11;
- if (self.hasESN)
- serverMessageIdOffset += self.ESN.length;
- self.serverMessageId = ntohl(*(UInt32 *)(bytes + serverMessageIdOffset));
-
- int messageStatusOffset = 15;
- if (self.hasESN)
- messageStatusOffset += self.ESN.length;
- self.messageStatus = bytes[messageStatusOffset];
- }
-
- if (self.isEncrypted) {
- int ivOffset = 5;
- if (self.isHighBandwidth)
- ivOffset += 11;
- if (self.hasESN)
- ivOffset += self.ESN.length;
- self.initializationVector = [NSData dataWithBytes:(bytes + ivOffset) length:16];
- }
-
- int payloadOffset = 5;
- if (self.isHighBandwidth) {
- payloadOffset += 11;
- }
- if (self.hasESN) {
- payloadOffset += self.ESN.length;
- }
- if (self.isEncrypted) {
- payloadOffset += self.initializationVector.length;
- }
-
- self.payload = [NSData dataWithBytes:(bytes + payloadOffset) length:self.payloadSize];
-
- if (self.isSigned) {
- int signatureTagOffset = (int)data.length - 16;
- self.signatureTag = [NSData dataWithBytes:(bytes + signatureTagOffset) length:16];
- }
- }
- @catch (NSException *exception) {
- SDLLogW(@"%@", exception);
- }
-}
-
-- (NSString *)description {
- NSString *esnString = [[NSString alloc] initWithData:self.ESN encoding:NSUTF8StringEncoding];
-
- NSMutableString *descriptionString = [NSMutableString stringWithFormat:@"Ver:%u; ", self.protocolVersion];
- [descriptionString appendFormat:@"RespReq:%u; ", self.isResponseRequired];
- [descriptionString appendFormat:@"HiBnd:%u; ", self.isHighBandwidth];
- [descriptionString appendFormat:@"Sign:%u; ", self.isSigned];
- [descriptionString appendFormat:@"Enc:%u; ", self.isEncrypted];
- [descriptionString appendFormat:@"HasESN:%u; ", self.hasESN];
- [descriptionString appendFormat:@"Svc:%u; ", self.serviceType];
- [descriptionString appendFormat:@"Cmd:%u; ", self.commandType];
- [descriptionString appendFormat:@"CPU:%u; ", self.CPUDestination];
- [descriptionString appendFormat:@"EncKey:%u; ", self.encryptionKeyIndex];
- [descriptionString appendFormat:@"sz:%u; ", (unsigned int)self.payloadSize];
- [descriptionString appendFormat:@"ESN:%@; ", esnString];
- [descriptionString appendFormat:@"mmid:%u; ", (unsigned int)self.moduleMessageId];
- [descriptionString appendFormat:@"smid:%u; ", (unsigned int)self.serverMessageId];
- [descriptionString appendFormat:@"status:%u; ", self.messageStatus];
- [descriptionString appendFormat:@"iv:%@; ", self.initializationVector];
- [descriptionString appendFormat:@"hmac:%@", self.signatureTag];
- return descriptionString;
-}
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPredefinedLayout.h b/SmartDeviceLink/SDLPredefinedLayout.h
index f56c275bb..73a076eac 100644
--- a/SmartDeviceLink/SDLPredefinedLayout.h
+++ b/SmartDeviceLink/SDLPredefinedLayout.h
@@ -108,3 +108,12 @@ extern SDLPredefinedLayout const SDLPredefinedLayoutDoubleGraphicWithSoftButtons
A layout with only a single large graphic
*/
extern SDLPredefinedLayout const SDLPredefinedLayoutLargeGraphicOnly;
+
+
+/**
+ Custom root template allowing in-vehicle WebEngine applications with
+ appropriate permissions to show the application's own web view.
+
+ @since 7.0
+ */
+extern SDLPredefinedLayout const SDLPredefinedLayoutWebView;
diff --git a/SmartDeviceLink/SDLPredefinedLayout.m b/SmartDeviceLink/SDLPredefinedLayout.m
index 08a0c29e8..691be5e3d 100644
--- a/SmartDeviceLink/SDLPredefinedLayout.m
+++ b/SmartDeviceLink/SDLPredefinedLayout.m
@@ -24,3 +24,4 @@ SDLPredefinedLayout const SDLPredefinedLayoutTextButtonsWithGraphic = @"TEXTBUTT
SDLPredefinedLayout const SDLPredefinedLayoutLargeGraphicWithSoftButtons = @"LARGE_GRAPHIC_WITH_SOFTBUTTONS";
SDLPredefinedLayout const SDLPredefinedLayoutDoubleGraphicWithSoftButtons = @"DOUBLE_GRAPHIC_WITH_SOFTBUTTONS";
SDLPredefinedLayout const SDLPredefinedLayoutLargeGraphicOnly = @"LARGE_GRAPHIC_ONLY";
+SDLPredefinedLayout const SDLPredefinedLayoutWebView = @"WEB_VIEW";
diff --git a/SmartDeviceLink/SDLProtocol.h b/SmartDeviceLink/SDLProtocol.h
index 4f8954026..a9a21f66d 100644
--- a/SmartDeviceLink/SDLProtocol.h
+++ b/SmartDeviceLink/SDLProtocol.h
@@ -5,7 +5,7 @@
#import "SDLTransportType.h"
#import "SDLProtocolConstants.h"
-#import "SDLProtocolListener.h"
+#import "SDLProtocolDelegate.h"
#import "SDLSecurityType.h"
#import "SDLTransportDelegate.h"
@@ -28,7 +28,7 @@ typedef NS_ENUM(NSUInteger, SDLProtocolError) {
extern NSString *const SDLProtocolSecurityErrorDomain;
-@interface SDLProtocol : NSObject <SDLProtocolListener, SDLTransportDelegate>
+@interface SDLProtocol : NSObject <SDLProtocolDelegate, SDLTransportDelegate>
/**
* Deprecated debug logging tool.
@@ -38,20 +38,23 @@ extern NSString *const SDLProtocolSecurityErrorDomain;
/**
* The transport layer for sending data between the app and Core
*/
-@property (nullable, weak, nonatomic) id<SDLTransportType> transport;
+@property (nullable, strong, nonatomic) id<SDLTransportType> transport;
/**
* A table for tracking all subscribers
*
* If you update protocolDelegateTable while the protocol is running, please make sure to guard with @synchronized.
*/
-@property (nullable, strong, nonatomic) NSHashTable<id<SDLProtocolListener>> *protocolDelegateTable;
+@property (nullable, strong, nonatomic) NSHashTable<id<SDLProtocolDelegate>> *protocolDelegateTable;
/**
* A security manager for sending encrypted data.
*/
@property (nullable, nonatomic, strong) id<SDLSecurityType> securityManager;
+/// The encryption manager for sending encrypted data
+@property (nullable, nonatomic, weak) SDLEncryptionLifecycleManager *encryptionLifecycleManager;
+
/**
* The app's id
*/
@@ -63,14 +66,25 @@ extern NSString *const SDLProtocolSecurityErrorDomain;
@property (strong, nonatomic, readonly, nullable) NSString *authToken;
#pragma mark - Init
+- (instancetype)init NS_UNAVAILABLE;
+
/**
- * Initialize the protocol with an encryption lifecycle manager.
+ * Initialize the protocol with an encryption lifecycle manager
*
- * @param encryptionLifecycleManager An encryption lifecycle manager.
+ * @param transport The transport to send and receive data from
+ * @param encryptionManager An encryption lifecycle manager
*
- * @return An instance of SDLProtocol
+ * @return An instance of SDLProtocol
*/
-- (instancetype)initWithEncryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager;
+- (instancetype)initWithTransport:(id<SDLTransportType>)transport encryptionManager:(nullable SDLEncryptionLifecycleManager *)encryptionManager;
+
+#pragma mark - Lifecycle
+
+/// Starts the connected transport
+- (void)start;
+
+/// Stops the connected transport
+- (void)stopWithCompletionHandler:(void (^)(void))disconnectCompletionHandler;
#pragma mark - Sending
@@ -137,15 +151,6 @@ extern NSString *const SDLProtocolSecurityErrorDomain;
*/
- (void)sendEncryptedRawData:(NSData *)data onService:(SDLServiceType)serviceType;
-#pragma mark - Recieving
-
-/**
- * Turns received bytes into message objects.
- *
- * @param receivedData The data received from Core
- */
-- (void)handleBytesFromTransport:(NSData *)receivedData;
-
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLProtocol.m b/SmartDeviceLink/SDLProtocol.m
index 7361e4295..d9d3c03d7 100644
--- a/SmartDeviceLink/SDLProtocol.m
+++ b/SmartDeviceLink/SDLProtocol.m
@@ -47,7 +47,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, strong, nonatomic) SDLProtocolReceivedMessageRouter *messageRouter;
@property (strong, nonatomic) NSMutableDictionary<SDLServiceTypeBox *, SDLProtocolHeader *> *serviceHeaders;
@property (assign, nonatomic) int32_t hashId;
-@property (nonatomic, strong) SDLEncryptionLifecycleManager *encryptionLifecycleManager;
// Readonly public properties
@property (strong, nonatomic, readwrite, nullable) NSString *authToken;
@@ -61,35 +60,40 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Lifecycle
-- (instancetype)init {
- if (self = [super init]) {
- _messageID = 0;
- _hashId = SDLControlFrameInt32NotFound;
- _prioritizedCollection = [[SDLPrioritizedObjectCollection alloc] init];
- _protocolDelegateTable = [NSHashTable weakObjectsHashTable];
- _serviceHeaders = [[NSMutableDictionary alloc] init];
- _messageRouter = [[SDLProtocolReceivedMessageRouter alloc] init];
- _messageRouter.delegate = self;
- }
+- (instancetype)initWithTransport:(id<SDLTransportType>)transport encryptionManager:(nullable SDLEncryptionLifecycleManager *)encryptionManager {
+ self = [super init];
+ if (!self) { return nil; }
- return self;
-}
+ SDLLogV(@"Initializing protocol with transport: %@, encryption manager: %@", transport, encryptionManager);
+ _messageID = 0;
+ _hashId = SDLControlFrameInt32NotFound;
+ _prioritizedCollection = [[SDLPrioritizedObjectCollection alloc] init];
+ _protocolDelegateTable = [NSHashTable weakObjectsHashTable];
+ _serviceHeaders = [[NSMutableDictionary alloc] init];
+ _messageRouter = [[SDLProtocolReceivedMessageRouter alloc] init];
+ _messageRouter.delegate = self;
-- (instancetype)initWithEncryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager {
- if (self = [super init]) {
- _messageID = 0;
- _hashId = SDLControlFrameInt32NotFound;
- _prioritizedCollection = [[SDLPrioritizedObjectCollection alloc] init];
- _protocolDelegateTable = [NSHashTable weakObjectsHashTable];
- _serviceHeaders = [[NSMutableDictionary alloc] init];
- _messageRouter = [[SDLProtocolReceivedMessageRouter alloc] init];
- _messageRouter.delegate = self;
- _encryptionLifecycleManager = encryptionLifecycleManager;
- }
+ _transport = transport;
+ _transport.delegate = self;
+
+ _encryptionLifecycleManager = encryptionManager;
return self;
}
+- (void)start {
+ SDLLogD(@"Starting protocol: %@", self);
+ [self.transport connect];
+}
+
+- (void)stopWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {
+ SDLLogD(@"Stopping protocol: %@, disconnecting transport and stopping security manager", self);
+ [self.securityManager stop];
+ [self.transport disconnectWithCompletionHandler:^{
+ disconnectCompletionHandler();
+ }];
+}
+
#pragma mark - Service metadata
- (BOOL)storeHeader:(SDLProtocolHeader *)header forServiceType:(SDLServiceType)serviceType {
if (header == nil) {
@@ -104,7 +108,12 @@ NS_ASSUME_NONNULL_BEGIN
- (UInt8)sdl_retrieveSessionIDforServiceType:(SDLServiceType)serviceType {
SDLProtocolHeader *header = self.serviceHeaders[@(serviceType)];
if (header == nil) {
- SDLLogW(@"Warning: Tried to retrieve sessionID for serviceType %i, but no header is saved for that service type", serviceType);
+ // The first time the RPC service type is created, there's no header, so we don't need to warn.
+ if (serviceType != SDLServiceTypeRPC) {
+ SDLLogW(@"Warning: Tried to retrieve sessionID for serviceType %i, but no header is saved for that service type.", serviceType);
+ }
+
+ return 0;
}
return header.sessionID;
@@ -113,37 +122,40 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - SDLTransportDelegate
- (void)onTransportConnected {
- NSArray<id<SDLProtocolListener>> *listeners;
+ SDLLogV(@"Transport connected, opening protocol");
+ NSArray<id<SDLProtocolDelegate>> *listeners;
@synchronized(self.protocolDelegateTable) {
listeners = self.protocolDelegateTable.allObjects;
}
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(onProtocolOpened)]) {
- [listener onProtocolOpened];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocolDidOpen:)]) {
+ [listener protocolDidOpen:self];
}
}
}
- (void)onTransportDisconnected {
- NSArray<id<SDLProtocolListener>> *listeners;
+ SDLLogV(@"Transport disconnected, closing protocol");
+ NSArray<id<SDLProtocolDelegate>> *listeners;
@synchronized(self.protocolDelegateTable) {
listeners = self.protocolDelegateTable.allObjects;
}
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(onProtocolClosed)]) {
- [listener onProtocolClosed];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocolDidClose:)]) {
+ [listener protocolDidClose:self];
}
}
}
- (void)onDataReceived:(NSData *)receivedData {
- [self handleBytesFromTransport:receivedData];
+ [self sdl_handleBytesFromTransport:receivedData];
}
- (void)onError:(NSError *)error {
- for (id<SDLProtocolListener> listener in self.protocolDelegateTable.allObjects) {
- if ([listener respondsToSelector:@selector(onTransportError:)]) {
- [listener onTransportError:error];
+ SDLLogV(@"Transport received an error: %@", error);
+ for (id<SDLProtocolDelegate> listener in self.protocolDelegateTable.allObjects) {
+ if ([listener respondsToSelector:@selector(protocol:transportDidError:)]) {
+ [listener protocol:self transportDidError:error];
}
}
}
@@ -153,10 +165,12 @@ NS_ASSUME_NONNULL_BEGIN
- (void)startServiceWithType:(SDLServiceType)serviceType payload:(nullable NSData *)payload {
// No encryption, just build and send the message synchronously
SDLProtocolMessage *message = [self sdl_createStartServiceMessageWithType:serviceType encrypted:NO payload:payload];
+ SDLLogD(@"Sending start service: %@", message);
[self sdl_sendDataToTransport:message.data onService:serviceType];
}
- (void)startSecureServiceWithType:(SDLServiceType)serviceType payload:(nullable NSData *)payload tlsInitializationHandler:(void (^)(BOOL success, NSError *error))tlsInitializationHandler {
+ SDLLogD(@"Attempting to start TLS for service type: %hhu", serviceType);
[self sdl_initializeTLSEncryptionWithCompletionHandler:^(BOOL success, NSError *error) {
if (!success) {
// We can't start the service because we don't have encryption, return the error
@@ -166,6 +180,7 @@ NS_ASSUME_NONNULL_BEGIN
// TLS initialization succeeded. Build and send the message.
SDLProtocolMessage *message = [self sdl_createStartServiceMessageWithType:serviceType encrypted:YES payload:nil];
+ SDLLogD(@"TLS initialized, sending start service for message: %@", message);
[self sdl_sendDataToTransport:message.data onService:serviceType];
}];
}
@@ -174,22 +189,7 @@ NS_ASSUME_NONNULL_BEGIN
SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major];
NSData *servicePayload = payload;
- switch (serviceType) {
- case SDLServiceTypeRPC: {
- // Need a different header for starting the RPC service, we get the session Id from the HU, or its the same as the RPC service's
- if ([self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC]) {
- header.sessionID = [self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC];
- } else {
- header.sessionID = 0;
- }
-
- SDLControlFramePayloadRPCStartService *startServicePayload = [[SDLControlFramePayloadRPCStartService alloc] initWithVersion:SDLMaxProxyProtocolVersion];
- servicePayload = startServicePayload.data;
- } break;
- default: {
- header.sessionID = [self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC];
- } break;
- }
+ header.sessionID = [self sdl_retrieveSessionIDforServiceType:SDLServiceTypeRPC];
header.frameType = SDLFrameTypeControl;
header.serviceType = serviceType;
header.frameData = SDLFrameInfoStartService;
@@ -211,6 +211,7 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
+ SDLLogD(@"Telling security manager to initialize");
[self.securityManager initializeWithAppId:self.appId completionHandler:^(NSError *_Nullable error) {
if (error) {
SDLLogE(@"Security Manager failed to initialize with error: %@", error);
@@ -248,6 +249,7 @@ NS_ASSUME_NONNULL_BEGIN
}
SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:payload];
+ SDLLogD(@"Sending end service: %@", message);
[self sdl_sendDataToTransport:message.data onService:serviceType];
}
@@ -255,6 +257,8 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Register Secondary Transport
- (void)registerSecondaryTransport {
+ SDLLogV(@"Attempting to register the secondary transport");
+
SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major];
header.frameType = SDLFrameTypeControl;
header.serviceType = SDLServiceTypeControl;
@@ -265,6 +269,7 @@ NS_ASSUME_NONNULL_BEGIN
}
SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil];
+ SDLLogD(@"Sending register secondary transport: %@", message);
[self sdl_sendDataToTransport:message.data onService:SDLServiceTypeControl];
}
@@ -293,7 +298,7 @@ NS_ASSUME_NONNULL_BEGIN
}
NSData *messagePayload = nil;
- SDLLogV(@"Send RPC %@", message);
+ SDLLogV(@"Sending RPC: %@", message);
// Build the message payload. Include the binary header if necessary
// VERSION DEPENDENT CODE
@@ -434,7 +439,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Receive and Process Data
// Turn received bytes into message objects.
-- (void)handleBytesFromTransport:(NSData *)receivedData {
+- (void)sdl_handleBytesFromTransport:(NSData *)receivedData {
// Initialize the receive buffer which will contain bytes while messages are constructed.
if (self.receiveBuffer == nil) {
self.receiveBuffer = [NSMutableData dataWithCapacity:(4 * [[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC])];
@@ -443,10 +448,10 @@ NS_ASSUME_NONNULL_BEGIN
// Save the data
[self.receiveBuffer appendData:receivedData];
- [self processMessages];
+ [self sdl_processMessages];
}
-- (void)processMessages {
+- (void)sdl_processMessages {
UInt8 incomingVersion = [SDLProtocolHeader determineVersion:self.receiveBuffer];
// If we have enough bytes, create the header.
@@ -479,10 +484,9 @@ NS_ASSUME_NONNULL_BEGIN
}
message = [SDLProtocolMessage messageWithHeader:header andPayload:payload];
- SDLLogV(@"Protocol message received: %@", message);
} else {
// Need to wait for more bytes.
- SDLLogV(@" protocol header complete, message incomplete, waiting for %ld more bytes. Header: %@", (long)(messageSize - self.receiveBuffer.length), header);
+ SDLLogV(@"Protocol header complete, message incomplete, waiting for %ld more bytes. Header: %@", (long)(messageSize - self.receiveBuffer.length), header);
return;
}
@@ -490,16 +494,21 @@ NS_ASSUME_NONNULL_BEGIN
self.receiveBuffer = [[self.receiveBuffer subdataWithRange:NSMakeRange(messageSize, self.receiveBuffer.length - messageSize)] mutableCopy];
// Pass on the message to the message router.
- [self.messageRouter handleReceivedMessage:message];
+ [self.messageRouter handleReceivedMessage:message protocol:self];
// Call recursively until the buffer is empty or incomplete message is encountered
if (self.receiveBuffer.length > 0) {
- [self processMessages];
+ [self sdl_processMessages];
}
}
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
- // V5 Packet
+
+#pragma mark - SDLProtocolDelegate from SDLReceivedProtocolMessageRouter
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
+ SDLLogD(@"Received start service ACK: %@", startServiceACK);
+
+ // V5+ Packet
if (startServiceACK.header.version >= 5) {
switch (startServiceACK.header.serviceType) {
case SDLServiceTypeRPC: {
@@ -521,8 +530,7 @@ NS_ASSUME_NONNULL_BEGIN
default:
break;
}
- } else {
- // V4 and below packet
+ } else { // V4 and below packet
switch (startServiceACK.header.serviceType) {
case SDLServiceTypeRPC: {
[SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion = [SDLVersion versionWithMajor:startServiceACK.header.version minor:0 patch:0];
@@ -536,69 +544,74 @@ NS_ASSUME_NONNULL_BEGIN
self.serviceHeaders[@(startServiceACK.header.serviceType)] = [startServiceACK.header copy];
// Pass along to all the listeners
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleProtocolStartServiceACKMessage:)]) {
- [listener handleProtocolStartServiceACKMessage:startServiceACK];
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveStartServiceACK:)]) {
+ [listener protocol:protocol didReceiveStartServiceACK:startServiceACK];
}
}
}
-- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK {
[self sdl_logControlNAKPayload:startServiceNAK];
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleProtocolStartServiceNAKMessage:)]) {
- [listener handleProtocolStartServiceNAKMessage:startServiceNAK];
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveStartServiceNAK:)]) {
+ [listener protocol:protocol didReceiveStartServiceNAK:startServiceNAK];
}
}
}
-- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK {
+ SDLLogD(@"End service ACK: %@", endServiceACK);
// Remove the session id
[self.serviceHeaders removeObjectForKey:@(endServiceACK.header.serviceType)];
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleProtocolEndServiceACKMessage:)]) {
- [listener handleProtocolEndServiceACKMessage:endServiceACK];
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveEndServiceACK:)]) {
+ [listener protocol:protocol didReceiveEndServiceACK:endServiceACK];
}
}
}
-- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK {
[self sdl_logControlNAKPayload:endServiceNAK];
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleProtocolEndServiceNAKMessage:)]) {
- [listener handleProtocolEndServiceNAKMessage:endServiceNAK];
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveEndServiceNAK:)]) {
+ [listener protocol:protocol didReceiveEndServiceNAK:endServiceNAK];
}
}
}
-- (void)handleProtocolRegisterSecondaryTransportACKMessage:(SDLProtocolMessage *)registerSecondaryTransportACK {
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleProtocolRegisterSecondaryTransportACKMessage:)]) {
- [listener handleProtocolRegisterSecondaryTransportACKMessage:registerSecondaryTransportACK];
+- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportACK:(SDLProtocolMessage *)registerSecondaryTransportACK {
+ SDLLogD(@"Register Secondary Transport ACK: %@", registerSecondaryTransportACK);
+
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveRegisterSecondaryTransportACK:)]) {
+ [listener protocol:protocol didReceiveRegisterSecondaryTransportACK:registerSecondaryTransportACK];
}
}
}
-- (void)handleProtocolRegisterSecondaryTransportNAKMessage:(SDLProtocolMessage *)registerSecondaryTransportNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportNAK:(SDLProtocolMessage *)registerSecondaryTransportNAK {
[self sdl_logControlNAKPayload:registerSecondaryTransportNAK];
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleProtocolRegisterSecondaryTransportNAKMessage:)]) {
- [listener handleProtocolRegisterSecondaryTransportNAKMessage:registerSecondaryTransportNAK];
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveRegisterSecondaryTransportNAK:)]) {
+ [listener protocol:protocol didReceiveRegisterSecondaryTransportNAK:registerSecondaryTransportNAK];
}
}
}
- (void)handleHeartbeatForSession:(Byte)session {
+ SDLLogV(@"Received a heartbeat");
+
// Respond with a heartbeat ACK
SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:(UInt8)[SDLGlobals sharedGlobals].protocolVersion.major];
header.frameType = SDLFrameTypeControl;
@@ -608,8 +621,8 @@ NS_ASSUME_NONNULL_BEGIN
SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil];
[self sdl_sendDataToTransport:message.data onService:header.serviceType];
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
if ([listener respondsToSelector:@selector(handleHeartbeatForSession:)]) {
[listener handleHeartbeatForSession:session];
}
@@ -617,61 +630,40 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)handleHeartbeatACK {
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
+ SDLLogV(@"Received a heartbeat ACK");
+
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
if ([listener respondsToSelector:@selector(handleHeartbeatACK)]) {
[listener handleHeartbeatACK];
}
}
}
-- (void)handleTransportEventUpdateMessage:(SDLProtocolMessage *)transportEventUpdate {
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(handleTransportEventUpdateMessage:)]) {
- [listener handleTransportEventUpdateMessage:transportEventUpdate];
+- (void)protocol:(SDLProtocol *)protocol didReceiveTransportEventUpdate:(SDLProtocolMessage *)transportEventUpdate {
+ SDLLogD(@"Received a transport event update: %@", transportEventUpdate);
+
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveTransportEventUpdate:)]) {
+ [listener protocol:protocol didReceiveTransportEventUpdate:transportEventUpdate];
}
}
}
-- (void)onProtocolMessageReceived:(SDLProtocolMessage *)msg {
+- (void)protocol:(SDLProtocol *)protocol didReceiveMessage:(SDLProtocolMessage *)msg {
// Control service (but not control frame type) messages are TLS handshake messages
if (msg.header.serviceType == SDLServiceTypeControl) {
[self sdl_processSecurityMessage:msg];
return;
}
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(onProtocolMessageReceived:)]) {
- [listener onProtocolMessageReceived:msg];
- }
- }
-}
-
-- (void)onProtocolOpened {
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(onProtocolOpened)]) {
- [listener onProtocolOpened];
- }
- }
-}
-
-- (void)onProtocolClosed {
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(onProtocolClosed)]) {
- [listener onProtocolClosed];
- }
- }
-}
+ SDLLogV(@"Other protocol message received: %@", msg);
-- (void)onError:(NSString *)info exception:(NSException *)e {
- NSArray<id<SDLProtocolListener>> *listeners = [self sdl_getProtocolListeners];
- for (id<SDLProtocolListener> listener in listeners) {
- if ([listener respondsToSelector:@selector(onError:exception:)]) {
- [listener onError:info exception:e];
+ NSArray<id<SDLProtocolDelegate>> *listeners = [self sdl_getProtocolListeners];
+ for (id<SDLProtocolDelegate> listener in listeners) {
+ if ([listener respondsToSelector:@selector(protocol:didReceiveMessage:)]) {
+ [listener protocol:protocol didReceiveMessage:msg];
}
}
}
@@ -683,21 +675,20 @@ NS_ASSUME_NONNULL_BEGIN
if (nakMessage.header.version >= 5) {
SDLControlFramePayloadNak *endServiceNakPayload = [[SDLControlFramePayloadNak alloc] initWithData:nakMessage.payload];
NSArray<NSString *> *rejectedParams = endServiceNakPayload.rejectedParams;
- if (rejectedParams.count > 0) {
- SDLLogE(@"%@ service NAK'd, service type: %@, rejectedParams: %@", (nakMessage.header.frameData == SDLFrameInfoStartServiceNACK) ? @"Start" : @"End", @(nakMessage.header.serviceType), rejectedParams);
- }
+ SDLLogE(@"%@ service NAK'd, service type: %@, rejectedParams: %@", (nakMessage.header.frameData == SDLFrameInfoStartServiceNACK) ? @"Start" : @"End", @(nakMessage.header.serviceType), rejectedParams);
+ } else {
+ SDLLogE(@"NAK received message: %@", nakMessage);
}
} break;
case SDLFrameInfoRegisterSecondaryTransportNACK: {
SDLControlFramePayloadRegisterSecondaryTransportNak *payload = [[SDLControlFramePayloadRegisterSecondaryTransportNak alloc] initWithData:nakMessage.payload];
SDLLogE(@"Register Secondary Transport NAK'd, reason: %@", payload.reason);
} break;
- default:
- break;
+ default: break;
}
}
-- (NSArray<id<SDLProtocolListener>> *)sdl_getProtocolListeners {
+- (NSArray<id<SDLProtocolDelegate>> *)sdl_getProtocolListeners {
@synchronized(self.protocolDelegateTable) {
return self.protocolDelegateTable.allObjects;
}
@@ -705,16 +696,19 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - TLS Handshake
+
// TODO: These should be split out to a separate class to be tested properly
- (void)sdl_processSecurityMessage:(SDLProtocolMessage *)clientHandshakeMessage {
+ SDLLogD(@"Received a security message: %@", clientHandshakeMessage);
+
if (self.securityManager == nil) {
- SDLLogE(@"Failed to process security message because no security manager is set. Message: %@", clientHandshakeMessage);
+ SDLLogE(@"Failed to process security message because no security manager is set.");
return;
}
// Misformatted handshake message, something went wrong
if (clientHandshakeMessage.payload.length <= 12) {
- SDLLogE(@"Security message is malformed, less than 12 bytes. It does not have a protocol header. Message: %@", clientHandshakeMessage);
+ SDLLogE(@"Security message is malformed, less than 12 bytes. It does not have a protocol header.");
}
// Tear off the binary header of the client protocol message to get at the actual TLS handshake
@@ -737,6 +731,7 @@ NS_ASSUME_NONNULL_BEGIN
}
// Send the response or error message. If it's an error message, the module will ACK the Start Service without encryption. If it's a TLS handshake message, the module will ACK with encryption
+ SDLLogD(@"Sending security message: %@", serverSecurityMessage);
[self sdl_sendDataToTransport:serverSecurityMessage.data onService:SDLServiceTypeControl];
}
diff --git a/SmartDeviceLink/SDLProtocolDelegate.h b/SmartDeviceLink/SDLProtocolDelegate.h
new file mode 100644
index 000000000..f3c55902c
--- /dev/null
+++ b/SmartDeviceLink/SDLProtocolDelegate.h
@@ -0,0 +1,98 @@
+// SDLProtocolDelegate.h
+//
+
+#import "SDLProtocolHeader.h"
+
+@class SDLProtocol;
+@class SDLProtocolMessage;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLProtocolDelegate <NSObject>
+
+@optional
+
+
+#pragma mark - Protocol Messages
+
+/// Called when a protocol frame is received.
+/// @param msg A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveMessage:(SDLProtocolMessage *)msg;
+
+/// Called when the start service frame succeeds.
+/// @discussion This frame can be sent on both the primary and secondary transports
+/// @param startServiceACK A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK;
+
+/// Called when the start service frame fails.
+/// @discussion This frame can be sent on both the primary and secondary transports
+/// @param startServiceNAK A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK;
+
+/// Called when the end service frame succeeds.
+/// @discussion This frame can be sent on both the primary and secondary transports
+/// @param endServiceACK A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK;
+
+/// Called when the end service frame fails.
+/// @discussion This frame can be sent on both the primary and secondary transports
+/// @param endServiceNAK A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK;
+
+#pragma mark Secondary Transport Messages
+
+/// Called when the secondary transport registration frame succeeds.
+/// @discussion This frame is only sent on the secondary transport
+/// @param registerSecondaryTransportACK A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportACK:(SDLProtocolMessage *)registerSecondaryTransportACK;
+
+/// Called when the secondary transport registration frame fails.
+/// @discussion This frame is only sent on the secondary transport
+/// @param registerSecondaryTransportNAK A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportNAK:(SDLProtocolMessage *)registerSecondaryTransportNAK;
+
+/// Called when the status or configuration of one or more transports has updated.
+/// @discussion This frame is only sent on the primary transport
+/// @param transportEventUpdate A SDLProtocolMessage object
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol didReceiveTransportEventUpdate:(SDLProtocolMessage *)transportEventUpdate;
+
+#pragma mark - Transport Lifecycle
+
+/// Called when the transport opens.
+/// @param protocol The transport's protocol
+- (void)protocolDidOpen:(SDLProtocol *)protocol;
+
+/// Called when the transport closes.
+/// @param protocol The transport's protocol
+- (void)protocolDidClose:(SDLProtocol *)protocol;
+
+/// Called when the transport errors.
+/// @discussion Currently only used by TCP transport.
+/// @param error The error
+/// @param protocol The transport's protocol
+- (void)protocol:(SDLProtocol *)protocol transportDidError:(NSError *)error;
+
+#pragma mark - Deprecated Protocol Messages
+
+/// A ping packet that is sent to ensure the connection is still active and the service is still valid.
+/// @discussion Deprecated - requires protocol major version 3
+/// @param session The session number
+- (void)handleHeartbeatForSession:(Byte)session;
+
+/// Called when the heartbeat frame was recieved successfully.
+/// @discussion Deprecated - requires protocol major version 3
+- (void)handleHeartbeatACK;
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLProtocolListener.h b/SmartDeviceLink/SDLProtocolListener.h
deleted file mode 100644
index e944f25f6..000000000
--- a/SmartDeviceLink/SDLProtocolListener.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// SDLProtocolListener.h
-//
-
-#import "SDLProtocolHeader.h"
-
-@class SDLProtocolMessage;
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol SDLProtocolListener <NSObject>
-
-@optional
-
-#pragma mark - v4.7.0 protocol handlers
-
-/**
- * Called when the message is a start service success message.
- *
- * @param startServiceACK A SDLProtocolMessage object
- */
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK;
-
-/**
- * Called when the message is a start service failed message.
- *
- * @param startServiceNAK A SDLProtocolMessage object
- */
-- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK;
-
-/**
- * Called when the message is a end service success message.
- *
- * @param endServiceACK A SDLProtocolMessage object
- */
-- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK;
-
-/**
- * Called when the message is a end service failed message.
- *
- * @param endServiceNAK A SDLProtocolMessage object
- */
-- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK;
-- (void)handleProtocolRegisterSecondaryTransportACKMessage:(SDLProtocolMessage *)registerSecondaryTransportACK;
-- (void)handleProtocolRegisterSecondaryTransportNAKMessage:(SDLProtocolMessage *)registerSecondaryTransportNAK;
-- (void)handleTransportEventUpdateMessage:(SDLProtocolMessage *)transportEventUpdate;
-
-#pragma mark - Older protocol handlers
-
-/**
- * Called when the message is a heartbeat message.
- *
- * @param session Session number
- */
-- (void)handleHeartbeatForSession:(Byte)session;
-
-/**
- * Called when the message is a heartbeat success message.
- */
-- (void)handleHeartbeatACK;
-
-/**
- * Called when the message is protocol message.
- *
- * @param msg A SDLProtocolMessage object
- */
-- (void)onProtocolMessageReceived:(SDLProtocolMessage *)msg;
-
-/**
- * Called when the message is a protocol opened message.
- */
-- (void)onProtocolOpened;
-
-/**
- * Called when the message is a protocol closed message.
- */
-- (void)onProtocolClosed;
-
-/**
- * Called when the message is an error message.
- *
- * @param info The error info message
- * @param e The exception
- */
-- (void)onError:(NSString *)info exception:(NSException *)e;
-
-/**
- * Called when an error is notified from transport.
- *
- * Note: currently, this is used only by TCP transport.
- *
- * @param error The type of the error
- */
-- (void)onTransportError:(NSError *)error;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLProtocolReceivedMessageRouter.h b/SmartDeviceLink/SDLProtocolReceivedMessageRouter.h
index 30cafa5da..d025310a3 100644
--- a/SmartDeviceLink/SDLProtocolReceivedMessageRouter.h
+++ b/SmartDeviceLink/SDLProtocolReceivedMessageRouter.h
@@ -2,7 +2,7 @@
//
-#import "SDLProtocolListener.h"
+#import "SDLProtocolDelegate.h"
@class SDLProtocolMessage;
NS_ASSUME_NONNULL_BEGIN
@@ -12,14 +12,14 @@ NS_ASSUME_NONNULL_BEGIN
/**
* A listener.
*/
-@property (weak, nonatomic, nullable) id<SDLProtocolListener> delegate;
+@property (weak, nonatomic, nullable) id<SDLProtocolDelegate> delegate;
/**
* Called when a message is received from Core.
*
* @param message A SDLProtocolMessage object
*/
-- (void)handleReceivedMessage:(SDLProtocolMessage *)message;
+- (void)handleReceivedMessage:(SDLProtocolMessage *)message protocol:(SDLProtocol *)protocol;
@end
diff --git a/SmartDeviceLink/SDLProtocolReceivedMessageRouter.m b/SmartDeviceLink/SDLProtocolReceivedMessageRouter.m
index a4bbf71e2..6c51f0079 100644
--- a/SmartDeviceLink/SDLProtocolReceivedMessageRouter.m
+++ b/SmartDeviceLink/SDLProtocolReceivedMessageRouter.m
@@ -26,60 +26,60 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
-- (void)handleReceivedMessage:(SDLProtocolMessage *)message {
+- (void)handleReceivedMessage:(SDLProtocolMessage *)message protocol:(SDLProtocol *)protocol {
SDLFrameType frameType = message.header.frameType;
switch (frameType) {
case SDLFrameTypeSingle: {
- [self sdl_dispatchProtocolMessage:message];
+ [self sdl_dispatchProtocolMessage:message protocol:protocol];
} break;
case SDLFrameTypeControl: {
- [self sdl_dispatchControlMessage:message];
+ [self sdl_dispatchControlMessage:message protocol:protocol];
} break;
case SDLFrameTypeFirst: // fallthrough
case SDLFrameTypeConsecutive: {
- [self sdl_dispatchMultiPartMessage:message];
+ [self sdl_dispatchMultiPartMessage:message protocol:protocol];
} break;
default: break;
}
}
-- (void)sdl_dispatchProtocolMessage:(SDLProtocolMessage *)message {
- if ([self.delegate respondsToSelector:@selector(onProtocolMessageReceived:)]) {
- [self.delegate onProtocolMessageReceived:message];
+- (void)sdl_dispatchProtocolMessage:(SDLProtocolMessage *)message protocol:(SDLProtocol *)protocol {
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveMessage:)]) {
+ [self.delegate protocol:protocol didReceiveMessage:message];
}
}
-- (void)sdl_dispatchControlMessage:(SDLProtocolMessage *)message {
+- (void)sdl_dispatchControlMessage:(SDLProtocolMessage *)message protocol:(SDLProtocol *)protocol {
switch (message.header.frameData) {
case SDLFrameInfoStartServiceACK: {
- if ([self.delegate respondsToSelector:@selector(handleProtocolStartServiceACKMessage:)]) {
- [self.delegate handleProtocolStartServiceACKMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveStartServiceACK:)]) {
+ [self.delegate protocol:protocol didReceiveStartServiceACK:message];
}
} break;
case SDLFrameInfoStartServiceNACK: {
- if ([self.delegate respondsToSelector:@selector(handleProtocolStartServiceNAKMessage:)]) {
- [self.delegate handleProtocolStartServiceNAKMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveStartServiceNAK:)]) {
+ [self.delegate protocol:protocol didReceiveStartServiceNAK:message];
}
} break;
case SDLFrameInfoEndServiceACK: {
- if ([self.delegate respondsToSelector:@selector(handleProtocolEndServiceACKMessage:)]) {
- [self.delegate handleProtocolEndServiceACKMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveEndServiceACK:)]) {
+ [self.delegate protocol:protocol didReceiveEndServiceACK:message];
}
} break;
case SDLFrameInfoEndServiceNACK: {
- if ([self.delegate respondsToSelector:@selector(handleProtocolStartServiceNAKMessage:)]) {
- [self.delegate handleProtocolEndServiceNAKMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveEndServiceNAK:)]) {
+ [self.delegate protocol:protocol didReceiveEndServiceNAK:message];
}
} break;
case SDLFrameInfoRegisterSecondaryTransportACK: {
- if ([self.delegate respondsToSelector:@selector(handleProtocolRegisterSecondaryTransportACKMessage:)]) {
- [self.delegate handleProtocolRegisterSecondaryTransportACKMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveRegisterSecondaryTransportACK:)]) {
+ [self.delegate protocol:protocol didReceiveRegisterSecondaryTransportACK:message];
}
} break;
case SDLFrameInfoRegisterSecondaryTransportNACK: {
- if ([self.delegate respondsToSelector:@selector(handleProtocolRegisterSecondaryTransportNAKMessage:)]) {
- [self.delegate handleProtocolRegisterSecondaryTransportNAKMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveRegisterSecondaryTransportNAK:)]) {
+ [self.delegate protocol:protocol didReceiveRegisterSecondaryTransportNAK:message];
}
} break;
case SDLFrameInfoHeartbeat: {
@@ -93,15 +93,15 @@ NS_ASSUME_NONNULL_BEGIN
}
} break;
case SDLFrameInfoTransportEventUpdate: {
- if ([self.delegate respondsToSelector:@selector(handleTransportEventUpdateMessage:)]) {
- [self.delegate handleTransportEventUpdateMessage:message];
+ if ([self.delegate respondsToSelector:@selector(protocol:didReceiveTransportEventUpdate:)]) {
+ [self.delegate protocol:protocol didReceiveTransportEventUpdate:message];
}
} break;
default: break; // Other frame data is possible, but we don't care about them
}
}
-- (void)sdl_dispatchMultiPartMessage:(SDLProtocolMessage *)message {
+- (void)sdl_dispatchMultiPartMessage:(SDLProtocolMessage *)message protocol:(SDLProtocol *)protocol {
// Pass multipart messages to an assembler and call delegate when done.
NSNumber *sessionID = [NSNumber numberWithUnsignedChar:message.header.sessionID];
@@ -113,7 +113,7 @@ NS_ASSUME_NONNULL_BEGIN
SDLMessageAssemblyCompletionHandler completionHandler = ^void(BOOL done, SDLProtocolMessage *assembledMessage) {
if (done) {
- [self sdl_dispatchProtocolMessage:assembledMessage];
+ [self sdl_dispatchProtocolMessage:assembledMessage protocol:protocol];
}
};
[assembler handleMessage:message withCompletionHandler:completionHandler];
diff --git a/SmartDeviceLink/SDLProxy.h b/SmartDeviceLink/SDLProxy.h
deleted file mode 100644
index 4fd20c4af..000000000
--- a/SmartDeviceLink/SDLProxy.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// SDLProxy.h
-//
-
-@class SDLEncryptionLifecycleManager;
-@class SDLProtocol;
-@class SDLPutFile;
-@class SDLRPCMessage;
-@class SDLSecondaryTransportManager;
-@class SDLStreamingMediaManager;
-@class SDLTimer;
-
-#import "SDLProtocolListener.h"
-#import "SDLProxyListener.h"
-#import "SDLSecurityType.h"
-#import "SDLTransportType.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface SDLProxy : NSObject <SDLProtocolListener, NSStreamDelegate> {
- Byte _version;
- Byte _bulkSessionID;
- BOOL _isConnected;
-}
-
-/**
- * The protocol that handles sending and receiving messages from Core.
- */
-@property (nullable, strong, nonatomic) SDLProtocol *protocol;
-
-/**
- * The transport type used to connect the app to Core.
- */
-@property (nullable, strong, nonatomic) id<SDLTransportType> transport;
-
-/**
- * A set of all subscribers.
- */
-@property (readonly, copy, nonatomic) NSSet<NSObject<SDLProxyListener> *> *proxyListeners;
-
-/**
- * Closes an open session if no start service ACK message received from Core within a given amount of time.
- */
-@property (strong, nonatomic) SDLTimer *startSessionTimer;
-
-/**
- * The proxy version number.
- */
-@property (readonly, copy, nonatomic) NSString *proxyVersion;
-
-/**
- * Convenience init.
- *
- * @param transport The type of network connection
- * @param delegate The subscriber
- * @param secondaryTransportManager The secondary transport manager
- * @return A SDLProxy object
- */
-- (id)initWithTransport:(id<SDLTransportType>)transport delegate:(id<SDLProxyListener>)delegate secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager;
-
-/**
- * Creates a SDLProxy object with an iap (USB / Bluetooth) transport network connection.
- *
- * @param delegate The subscriber
- * @param secondaryTransportManager The secondary transport manager
- * @param encryptionLifecycleManager The encryption life cycle manager
- * @return A SDLProxy object
- */
-+ (SDLProxy *)iapProxyWithListener:(id<SDLProxyListener>)delegate secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager encryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager;
-
-/**
- * Creates a SDLProxy object with a TCP (WiFi) transport network connection.
- *
- * @param delegate The subscriber
- * @param ipaddress The IP address of Core
- * @param port The port address of Core
- * @param secondaryTransportManager The secondary transport manager
- * @param encryptionLifecycleManager The encryption life cycle manager
- * @return A SDLProxy object
- */
-+ (SDLProxy *)tcpProxyWithListener:(id<SDLProxyListener>)delegate tcpIPAddress:(NSString *)ipaddress tcpPort:(NSString *)port secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager encryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager;
-
-/**
- * Adds a delegate.
- *
- * @param delegate The delegate to add
- */
-- (void)addDelegate:(NSObject<SDLProxyListener> *)delegate;
-
-/**
- * Removes a delegate.
- *
- * @param delegate The delegate to remove
- */
-- (void)removeDelegate:(NSObject<SDLProxyListener> *)delegate;
-
-/**
- * Sends a RPC to Core.
- *
- * @param message A SDLRPCMessage object
- */
-- (void)sendRPC:(SDLRPCMessage *)message;
-
-/**
- * Parses a dictionary object and notifies the subscribed delegates of the messages sent by Core. Some messages are also intercepted and handled by the library.
- *
- * @param dictionary The message data
- */
-- (void)handleRPCDictionary:(NSDictionary<NSString *, id> *)dictionary;
-
-/**
- * Parses a SDLProtocolMessage object and notifies the subscribed delegates of the messages sent by Core. Some messages are also intercepted and handled by the library.
- *
- * @param msgData The message data
- */
-- (void)handleProtocolMessage:(SDLProtocolMessage *)msgData;
-
-/**
- * Adds the security manangers needed to send encrypted data.
- *
- * @param securityManagerClasses The security manager classes
- * @param appId The app's id
- */
-- (void)addSecurityManagers:(NSArray<Class> *)securityManagerClasses forAppId:(NSString *)appId;
-
-/**
- * Puts data into a file on the module. Performs a putFile for a given input stream, performed in chunks, for handling very large files.
- *
- * @param inputStream A stream containing the data to put to the module.
- * @param putFileRPCRequest A SDLPutFile object containing the parameters for the put(s)
- *
- * @discussion: The proxy will read from the stream based on the max MTU size and send them in individual putFile requests. This may result in multiple responses being received, one for each request.
- * @note: The length parameter of the putFileRPCRequest will be ignored. The proxy will substitute the number of bytes read from the stream.
- */
-- (void)putFileStream:(NSInputStream *)inputStream withRequest:(SDLPutFile *)putFileRPCRequest;
-
-/// Disconnects the current app session, including the security manager and primary transport.
-- (void)disconnectSession;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m
deleted file mode 100644
index 8161f7427..000000000
--- a/SmartDeviceLink/SDLProxy.m
+++ /dev/null
@@ -1,1083 +0,0 @@
-// SDLProxy.m
-
-#import "SDLProxy.h"
-
-#import <UIKit/UIKit.h>
-#import <objc/runtime.h>
-
-#import "SDLAudioStreamingState.h"
-#import "SDLLogMacros.h"
-#import "SDLEncodedSyncPData.h"
-#import "SDLEncryptionLifecycleManager.h"
-#import "SDLFileType.h"
-#import "SDLFunctionID.h"
-#import "SDLGlobals.h"
-#import "SDLHMILevel.h"
-#import "SDLIAPTransport.h"
-#import "SDLLanguage.h"
-#import "SDLLayoutMode.h"
-#import "SDLLockScreenStatusManager.h"
-#import "SDLOnButtonEvent.h"
-#import "SDLOnButtonPress.h"
-#import "SDLOnHMIStatus.h"
-#import "SDLOnSystemRequest.h"
-#import "SDLPolicyDataParser.h"
-#import "SDLProtocol.h"
-#import "SDLProtocolMessage.h"
-#import "SDLPutFile.h"
-#import "SDLRPCPayload.h"
-#import "SDLRPCResponse.h"
-#import "SDLRegisterAppInterfaceResponse.h"
-#import "SDLRequestType.h"
-#import "SDLSecondaryTransportManager.h"
-#import "SDLStreamingMediaManager.h"
-#import "SDLSubscribeButton.h"
-#import "SDLSystemContext.h"
-#import "SDLSystemRequest.h"
-#import "SDLTCPTransport.h"
-#import "SDLTimer.h"
-#import "SDLTransportType.h"
-#import "SDLUnsubscribeButton.h"
-#import "SDLVehicleType.h"
-#import "SDLVersion.h"
-#import "SDLCacheFileManager.h"
-
-#import "SDLRPCParameterNames.h"
-#import "SDLRPCFunctionNames.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NSString SDLVehicleMake;
-
-typedef void (^URLSessionTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error);
-typedef void (^URLSessionDownloadTaskCompletionHandler)(NSURL *location, NSURLResponse *response, NSError *error);
-
-NSString *const SDLProxyVersion = @"6.6.0";
-const float StartSessionTime = 10.0;
-const float NotifyProxyClosedDelay = (float)0.1;
-const int PoliciesCorrelationId = 65535;
-static float DefaultConnectionTimeout = 45.0;
-
-@interface SDLProxy () {
- SDLLockScreenStatusManager *_lsm;
-}
-
-@property (copy, nonatomic) NSString *appId;
-@property (strong, nonatomic) NSMutableSet<NSObject<SDLProxyListener> *> *mutableProxyListeners;
-@property (nullable, nonatomic, strong) SDLDisplayCapabilities *displayCapabilities;
-@property (nonatomic, strong) NSMutableDictionary<SDLVehicleMake *, Class> *securityManagers;
-@property (nonatomic, strong) NSURLSession *urlSession;
-@property (nonatomic, strong) SDLCacheFileManager *cacheFileManager;
-
-@end
-
-
-@implementation SDLProxy
-
-#pragma mark - Object lifecycle
-- (instancetype)initWithTransport:(id<SDLTransportType>)transport delegate:(id<SDLProxyListener>)delegate secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager {
- if (self = [super init]) {
- SDLLogD(@"Framework Version: %@", self.proxyVersion);
- _lsm = [[SDLLockScreenStatusManager alloc] init];
- _mutableProxyListeners = [NSMutableSet setWithObject:delegate];
- _securityManagers = [NSMutableDictionary dictionary];
-
- _protocol = [[SDLProtocol alloc] init];
- _transport = transport;
- _transport.delegate = _protocol;
-
- [_protocol.protocolDelegateTable addObject:self];
- _protocol.transport = transport;
-
- // make sure that secondary transport manager is started prior to starting protocol
- if (secondaryTransportManager != nil) {
- [secondaryTransportManager startWithPrimaryProtocol:_protocol];
- }
-
- [self.transport connect];
-
- SDLLogV(@"Proxy transport initialization");
-
- NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
- configuration.timeoutIntervalForRequest = DefaultConnectionTimeout;
- configuration.timeoutIntervalForResource = DefaultConnectionTimeout;
- configuration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
-
- _urlSession = [NSURLSession sessionWithConfiguration:configuration];
- _cacheFileManager = [[SDLCacheFileManager alloc] init];
- }
-
- return self;
-}
-
-- (instancetype)initWithTransport:(id<SDLTransportType>)transport delegate:(id<SDLProxyListener>)delegate secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager encryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager {
- if (self = [super init]) {
- SDLLogD(@"Framework Version: %@", self.proxyVersion);
- _lsm = [[SDLLockScreenStatusManager alloc] init];
- _mutableProxyListeners = [NSMutableSet setWithObject:delegate];
- _securityManagers = [NSMutableDictionary dictionary];
-
- _protocol = [[SDLProtocol alloc] initWithEncryptionLifecycleManager:encryptionLifecycleManager];
- _transport = transport;
- _transport.delegate = _protocol;
-
- [_protocol.protocolDelegateTable addObject:self];
- _protocol.transport = transport;
-
- // make sure that secondary transport manager is started prior to starting protocol
- if (secondaryTransportManager != nil) {
- [secondaryTransportManager startWithPrimaryProtocol:_protocol];
- }
-
- [self.transport connect];
-
- SDLLogV(@"Proxy transport initialization");
-
- NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
- configuration.timeoutIntervalForRequest = DefaultConnectionTimeout;
- configuration.timeoutIntervalForResource = DefaultConnectionTimeout;
- configuration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;
-
- _urlSession = [NSURLSession sessionWithConfiguration:configuration];
- _cacheFileManager = [[SDLCacheFileManager alloc] init];
- }
-
- return self;
-}
-
-
-+ (SDLProxy *)iapProxyWithListener:(id<SDLProxyListener>)delegate secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager {
- SDLIAPTransport *transport = [[SDLIAPTransport alloc] init];
- SDLProxy *ret = [[SDLProxy alloc] initWithTransport:transport delegate:delegate secondaryTransportManager:secondaryTransportManager];
-
- return ret;
-}
-
-+ (SDLProxy *)tcpProxyWithListener:(id<SDLProxyListener>)delegate tcpIPAddress:(NSString *)ipaddress tcpPort:(NSString *)port secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager {
- SDLTCPTransport *transport = [[SDLTCPTransport alloc] initWithHostName:ipaddress portNumber:port];
-
- SDLProxy *ret = [[SDLProxy alloc] initWithTransport:transport delegate:delegate secondaryTransportManager:secondaryTransportManager];
-
- return ret;
-}
-
-+ (SDLProxy *)iapProxyWithListener:(id<SDLProxyListener>)delegate secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager encryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager {
- SDLIAPTransport *transport = [[SDLIAPTransport alloc] init];
- SDLProxy *ret = [[SDLProxy alloc] initWithTransport:transport delegate:delegate secondaryTransportManager:secondaryTransportManager encryptionLifecycleManager:encryptionLifecycleManager];
-
- return ret;
-}
-
-+ (SDLProxy *)tcpProxyWithListener:(id<SDLProxyListener>)delegate tcpIPAddress:(NSString *)ipaddress tcpPort:(NSString *)port secondaryTransportManager:(nullable SDLSecondaryTransportManager *)secondaryTransportManager encryptionLifecycleManager:(SDLEncryptionLifecycleManager *)encryptionLifecycleManager {
- SDLTCPTransport *transport = [[SDLTCPTransport alloc] initWithHostName:ipaddress portNumber:port];
-
- SDLProxy *ret = [[SDLProxy alloc] initWithTransport:transport delegate:delegate secondaryTransportManager:secondaryTransportManager encryptionLifecycleManager:encryptionLifecycleManager];
-
- return ret;
-}
-
-- (void)disconnectSession {
- SDLLogD(@"Disconnecting the proxy; stopping security manager and primary transport.");
- if (self.protocol.securityManager != nil) {
- [self.protocol.securityManager stop];
- }
-
- if (self.transport != nil) {
- [self.transport disconnect];
- }
-
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- [_urlSession invalidateAndCancel];
-}
-
-- (void)dealloc {
- SDLLogV(@"Proxy dealloc");
-}
-
-- (void)sdl_notifyProxyClosed {
- if (_isConnected) {
- _isConnected = NO;
- [self sdl_invokeMethodOnDelegates:@selector(onProxyClosed) withObject:nil];
- }
-}
-
-
-#pragma mark - Application Lifecycle
-
-/// This method sends an OnHMIStatus with the Mobile's HMI level to the head unit.
-/// This was originally designed to make sure that the head unit properly knew about the mobile app's ability to run timers in the background, which affected heartbeat.
-/// It may still affect some features on the head unit and the ability for the head unit to know which app is in the foreground is useful. It should not be removed due to unknown backward compatibility issues.
-- (void)sdl_sendMobileHMIState {
- __block UIApplicationState appState = UIApplicationStateInactive;
- if ([NSThread isMainThread]) {
- appState = [UIApplication sharedApplication].applicationState;
- } else {
- dispatch_sync(dispatch_get_main_queue(), ^{
- appState = [UIApplication sharedApplication].applicationState;
- });
- }
-
- SDLOnHMIStatus *HMIStatusRPC = [[SDLOnHMIStatus alloc] init];
-
- HMIStatusRPC.audioStreamingState = SDLAudioStreamingStateNotAudible;
- HMIStatusRPC.systemContext = SDLSystemContextMain;
-
- switch (appState) {
- case UIApplicationStateActive: {
- HMIStatusRPC.hmiLevel = SDLHMILevelFull;
- } break;
- case UIApplicationStateBackground: // Fallthrough
- case UIApplicationStateInactive: {
- HMIStatusRPC.hmiLevel = SDLHMILevelBackground;
- } break;
- default: break;
- }
-
- SDLLogD(@"Mobile UIApplication state changed, sending to remote system: %@", HMIStatusRPC.hmiLevel);
- [self sendRPC:HMIStatusRPC];
-}
-
-#pragma mark - Accessors
-
-- (NSSet<NSObject<SDLProxyListener> *> *)proxyListeners {
- return [self.mutableProxyListeners copy];
-}
-
-
-#pragma mark - Setters / Getters
-
-- (NSString *)proxyVersion {
- return SDLProxyVersion;
-}
-
-#pragma mark - SecurityManager
-
-- (void)addSecurityManagers:(NSArray<Class> *)securityManagerClasses forAppId:(NSString *)appId {
- NSParameterAssert(securityManagerClasses != nil);
- NSParameterAssert(appId != nil);
- self.appId = appId;
-
- for (Class securityManagerClass in securityManagerClasses) {
- if (![securityManagerClass conformsToProtocol:@protocol(SDLSecurityType)]) {
- NSString *reason = [NSString stringWithFormat:@"Invalid security manager: Class %@ does not conform to SDLSecurityType protocol", NSStringFromClass(securityManagerClass)];
- @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil];
- }
-
- NSSet<NSString *> *vehicleMakes = [securityManagerClass availableMakes];
-
- if (vehicleMakes == nil || vehicleMakes.count == 0) {
- NSString *reason = [NSString stringWithFormat:@"Invalid security manager: Failed to retrieve makes for class %@", NSStringFromClass(securityManagerClass)];
- @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil];
- }
-
- for (NSString *vehicleMake in vehicleMakes) {
- self.securityManagers[vehicleMake] = securityManagerClass;
- }
- }
-}
-
-- (nullable id<SDLSecurityType>)sdl_securityManagerForMake:(NSString *)make {
- if ((make != nil) && (self.securityManagers[make] != nil)) {
- Class securityManagerClass = self.securityManagers[make];
- self.protocol.appId = self.appId;
- return [[securityManagerClass alloc] init];
- }
-
- return nil;
-}
-
-
-#pragma mark - SDLProtocolListener Implementation
-
-- (void)onProtocolOpened {
- _isConnected = YES;
- SDLLogV(@"Proxy RPC protocol opened");
- // The RPC payload will be created by the protocol object...it's weird and confusing, I know.
- [self.protocol startServiceWithType:SDLServiceTypeRPC payload:nil];
-
- if (self.startSessionTimer == nil) {
- self.startSessionTimer = [[SDLTimer alloc] initWithDuration:StartSessionTime repeat:NO];
- __weak typeof(self) weakSelf = self;
- self.startSessionTimer.elapsedBlock = ^{
- SDLLogW(@"Start session timed out");
- [weakSelf performSelector:@selector(sdl_notifyProxyClosed) withObject:nil afterDelay:NotifyProxyClosedDelay];
- };
- }
- [self.startSessionTimer start];
-}
-
-- (void)onProtocolClosed {
- [self sdl_notifyProxyClosed];
-}
-
-- (void)onError:(NSString *)info exception:(NSException *)e {
- [self sdl_invokeMethodOnDelegates:@selector(onError:) withObject:e];
-}
-
-- (void)onTransportError:(NSError *)error {
- [self sdl_invokeMethodOnDelegates:@selector(onTransportError:) withObject:error];
-}
-
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
- // Turn off the timer, the start session response came back
- [self.startSessionTimer cancel];
- SDLLogV(@"StartSession (response)\nSessionId: %d for serviceType %d", startServiceACK.header.sessionID, startServiceACK.header.serviceType);
-
- if (startServiceACK.header.serviceType == SDLServiceTypeRPC) {
- [self sdl_invokeMethodOnDelegates:@selector(onProxyOpened) withObject:nil];
- }
-}
-
-- (void)onProtocolMessageReceived:(SDLProtocolMessage *)msgData {
- @try {
- [self handleProtocolMessage:msgData];
- } @catch (NSException *e) {
- SDLLogW(@"Proxy: Failed to handle protocol message %@", e);
- }
-}
-
-
-#pragma mark - Message sending
-- (void)sendRPC:(SDLRPCMessage *)message {
- if ([message.name isEqualToString:SDLRPCFunctionNameSubscribeButton]) {
- BOOL handledRPC = [self sdl_adaptButtonSubscribeMessage:(SDLSubscribeButton *)message];
- if (handledRPC) { return; }
- } else if ([message.name isEqualToString:SDLRPCFunctionNameUnsubscribeButton]) {
- BOOL handledRPC = [self sdl_adaptButtonUnsubscribeMessage:(SDLUnsubscribeButton *)message];
- if (handledRPC) { return; }
- }
-
- @try {
- [self.protocol sendRPC:message];
- } @catch (NSException *exception) {
- SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name);
- }
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (BOOL)sdl_adaptButtonSubscribeMessage:(SDLSubscribeButton *)message {
- if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
- if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- SDLSubscribeButton *playPauseMessage = [message copy];
- playPauseMessage.buttonName = SDLButtonNamePlayPause;
-
- @try {
- [self.protocol sendRPC:message];
- [self.protocol sendRPC:playPauseMessage];
- } @catch (NSException *exception) {
- SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name);
- }
-
- return YES;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- return NO;
- }
- } else { // Major version < 5
- if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- return NO;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- SDLSubscribeButton *okMessage = [message copy];
- okMessage.buttonName = SDLButtonNameOk;
-
- @try {
- [self.protocol sendRPC:okMessage];
- } @catch (NSException *exception) {
- SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name);
- }
-
- return YES;
- }
- }
-
- return NO;
-}
-
-- (BOOL)sdl_adaptButtonUnsubscribeMessage:(SDLUnsubscribeButton *)message {
- if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
- if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- SDLUnsubscribeButton *playPauseMessage = [message copy];
- playPauseMessage.buttonName = SDLButtonNamePlayPause;
-
- @try {
- [self.protocol sendRPC:message];
- [self.protocol sendRPC:playPauseMessage];
- } @catch (NSException *exception) {
- SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name);
- }
-
- return YES;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- return NO;
- }
- } else { // Major version < 5
- if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- return NO;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- SDLUnsubscribeButton *okMessage = [message copy];
- okMessage.buttonName = SDLButtonNameOk;
-
- @try {
- [self.protocol sendRPC:okMessage];
- } @catch (NSException *exception) {
- SDLLogE(@"Proxy: Failed to send RPC message: %@", message.name);
- }
-
- return YES;
- }
- }
-
- return NO;
-}
-#pragma clang diagnostic pop
-
-#pragma mark - Message Receiving
-
-- (void)handleProtocolMessage:(SDLProtocolMessage *)incomingMessage {
- // Convert protocol message to dictionary
- NSDictionary<NSString *, id> *rpcMessageAsDictionary = [incomingMessage rpcDictionary];
- [self handleRPCDictionary:rpcMessageAsDictionary];
-}
-
-- (void)handleRPCDictionary:(NSDictionary<NSString *, id> *)dict {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLRPCMessage *message = [[SDLRPCMessage alloc] initWithDictionary:[dict mutableCopy]];
-#pragma clang diagnostic pop
- NSString *functionName = message.name;
- NSString *messageType = message.messageType;
-
- // If it's a response, append response
- if ([messageType isEqualToString:SDLRPCParameterNameResponse]) {
- BOOL notGenericResponseMessage = ![functionName isEqualToString:SDLRPCFunctionNameGenericResponse];
- if (notGenericResponseMessage) {
- functionName = [NSString stringWithFormat:@"%@Response", functionName];
- }
- }
-
- // From the function name, create the corresponding RPCObject and initialize it
- NSString *functionClassName = [NSString stringWithFormat:@"SDL%@", functionName];
- SDLRPCMessage *newMessage = [[NSClassFromString(functionClassName) alloc] initWithDictionary:[dict mutableCopy]];
-
- // Log the RPC message
- SDLLogV(@"Message received: %@", newMessage);
-
- // Intercept and handle several messages ourselves
-
- if ([functionName isEqualToString:@"RegisterAppInterfaceResponse"]) {
- [self handleRegisterAppInterfaceResponse:(SDLRPCResponse *)newMessage];
- }
-
- if ([functionName isEqualToString:@"OnEncodedSyncPData"]) {
- [self sdl_handleSyncPData:newMessage];
- }
-
- if ([functionName isEqualToString:@"OnSystemRequest"]) {
- [self sdl_handleSystemRequest:dict];
- }
-
- if ([functionName isEqualToString:@"SystemRequestResponse"]) {
- [self sdl_handleSystemRequestResponse:newMessage];
- }
-
-
- if ([functionName isEqualToString:@"OnButtonPress"]) {
- SDLOnButtonPress *message = (SDLOnButtonPress *)newMessage;
- if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
- BOOL handledRPC = [self sdl_handleOnButtonPressPostV5:message];
- if (handledRPC) { return; }
- } else { // RPC version of 4 or less (connected to an old head unit)
- BOOL handledRPC = [self sdl_handleOnButtonPressPreV5:message];
- if (handledRPC) { return; }
- }
- }
-
- if ([functionName isEqualToString:@"OnButtonEvent"]) {
- SDLOnButtonEvent *message = (SDLOnButtonEvent *)newMessage;
- if ([SDLGlobals sharedGlobals].rpcVersion.major >= 5) {
- BOOL handledRPC = [self sdl_handleOnButtonEventPostV5:message];
- if (handledRPC) { return; }
- } else {
- BOOL handledRPC = [self sdl_handleOnButtonEventPreV5:message];
- if (handledRPC) { return; }
- }
- }
-
- [self sdl_invokeDelegateMethodsWithFunction:functionName message:newMessage];
-
- //Intercepting SDLRPCFunctionNameOnAppInterfaceUnregistered must happen after it is broadcasted as a notification above. This will prevent reconnection attempts in the lifecycle manager when the AppInterfaceUnregisteredReason should prevent reconnections.
- if ([functionName isEqualToString:SDLRPCFunctionNameOnAppInterfaceUnregistered] || [functionName isEqualToString:SDLRPCFunctionNameUnregisterAppInterface]) {
- [self sdl_handleRPCUnregistered:dict];
- }
-
- // When an OnHMIStatus notification comes in, after passing it on (above), generate an "OnLockScreenNotification"
- if ([functionName isEqualToString:@"OnHMIStatus"]) {
- [self sdl_handleAfterHMIStatus:newMessage];
- }
-
- // When an OnDriverDistraction notification comes in, after passing it on (above), generate an "OnLockScreenNotification"
- if ([functionName isEqualToString:@"OnDriverDistraction"]) {
- [self sdl_handleAfterDriverDistraction:newMessage];
- }
-}
-
-- (void)sdl_invokeDelegateMethodsWithFunction:(NSString *)functionName message:(SDLRPCMessage *)message {
- // Formulate the name of the method to call and invoke the method on the delegate(s)
- NSString *handlerName = [NSString stringWithFormat:@"on%@:", functionName];
- SEL handlerSelector = NSSelectorFromString(handlerName);
- [self sdl_invokeMethodOnDelegates:handlerSelector withObject:message];
-}
-
-
-#pragma mark - RPC Handlers
-
-- (void)sdl_handleRPCUnregistered:(NSDictionary<NSString *, id> *)messageDictionary {
- SDLLogW(@"Unregistration forced by module. %@", messageDictionary);
- [self sdl_notifyProxyClosed];
-}
-
-- (void)handleRegisterAppInterfaceResponse:(SDLRPCResponse *)response {
- SDLRegisterAppInterfaceResponse *registerResponse = (SDLRegisterAppInterfaceResponse *)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.appId;
- }
-
- if ([SDLGlobals sharedGlobals].protocolVersion.major >= 4) {
- [self sdl_sendMobileHMIState];
- // Send SDL updates to application state
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_sendMobileHMIState) name:UIApplicationDidBecomeActiveNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_sendMobileHMIState) name:UIApplicationDidEnterBackgroundNotification object:nil];
- }
-}
-
-- (void)sdl_handleSyncPData:(SDLRPCMessage *)message {
- // If URL != nil, perform HTTP Post and don't pass the notification to proxy listeners
- SDLLogV(@"OnEncodedSyncPData: %@", message);
-
- NSString *urlString = (NSString *)message.parameters[SDLRPCParameterNameURLUppercase];
- NSDictionary<NSString *, id> *encodedSyncPData = (NSDictionary<NSString *, id> *)message.parameters[SDLRPCParameterNameData];
- NSNumber *encodedSyncPTimeout = (NSNumber *)message.parameters[SDLRPCParameterNameTimeoutCapitalized];
-
- if (urlString && encodedSyncPData && encodedSyncPTimeout) {
- [self sdl_sendEncodedSyncPData:encodedSyncPData toURL:urlString withTimeout:encodedSyncPTimeout];
- }
-}
-
-- (void)sdl_handleSystemRequest:(NSDictionary<NSString *, id> *)dict {
- SDLLogV(@"OnSystemRequest");
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLOnSystemRequest *systemRequest = [[SDLOnSystemRequest alloc] initWithDictionary:[dict mutableCopy]];
- SDLRequestType requestType = systemRequest.requestType;
-#pragma clang diagnostic pop
-
- // Handle the various OnSystemRequest types
- if ([requestType isEqualToEnum:SDLRequestTypeProprietary]) {
- [self sdl_handleSystemRequestProprietary:systemRequest];
- } else if ([requestType isEqualToEnum:SDLRequestTypeLockScreenIconURL]) {
- [self sdl_handleSystemRequestLockScreenIconURL:systemRequest];
- } else if ([requestType isEqualToEnum:SDLRequestTypeIconURL]) {
- [self sdl_handleSystemRequestIconURL:systemRequest];
- } else if ([requestType isEqualToEnum:SDLRequestTypeHTTP]) {
- [self sdl_handleSystemRequestHTTP:systemRequest];
- } else if ([requestType isEqualToEnum:SDLRequestTypeLaunchApp]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self sdl_handleSystemRequestLaunchApp:systemRequest];
- });
- }
-}
-
-- (void)sdl_handleSystemRequestResponse:(SDLRPCMessage *)message {
- SDLLogV(@"SystemRequestResponse to be discarded");
-}
-
-#pragma mark BackCompatability ButtonName Helpers
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (BOOL)sdl_handleOnButtonPressPreV5:(SDLOnButtonPress *)message {
- // Drop PlayPause, this shouldn't come in
- if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- return YES;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- // Send Ok and Play/Pause notifications
- SDLOnButtonPress *playPausePress = [message copy];
- playPausePress.buttonName = SDLButtonNamePlayPause;
-
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPausePress];
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message];
- return YES;
- }
-
- return NO;
-}
-
-- (BOOL)sdl_handleOnButtonPressPostV5:(SDLOnButtonPress *)message {
- if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- // Send PlayPause & OK notifications
- SDLOnButtonPress *okPress = [message copy];
- okPress.buttonName = SDLButtonNameOk;
-
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okPress];
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message];
- return YES;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- // Send PlayPause and OK notifications
- SDLOnButtonPress *playPausePress = [message copy];
- playPausePress.buttonName = SDLButtonNamePlayPause;
-
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPausePress];
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message];
- return YES;
- }
-
- return NO;
-}
-
-- (BOOL)sdl_handleOnButtonEventPreV5:(SDLOnButtonEvent *)message {
- // Drop PlayPause, this shouldn't come in
- if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- return YES;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- // Send Ok and Play/Pause notifications
- SDLOnButtonEvent *playPauseEvent = [message copy];
- playPauseEvent.buttonName = SDLButtonNamePlayPause;
-
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPauseEvent];
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message];
- return YES;
- }
-
- return NO;
-}
-
-- (BOOL)sdl_handleOnButtonEventPostV5:(SDLOnButtonEvent *)message {
- if ([message.buttonName isEqualToEnum:SDLButtonNamePlayPause]) {
- // Send PlayPause & OK notifications
- SDLOnButtonEvent *okEvent = [message copy];
- okEvent.buttonName = SDLButtonNameOk;
-
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:okEvent];
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message];
- return YES;
- } else if ([message.buttonName isEqualToEnum:SDLButtonNameOk]) {
- // Send PlayPause and OK notifications
- SDLOnButtonEvent *playPauseEvent = [message copy];
- playPauseEvent.buttonName = SDLButtonNamePlayPause;
-
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:playPauseEvent];
- [self sdl_invokeDelegateMethodsWithFunction:message.getFunctionName message:message];
- return YES;
- }
-
- return NO;
-}
-#pragma clang diagnostic pop
-
-
-#pragma mark Handle Post-Invoke of Delegate Methods
-- (void)sdl_handleAfterHMIStatus:(SDLRPCMessage *)message {
- SDLHMILevel hmiLevel = (SDLHMILevel)message.parameters[SDLRPCParameterNameHMILevel];
- _lsm.hmiLevel = hmiLevel;
-
- SEL callbackSelector = NSSelectorFromString(@"onOnLockScreenNotification:");
- [self sdl_invokeMethodOnDelegates:callbackSelector withObject:_lsm.lockScreenStatusNotification];
-}
-
-- (void)sdl_handleAfterDriverDistraction:(SDLRPCMessage *)message {
- NSString *stateString = (NSString *)message.parameters[SDLRPCParameterNameState];
- BOOL state = [stateString isEqualToString:@"DD_ON"] ? YES : NO;
- _lsm.driverDistracted = state;
-
- SEL callbackSelector = NSSelectorFromString(@"onOnLockScreenNotification:");
- [self sdl_invokeMethodOnDelegates:callbackSelector withObject:_lsm.lockScreenStatusNotification];
-}
-
-
-#pragma mark OnSystemRequest Handlers
-- (void)sdl_handleSystemRequestLaunchApp:(SDLOnSystemRequest *)request {
- NSURL *URLScheme = [NSURL URLWithString:request.url];
- if (URLScheme == nil) {
- SDLLogW(@"System request LaunchApp failed: invalid URL sent from module: %@", request.url);
- return;
- }
- // If system version is less than 9.0 http://stackoverflow.com/a/5337804/1370927
- if (SDL_SYSTEM_VERSION_LESS_THAN(@"9.0")) {
- // Return early if we can't openURL because openURL will crash instead of fail silently in < 9.0
- if (![[UIApplication sharedApplication] canOpenURL:URLScheme]) {
- return;
- }
- }
- [[UIApplication sharedApplication] openURL:URLScheme];
-}
-
-- (void)sdl_handleSystemRequestProprietary:(SDLOnSystemRequest *)request {
- NSDictionary<NSString *, id> *JSONDictionary = [self sdl_validateAndParseSystemRequest:request];
- if (JSONDictionary == nil || request.url == nil) {
- return;
- }
-
- NSDictionary<NSString *, id> *requestData = JSONDictionary[@"HTTPRequest"];
- NSString *bodyString = requestData[@"body"];
- NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
-
- // Parse and display the policy data.
- SDLPolicyDataParser *pdp = [[SDLPolicyDataParser alloc] init];
- NSData *policyData = [pdp unwrap:bodyData];
- if (policyData != nil) {
- [pdp parsePolicyData:policyData];
- SDLLogV(@"Policy data received");
- }
-
- // Send the HTTP Request
- __weak typeof(self) weakSelf = self;
- [self sdl_uploadForBodyDataDictionary:JSONDictionary
- urlString:request.url
- completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
- __strong typeof(weakSelf) strongSelf = weakSelf;
-
- if (error) {
- SDLLogW(@"OnSystemRequest HTTP response error: %@", error);
- return;
- }
-
- if (data == nil || data.length == 0) {
- SDLLogW(@"OnSystemRequest HTTP response error: no data received");
- return;
- }
-
- // Create the SystemRequest RPC to send to module.
- SDLLogV(@"OnSystemRequest HTTP response");
- SDLSystemRequest *request = [[SDLSystemRequest alloc] init];
- request.correlationID = [NSNumber numberWithInt:PoliciesCorrelationId];
- request.requestType = SDLRequestTypeProprietary;
- request.bulkData = data;
-
- // Parse and display the policy data.
- SDLPolicyDataParser *pdp = [[SDLPolicyDataParser alloc] init];
- NSData *policyData = [pdp unwrap:data];
- if (policyData) {
- [pdp parsePolicyData:policyData];
- SDLLogV(@"Cloud policy data: %@", pdp);
- }
-
- // Send the RPC Request
- [strongSelf sendRPC:request];
- }];
-}
-
-- (void)sdl_handleSystemRequestLockScreenIconURL:(SDLOnSystemRequest *)request {
- __weak typeof(self) weakSelf = self;
- [self.cacheFileManager retrieveImageForRequest:request withCompletionHandler:^(UIImage * _Nullable image, NSError * _Nullable error) {
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (error != nil) {
- SDLLogW(@"Failed to retrieve lock screen icon: %@", error.localizedDescription);
- return;
- }
-
- [strongSelf sdl_invokeMethodOnDelegates:@selector(onReceivedLockScreenIcon:) withObject:image];
- }];
-}
-
-- (void)sdl_handleSystemRequestIconURL:(SDLOnSystemRequest *)request {
- __weak typeof(self) weakSelf = self;
- [self sdl_sendDataTaskWithURL:[NSURL URLWithString:request.url]
- completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (error != nil) {
- SDLLogW(@"OnSystemRequest (icon url) HTTP download task failed: %@", error.localizedDescription);
- return;
- } else if (data.length == 0) {
- SDLLogW(@"OnSystemRequest (icon url) HTTP download task failed to get the cloud app icon image data");
- return;
- }
-
- SDLSystemRequest *iconURLSystemRequest = [[SDLSystemRequest alloc] initWithType:SDLRequestTypeIconURL fileName:request.url];
- iconURLSystemRequest.bulkData = data;
-
- [strongSelf sendRPC:iconURLSystemRequest];
- }];
-}
-
-- (void)sdl_handleSystemRequestHTTP:(SDLOnSystemRequest *)request {
- if (request.bulkData.length == 0) {
- // TODO: not sure how we want to handle http requests that don't have bulk data (maybe as GET?)
- return;
- }
-
- __weak typeof(self) weakSelf = self;
- [self sdl_uploadData:request.bulkData
- toURLString:request.url
- completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (error != nil) {
- SDLLogW(@"OnSystemRequest (HTTP) error: %@", error.localizedDescription);
- return;
- }
-
- if (data.length == 0) {
- SDLLogW(@"OnSystemRequest (HTTP) error: no data returned");
- return;
- }
-
- // Show the HTTP response
- SDLLogV(@"OnSystemRequest (HTTP) response: %@", response);
-
- // Create the SystemRequest RPC to send to module.
- SDLPutFile *putFile = [[SDLPutFile alloc] init];
- putFile.fileType = SDLFileTypeJSON;
- putFile.correlationID = @(PoliciesCorrelationId);
- putFile.syncFileName = @"response_data";
- putFile.bulkData = data;
-
- // Send RPC Request
- [strongSelf sendRPC:putFile];
- }];
-}
-
-/**
- * Determine if the System Request is valid and return it's JSON dictionary, if available.
- *
- * @param request The system request to parse
- *
- * @return A parsed JSON dictionary, or nil if it couldn't be parsed
- */
-- (nullable NSDictionary<NSString *, id> *)sdl_validateAndParseSystemRequest:(SDLOnSystemRequest *)request {
- NSString *urlString = request.url;
- SDLFileType fileType = request.fileType;
-
- // Validate input
- if (urlString == nil || [NSURL URLWithString:urlString] == nil) {
- SDLLogW(@"OnSystemRequest validation failure: URL is nil");
- return nil;
- }
-
- if (![fileType isEqualToEnum:SDLFileTypeJSON]) {
- SDLLogW(@"OnSystemRequest validation failure: file type is not JSON");
- return nil;
- }
-
- // Get data dictionary from the bulkData
- NSError *error = nil;
- NSDictionary<NSString *, id> *JSONDictionary = [NSJSONSerialization JSONObjectWithData:request.bulkData options:kNilOptions error:&error];
- if (error != nil) {
- SDLLogW(@"OnSystemRequest validation failure: data is not valid JSON");
- return nil;
- }
-
- return JSONDictionary;
-}
-
-/**
- * Start an upload for some data to a web address specified
- *
- * @param data The data to be passed to the server
- * @param urlString The URL the data should be POSTed to
- * @param completionHandler A completion handler of what to do when the server responds
- */
-- (void)sdl_uploadData:(NSData *_Nonnull)data toURLString:(NSString *_Nonnull)urlString completionHandler:(URLSessionTaskCompletionHandler _Nullable)completionHandler {
- // NSURLRequest configuration
- NSURL *url = [NSURL URLWithString:urlString];
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
- [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
- request.HTTPMethod = @"POST";
-
- SDLLogV(@"OnSystemRequest (HTTP) upload task created for URL: %@", urlString);
-
- // Create the upload task
- [self sdl_sendUploadRequest:request withData:data completionHandler:completionHandler];
-}
-
-/**
- * Start an upload for a body data dictionary, this is used by the "proprietary" system request needed for backward compatibility
- *
- * @param dictionary The system request dictionary that contains the HTTP data to be sent
- * @param urlString A string containing the URL to send the upload to
- * @param completionHandler A completion handler returning the response from the server to the upload task
- */
-- (void)sdl_uploadForBodyDataDictionary:(NSDictionary<NSString *, id> *)dictionary urlString:(NSString *)urlString completionHandler:(URLSessionTaskCompletionHandler)completionHandler {
- NSParameterAssert(dictionary != nil);
- NSParameterAssert(urlString != nil);
- NSParameterAssert(completionHandler != NULL);
-
- // Extract data from the dictionary
- NSDictionary<NSString *, id> *requestData = dictionary[@"HTTPRequest"];
- NSDictionary *headers = requestData[@"headers"];
- NSString *contentType = headers[@"ContentType"];
- NSTimeInterval timeout = [headers[@"ConnectTimeout"] doubleValue];
- NSString *method = headers[@"RequestMethod"];
- NSString *bodyString = requestData[@"body"];
- NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
-
- // NSURLRequest configuration
- NSURL *url = [NSURL URLWithString:urlString];
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
- [request setValue:contentType forHTTPHeaderField:@"content-type"];
- request.timeoutInterval = timeout;
- request.HTTPMethod = method;
-
- SDLLogV(@"OnSystemRequest (Proprietary) upload task created for URL: %@", urlString);
-
- // Create the upload task
- [self sdl_sendUploadRequest:request withData:bodyData completionHandler:completionHandler];
-}
-
-- (void)sdl_sendUploadRequest:(NSURLRequest*)request withData:(NSData*)data completionHandler:(URLSessionTaskCompletionHandler)completionHandler {
- NSMutableURLRequest* mutableRequest = [request mutableCopy];
-
- if ([mutableRequest.URL.scheme isEqualToString:@"http"]) {
- mutableRequest.URL = [NSURL URLWithString:[mutableRequest.URL.absoluteString stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:@"https"]];
- }
-
- [[self.urlSession uploadTaskWithRequest:request fromData:data completionHandler:completionHandler] resume];
-}
-
-- (void)sdl_sendDataTaskWithURL:(NSURL*)url completionHandler:(URLSessionTaskCompletionHandler)completionHandler {
- if ([url.scheme isEqualToString:@"http"]) {
- url = [NSURL URLWithString:[url.absoluteString stringByReplacingCharactersInRange:NSMakeRange(0, 4) withString:@"https"]];
- }
-
- [[self.urlSession dataTaskWithURL:url completionHandler:completionHandler] resume];
-}
-
-#pragma mark - Delegate management
-
-- (void)addDelegate:(NSObject<SDLProxyListener> *)delegate {
- @synchronized(self.mutableProxyListeners) {
- [self.mutableProxyListeners addObject:delegate];
- }
-}
-
-- (void)removeDelegate:(NSObject<SDLProxyListener> *)delegate {
- @synchronized(self.mutableProxyListeners) {
- [self.mutableProxyListeners removeObject:delegate];
- }
-}
-
-- (void)sdl_invokeMethodOnDelegates:(SEL)aSelector withObject:(nullable id)object {
- // Occurs on the processing serial queue
- for (id<SDLProxyListener> listener in self.proxyListeners) {
- if ([listener respondsToSelector:aSelector]) {
- // HAX: http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown
- ((void (*)(id, SEL, id))[(NSObject *)listener methodForSelector:aSelector])(listener, aSelector, object);
- }
- }
-}
-
-
-#pragma mark - System Request and SyncP handling
-
-- (void)sdl_sendEncodedSyncPData:(NSDictionary<NSString *, id> *)encodedSyncPData toURL:(NSString *)urlString withTimeout:(NSNumber *)timeout {
- // Configure HTTP URL & Request
- NSURL *url = [NSURL URLWithString:urlString];
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
- request.HTTPMethod = @"POST";
- [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
- request.timeoutInterval = 60;
-
- // Prepare the data in the required format
- NSString *encodedSyncPDataString = [[NSString stringWithFormat:@"%@", encodedSyncPData] componentsSeparatedByString:@"\""][1];
- NSArray<NSString *> *array = [NSArray arrayWithObject:encodedSyncPDataString];
- NSDictionary<NSString *, id> *dictionary = @{ @"data": array };
- NSError *JSONSerializationError = nil;
- NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:&JSONSerializationError];
- if (JSONSerializationError) {
- SDLLogW(@"Error attempting to create SyncPData for HTTP request: %@", JSONSerializationError);
- return;
- }
-
- // Send the HTTP Request
- __weak typeof(self) weakSelf = self;
- [[self.urlSession uploadTaskWithRequest:request
- fromData:data
- completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
- [weakSelf sdl_syncPDataNetworkRequestCompleteWithData:data response:response error:error];
- }] resume];
-
- SDLLogV(@"OnEncodedSyncPData (HTTP Request)");
-}
-
-// Handle the OnEncodedSyncPData HTTP Response
-- (void)sdl_syncPDataNetworkRequestCompleteWithData:(NSData *)data response:(NSURLResponse *)response error:(NSError *)error {
- // Sample of response: {"data":["SDLKGLSDKFJLKSjdslkfjslkJLKDSGLKSDJFLKSDJF"]}
- SDLLogV(@"OnEncodedSyncPData (HTTP Response): %@", response);
-
- // Validate response data.
- if (data == nil || data.length == 0) {
- SDLLogW(@"OnEncodedSyncPData (HTTP Response): no data returned");
- return;
- }
-
- // Convert data to RPCRequest
- NSError *JSONConversionError = nil;
- NSDictionary<NSString *, id> *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONConversionError];
- if (!JSONConversionError) {
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLEncodedSyncPData *request = [[SDLEncodedSyncPData alloc] init];
- #pragma clang diagnostic pop
- request.correlationID = [NSNumber numberWithInt:PoliciesCorrelationId];
- request.data = [responseDictionary objectForKey:@"data"];
-
- [self sendRPC:request];
- }
-}
-
-
-#pragma mark - PutFile Streaming
-- (void)putFileStream:(NSInputStream *)inputStream withRequest:(SDLPutFile *)putFileRPCRequest {
- inputStream.delegate = self;
- objc_setAssociatedObject(inputStream, @"SDLPutFile", putFileRPCRequest, OBJC_ASSOCIATION_RETAIN);
- objc_setAssociatedObject(inputStream, @"BaseOffset", [putFileRPCRequest offset], OBJC_ASSOCIATION_RETAIN);
-
- [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- [inputStream open];
-}
-
-- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
- switch (eventCode) {
- case NSStreamEventHasBytesAvailable: {
- // Grab some bytes from the stream and send them in a SDLPutFile RPC Request
- NSUInteger currentStreamOffset = [[stream propertyForKey:NSStreamFileCurrentOffsetKey] unsignedIntegerValue];
-
- NSMutableData *buffer = [NSMutableData dataWithLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]];
- NSInteger nBytesRead = [(NSInputStream *)stream read:(uint8_t *)buffer.mutableBytes maxLength:buffer.length];
- if (nBytesRead > 0) {
- NSData *data = [buffer subdataWithRange:NSMakeRange(0, (NSUInteger)nBytesRead)];
- NSUInteger baseOffset = [(NSNumber *)objc_getAssociatedObject(stream, @"BaseOffset") unsignedIntegerValue];
- NSUInteger newOffset = baseOffset + currentStreamOffset;
-
- SDLPutFile *putFileRPCRequest = (SDLPutFile *)objc_getAssociatedObject(stream, @"SDLPutFile");
- [putFileRPCRequest setOffset:[NSNumber numberWithUnsignedInteger:newOffset]];
- [putFileRPCRequest setLength:[NSNumber numberWithUnsignedInteger:(NSUInteger)nBytesRead]];
- [putFileRPCRequest setBulkData:data];
-
- [self sendRPC:putFileRPCRequest];
- }
-
- break;
- }
- case NSStreamEventEndEncountered: {
- // Cleanup the stream
- [stream close];
- [stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
-
- break;
- }
- case NSStreamEventErrorOccurred: {
- SDLLogE(@"NSStream error attempting to upload putfile stream: %lu", (unsigned long)eventCode);
- break;
- }
- default: {
- break;
- }
- }
-}
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLProxyListener.h b/SmartDeviceLink/SDLProxyListener.h
deleted file mode 100644
index 3513e2202..000000000
--- a/SmartDeviceLink/SDLProxyListener.h
+++ /dev/null
@@ -1,1261 +0,0 @@
-// SDLProxyListener.h
-//
-
-#import <UIKit/UIKit.h>
-
-@class SDLAddCommand;
-@class SDLAddCommandResponse;
-@class SDLAddSubMenu;
-@class SDLAddSubMenuResponse;
-@class SDLAlert;
-@class SDLAlertManeuver;
-@class SDLAlertManeuverResponse;
-@class SDLAlertResponse;
-@class SDLButtonPress;
-@class SDLButtonPressResponse;
-@class SDLCancelInteraction;
-@class SDLCancelInteractionResponse;
-@class SDLChangeRegistration;
-@class SDLChangeRegistrationResponse;
-@class SDLCloseApplication;
-@class SDLCloseApplicationResponse;
-@class SDLCreateInteractionChoiceSet;
-@class SDLCreateInteractionChoiceSetResponse;
-@class SDLCreateWindow;
-@class SDLCreateWindowResponse;
-@class SDLDeleteCommand;
-@class SDLDeleteCommandResponse;
-@class SDLDeleteFile;
-@class SDLDeleteFileResponse;
-@class SDLDeleteInteractionChoiceSet;
-@class SDLDeleteInteractionChoiceSetResponse;
-@class SDLDeleteSubMenu;
-@class SDLDeleteSubMenuResponse;
-@class SDLDeleteWindow;
-@class SDLDeleteWindowResponse;
-@class SDLDiagnosticMessage;
-@class SDLDiagnosticMessageResponse;
-@class SDLDialNumber;
-@class SDLDialNumberResponse;
-@class SDLEncodedSyncPData;
-@class SDLEncodedSyncPDataResponse;
-@class SDLEndAudioPassThru;
-@class SDLEndAudioPassThruResponse;
-@class SDLGenericResponse;
-@class SDLGetCloudAppProperties;
-@class SDLGetCloudAppPropertiesResponse;
-@class SDLGetAppServiceData;
-@class SDLGetAppServiceDataResponse;
-@class SDLGetDTCs;
-@class SDLGetDTCsResponse;
-@class SDLGetFile;
-@class SDLGetFileResponse;
-@class SDLGetInteriorVehicleData;
-@class SDLGetInteriorVehicleDataResponse;
-@class SDLGetInteriorVehicleDataConsent;
-@class SDLGetInteriorVehicleDataConsentResponse;
-@class SDLGetSystemCapability;
-@class SDLGetSystemCapabilityResponse;
-@class SDLGetVehicleData;
-@class SDLGetVehicleDataResponse;
-@class SDLGetWayPoints;
-@class SDLGetWayPointsResponse;
-@class SDLListFiles;
-@class SDLListFilesResponse;
-@class SDLOnAppInterfaceUnregistered;
-@class SDLOnAppServiceData;
-@class SDLOnAudioPassThru;
-@class SDLOnButtonEvent;
-@class SDLOnButtonPress;
-@class SDLOnCommand;
-@class SDLOnDriverDistraction;
-@class SDLOnEncodedSyncPData;
-@class SDLOnHashChange;
-@class SDLOnHMIStatus;
-@class SDLOnInteriorVehicleData;
-@class SDLOnKeyboardInput;
-@class SDLOnLanguageChange;
-@class SDLOnLockScreenStatus;
-@class SDLOnPermissionsChange;
-@class SDLOnRCStatus;
-@class SDLOnSyncPData;
-@class SDLOnSystemCapabilityUpdated;
-@class SDLOnSystemRequest;
-@class SDLOnTBTClientState;
-@class SDLOnTouchEvent;
-@class SDLOnVehicleData;
-@class SDLOnWayPointChange;
-@class SDLPerformAppServiceInteraction;
-@class SDLPerformAppServiceInteractionResponse;
-@class SDLPerformAudioPassThru;
-@class SDLPerformAudioPassThruResponse;
-@class SDLPerformInteraction;
-@class SDLPerformInteractionResponse;
-@class SDLPublishAppService;
-@class SDLPublishAppServiceResponse;
-@class SDLPutFile;
-@class SDLPutFileResponse;
-@class SDLReadDID;
-@class SDLReadDIDResponse;
-@class SDLRegisterAppInterface;
-@class SDLRegisterAppInterfaceResponse;
-@class SDLReleaseInteriorVehicleDataModule;
-@class SDLReleaseInteriorVehicleDataModuleResponse;
-@class SDLResetGlobalProperties;
-@class SDLResetGlobalPropertiesResponse;
-@class SDLScrollableMessage;
-@class SDLScrollableMessageResponse;
-@class SDLSendHapticData;
-@class SDLSendHapticDataResponse;
-@class SDLSendLocation;
-@class SDLSendLocationResponse;
-@class SDLSetAppIcon;
-@class SDLSetAppIconResponse;
-@class SDLSetCloudAppProperties;
-@class SDLSetCloudAppPropertiesResponse;
-@class SDLSetDisplayLayout;
-@class SDLSetDisplayLayoutResponse;
-@class SDLSetGlobalProperties;
-@class SDLSetGlobalPropertiesResponse;
-@class SDLSetInteriorVehicleData;
-@class SDLSetInteriorVehicleDataResponse;
-@class SDLSetMediaClockTimer;
-@class SDLSetMediaClockTimerResponse;
-@class SDLShow;
-@class SDLShowAppMenu;
-@class SDLShowAppMenuResponse;
-@class SDLShowConstantTBT;
-@class SDLShowConstantTBTResponse;
-@class SDLShowResponse;
-@class SDLSlider;
-@class SDLSliderResponse;
-@class SDLSpeak;
-@class SDLSpeakResponse;
-@class SDLSubscribeButton;
-@class SDLSubscribeButtonResponse;
-@class SDLSubscribeVehicleData;
-@class SDLSubscribeVehicleDataResponse;
-@class SDLSubscribeWayPoints;
-@class SDLSubscribeWayPointsResponse;
-@class SDLSyncPData;
-@class SDLSyncPDataResponse;
-@class SDLSystemRequest;
-@class SDLUnpublishAppService;
-@class SDLUnpublishAppServiceResponse;
-@class SDLUnregisterAppInterface;
-@class SDLUnregisterAppInterfaceResponse;
-@class SDLUnsubscribeButton;
-@class SDLUnsubscribeButtonResponse;
-@class SDLUnsubscribeVehicleData;
-@class SDLUnsubscribeVehicleDataResponse;
-@class SDLUnsubscribeWayPoints;
-@class SDLUnsubscribeWayPointsResponse;
-@class SDLUpdateTurnList;
-@class SDLUpdateTurnListResponse;
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol SDLProxyListener <NSObject>
-
-/**
- * Called when a Driver Distraction notification is received from Core
- *
- * @param notification A SDLOnDriverDistraction object
- */
-- (void)onOnDriverDistraction:(SDLOnDriverDistraction *)notification;
-
-/**
- * Called when the HMI Status of the SDL app has changed
- *
- * @param notification A SDLOnHMIStatus object
- */
-- (void)onOnHMIStatus:(SDLOnHMIStatus *)notification;
-
-/**
- * Called when a connection with Core has closed
- */
-- (void)onProxyClosed;
-
-/**
- * Called when a connection with Core has been established
- */
-- (void)onProxyOpened;
-
-@optional
-
-#pragma mark - Responses
-
-/**
- * Called when an Add Command Response is received from Core
- *
- * @param response A SDLAddCommandResponse object
- */
-- (void)onAddCommandResponse:(SDLAddCommandResponse *)response;
-
-/**
- * Called when an Add SubMenu Response is received from Core
- *
- * @param response A SDLAddSubMenuResponse object
- */
-- (void)onAddSubMenuResponse:(SDLAddSubMenuResponse *)response;
-
-/**
- * Called when a Alert Maneuver Response is received from Core
- *
- * @param response A SDLAlertManeuverResponse object
- */
-- (void)onAlertManeuverResponse:(SDLAlertManeuverResponse *)response;
-
-/**
- * Called when a Alert Response is received from Core
- *
- * @param response A SDLAlertResponse object
- */
-- (void)onAlertResponse:(SDLAlertResponse *)response;
-
-/**
- * Called when a Button Press Response is received from Core
- *
- * @param response A SDLButtonPressResponse object
- */
-- (void)onButtonPressResponse:(SDLButtonPressResponse *)response;
-
-/**
- * Called when a `CancelInteraction` response is received from Core
- *
- * @param response A SDLCancelInteractionResponse object
- */
-- (void)onCancelInteractionResponse:(SDLCancelInteractionResponse *)response;
-
-/**
- * Called when a Change Registration Response is received from Core
- *
- * @param response A SDLChangeRegistrationResponse object
- */
-- (void)onChangeRegistrationResponse:(SDLChangeRegistrationResponse *)response;
-
-/**
- * Called when a `CloseApplication` response is received from Core
- *
- * @param response A SDLCloseApplicationResponse object
- */
-- (void)onCloseApplicationResponse:(SDLCloseApplicationResponse *)response;
-
-/**
- * Called when a Create Interaction Choice Set Response is received from Core
- *
- * @param response A SDLCreateInteractionChoiceSetResponse object
- */
-- (void)onCreateInteractionChoiceSetResponse:(SDLCreateInteractionChoiceSetResponse *)response;
-
-/**
- * Called when a Create Window Response is received from Core
- *
- * @param response A SDLCreateWindowResponse object
- */
-- (void)onCreateWindowResponse:(SDLCreateWindowResponse *)response;
-
-/**
- * Called when a Delete Command Response is received from Core
- *
- * @param response A SDLDeleteCommandResponse object
- */
-- (void)onDeleteCommandResponse:(SDLDeleteCommandResponse *)response;
-
-/**
- * Called when a Delete File Response is received from Core
- *
- * @param response A SDLDeleteFileResponse object
- */
-- (void)onDeleteFileResponse:(SDLDeleteFileResponse *)response;
-
-/**
- * Called when a Delete Interaction Choice Set Response is received from Core
- *
- * @param response A SDLDeleteInteractionChoiceSetResponse object
- */
-- (void)onDeleteInteractionChoiceSetResponse:(SDLDeleteInteractionChoiceSetResponse *)response;
-
-/**
- * Called when a Delete SubMenu Response is received from Core
- *
- * @param response A SDLDeleteSubMenuResponse object
- */
-- (void)onDeleteSubMenuResponse:(SDLDeleteSubMenuResponse *)response;
-
-/**
- * Called when a Delete Window Response is received from Core
- *
- * @param response A SDLDeleteWindowResponse object
- */
-- (void)onDeleteWindowResponse:(SDLDeleteWindowResponse *)response;
-
-/**
- * Called when a Diagnostic Message Response is received from Core
- *
- * @param response A SDLDiagnosticMessageResponse object
- */
-- (void)onDiagnosticMessageResponse:(SDLDiagnosticMessageResponse *)response;
-
-/**
- * Called when a Dial Number Response is received from Core
- *
- * @param response A SDLDialNumberResponse object
- */
-- (void)onDialNumberResponse:(SDLDialNumberResponse *)response;
-
-/**
- * Called when an Encoded Sync P Data Response is received from Core
- *
- * @param response A SDLEncodedSyncPDataResponse object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onEncodedSyncPDataResponse:(SDLEncodedSyncPDataResponse *)response __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when an End Audio Pass Thru Response is received from Core
- *
- * @param response A SDLEndAudioPassThruResponse object
- */
-- (void)onEndAudioPassThruResponse:(SDLEndAudioPassThruResponse *)response;
-
-/**
- * Called when a Generic Response is received from Core
- *
- * @param response A SDLGenericResponse object
- */
-- (void)onGenericResponse:(SDLGenericResponse *)response;
-
-/**
- * Called when a Get App Service Data Response is received from Core
- *
- * @param response A SDLGetAppServiceDataResponse object
- */
-- (void)onGetAppServiceDataResponse:(SDLGetAppServiceDataResponse *)response;
-
-/**
- * Called when a GetCloudAppPropertiesResponse Response is received from Core
- *
- * @param response A SDLGetCloudAppPropertiesResponse object
- */
-- (void)onGetCloudAppPropertiesResponse:(SDLGetCloudAppPropertiesResponse *)response;
-
-/**
- * Called when a Get DTCs Response is received from Core
- *
- * @param response A SDLGetDTCsResponse object
- */
-- (void)onGetDTCsResponse:(SDLGetDTCsResponse *)response;
-
-/**
- * Called when a Get File Response is received from Core
- *
- * @param response A SDLGetFileResponse object
- */
-- (void)onGetFileResponse:(SDLGetFileResponse *)response;
-
-/**
- * Called when a Get Interior Vehicle Data Response is received from Core
- *
- * @param response A SDLGetInteriorVehicleDataResponse object
- */
-- (void)onGetInteriorVehicleDataResponse:(SDLGetInteriorVehicleDataResponse *)response;
-
-/**
- * Called when a Get Interior Vehicle Data Consent Response is received from Core
- *
- * @param response A SDLGetInteriorVehicleDataConsentResponse object
- */
-- (void)onGetInteriorVehicleDataConsentResponse:(SDLGetInteriorVehicleDataConsentResponse *)response;
-
-/**
- * Called when a Get System Capability Response is received from Core
- *
- * @param response A SDLGetSystemCapabilityResponse object
- */
-- (void)onGetSystemCapabilityResponse:(SDLGetSystemCapabilityResponse *)response;
-
-/**
- * Called when a Get Vehicle Data Response is received from Core
- *
- * @param response A SDLGetVehicleDataResponse object
- */
-- (void)onGetVehicleDataResponse:(SDLGetVehicleDataResponse *)response;
-
-/**
- * Called when a Get Way Points Response is received from Core
- *
- * @param response A SDLGetWaypointsResponse object
- */
-- (void)onGetWayPointsResponse:(SDLGetWayPointsResponse *)response;
-
-/**
- * Called when a List Files Response is received from Core
- *
- * @param response A SDLListFilesResponse object
- */
-- (void)onListFilesResponse:(SDLListFilesResponse *)response;
-
-/**
- * Called when a Received Lock Screen Icon notification is received from Core
- *
- * @param icon An image
- */
-- (void)onReceivedLockScreenIcon:(UIImage *)icon;
-
-/**
- * Called when a Perform App Service Interaction Response is received from Core
- *
- * @param response A SDLPerformAppServiceInteractionResponse object
- */
-- (void)onPerformAppServiceInteractionResponse:(SDLPerformAppServiceInteractionResponse *)response;
-
-/**
- * Called when a Perform Audio Pass Thru Response is received from Core
- *
- * @param response A SDLPerformAudioPassThruResponse object
- */
-- (void)onPerformAudioPassThruResponse:(SDLPerformAudioPassThruResponse *)response;
-
-/**
- * Called when a Perform Interaction Response is received from Core
- *
- * @param response A SDLPerformInteractionResponse object
- */
-- (void)onPerformInteractionResponse:(SDLPerformInteractionResponse *)response;
-
-/**
- * Called when a Publish App Service Response is received from Core
- *
- * @param response A SDLPublishAppService object
- */
-- (void)onPublishAppServiceResponse:(SDLPublishAppServiceResponse *)response;
-
-/**
- * Called when a Put File Response is received from Core
- *
- * @param response A SDLPutFileResponse object
- */
-- (void)onPutFileResponse:(SDLPutFileResponse *)response;
-
-/**
- * Called when a Read DID Response is received from Core
- *
- * @param response A SDLReadDIDResponse object
- */
-- (void)onReadDIDResponse:(SDLReadDIDResponse *)response;
-
-/**
- * Called when a Register App Interface Response is received from Core
- *
- * @param response A SDLRegisterAppInterfaceResponse object
- */
-- (void)onRegisterAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response;
-
-/**
- * Called when a Release Interior Vehicle Data Module Response is received from Core
- *
- * @param response A SDLReleaseInteriorVehicleDataModuleResponse object
- */
-- (void)onReleaseInteriorVehicleDataModuleResponse:(SDLReleaseInteriorVehicleDataModuleResponse *)response;
-
-/**
- * Called when a Reset Global Properties Response is received from Core
- *
- * @param response A SDLResetGlobalPropertiesResponse object
- */
-- (void)onResetGlobalPropertiesResponse:(SDLResetGlobalPropertiesResponse *)response;
-
-/**
- * Called when a Scrollable Message Response is received from Core
- *
- * @param response A SDLScrollableMessageResponse object
- */
-- (void)onScrollableMessageResponse:(SDLScrollableMessageResponse *)response;
-
-/**
- * Called when a Send Haptic Data Response is received from Core
- *
- * @param response A SDLSendHapticDataResponse object
- */
-- (void)onSendHapticDataResponse:(SDLSendHapticDataResponse *)response;
-
-/**
- * Called when a Send Location Response is received from Core
- *
- * @param response A SDLSendLocationResponse object
- */
-- (void)onSendLocationResponse:(SDLSendLocationResponse *)response;
-
-/**
- * Called when a Set App Icon Response is received from Core
- *
- * @param response A SDLSetAppIconResponse object
- */
-- (void)onSetAppIconResponse:(SDLSetAppIconResponse *)response;
-
-/**
- * Called when a SetCloudAppPropertiesResponse is received from Core
- *
- * @param response A SDLSetCloudAppPropertiesResponse object
- */
-- (void)onSetCloudAppPropertiesResponse:(SDLSetCloudAppPropertiesResponse *)response;
-
-/**
- * Called when a Set Display Layout Response is received from Core
- *
- * @param response A SDLSetDisplayLayoutResponse object
- */
-- (void)onSetDisplayLayoutResponse:(SDLSetDisplayLayoutResponse *)response;
-
-/**
- * Called when a Set Global Properties Response is received from Core
- *
- * @param response A SDLSetGlobalPropertiesResponse object
- */
-- (void)onSetGlobalPropertiesResponse:(SDLSetGlobalPropertiesResponse *)response;
-
-/**
- * Called when a Set Interior Vehicle Data Response is received from Core
- *
- * @param response A SDLSetInteriorVehicleDataResponse object
- */
-- (void)onSetInteriorVehicleDataResponse:(SDLSetInteriorVehicleDataResponse *)response;
-
-/**
- * Called when a Set Media Clock Timer Response is received from Core
- *
- * @param response A SDLSetMediaClockTimerResponse object
- */
-- (void)onSetMediaClockTimerResponse:(SDLSetMediaClockTimerResponse *)response;
-
-/**
- * Called when a Show Constant TBT Response is received from Core
- *
- * @param response A SDLShowConstantTBTResponse object
- */
-- (void)onShowConstantTBTResponse:(SDLShowConstantTBTResponse *)response;
-
-/**
- * Called when a Show Response is received from Core
- *
- * @param response A SDLShowResponse object
- */
-- (void)onShowResponse:(SDLShowResponse *)response;
-
-/**
- * Called when a ShowAppMenu Response is received from Core
- *
- * @param response A SDLShowAppMenuResponse object
- */
-- (void)onShowAppMenuResponse:(SDLShowAppMenuResponse *)response;
-
-/**
- * Called when a Slider Response is received from Core
- *
- * @param response A SDLSliderResponse object
- */
-- (void)onSliderResponse:(SDLSliderResponse *)response;
-
-/**
- * Called when a Speak Response is received from Core
- *
- * @param response A SDLSpeakResponse object
- */
-- (void)onSpeakResponse:(SDLSpeakResponse *)response;
-
-/**
- * Called when a Subscribe Button Response is received from Core
- *
- * @param response A SDLSubscribeButtonResponse object
- */
-- (void)onSubscribeButtonResponse:(SDLSubscribeButtonResponse *)response;
-
-/**
- * Called when a Subscribe Vehicle Data Response is received from Core
- *
- * @param response A SDLSubscribeVehicleDataResponse object
- */
-- (void)onSubscribeVehicleDataResponse:(SDLSubscribeVehicleDataResponse *)response;
-
-/**
- * Called when a Subscribe Way Points Response is received from Core
- *
- * @param response A SDLSubscribeWayPointsResponse object
- */
-- (void)onSubscribeWayPointsResponse:(SDLSubscribeWayPointsResponse *)response;
-
-/**
- * Called when a Sync P Data Response is received from Core
- *
- * @param response A SDLSyncPDataResponse object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onSyncPDataResponse:(SDLSyncPDataResponse *)response __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when an Update Turn List Response is received from Core
- *
- * @param response A SDLUpdateTurnListResponse object
- */
-- (void)onUpdateTurnListResponse:(SDLUpdateTurnListResponse *)response;
-
-/**
- * Called when an Unpublish App Service Response is received from Core
- *
- * @param response A SDLUnpublishAppServiceResponse object
- */
-- (void)onUnpublishAppServiceResponse:(SDLUnpublishAppServiceResponse *)response;
-
-/**
- * Called when an Unregister App Interface Response is received from Core
- *
- * @param response A SDLUnregisterAppInterfaceResponse object
- */
-- (void)onUnregisterAppInterfaceResponse:(SDLUnregisterAppInterfaceResponse *)response;
-
-/**
- * Called when an Unsubscribe Button Response is received from Core
- *
- * @param response A SDLUnsubscribeButtonResponse object
- */
-- (void)onUnsubscribeButtonResponse:(SDLUnsubscribeButtonResponse *)response;
-
-/**
- * Called when an Unsubscribe Vehicle Data Response is received from Core
- *
- * @param response A SDLUnsubscribeVehicleDataResponse object
- */
-- (void)onUnsubscribeVehicleDataResponse:(SDLUnsubscribeVehicleDataResponse *)response;
-
-/**
- * Called when an Unsubscribe Way Points Response is received from Core
- *
- * @param response A SDLUnsubscribeWayPointsResponse object
- */
-- (void)onUnsubscribeWayPointsResponse:(SDLUnsubscribeWayPointsResponse *)response;
-
-#pragma mark - Requests
-
-/**
- * Called when a `AddCommand` request is received from Core
- *
- * @param request A SDLAddCommand object
- */
-- (void)onAddCommand:(SDLAddCommand *)request;
-
-/**
- * Called when a `AddSubMenu` request is received from Core
- *
- * @param request A SDLAddSubMenu object
- */
-- (void)onAddSubMenu:(SDLAddSubMenu *)request;
-
-/**
- * Called when a `Alert` request is received from Core
- *
- * @param request A SDLAlert object
- */
-- (void)onAlert:(SDLAlert *)request;
-
-/**
- * Called when a `AlertManeuver` request is received from Core
- *
- * @param request A SDLAlertManeuver object
- */
-- (void)onAlertManeuver:(SDLAlertManeuver *)request;
-
-/**
- * Called when a `ButtonPress` request is received from Core
- *
- * @param request A SDLButtonPress object
- */
-- (void)onButtonPress:(SDLButtonPress *)request;
-
-/**
- * Called when a `CancelInteraction` request is received from Core
- *
- * @param request A SDLCancelInteraction object
- */
-- (void)onCancelInteraction:(SDLCancelInteraction *)request;
-
-/**
- * Called when a `ChangeRegistration` request is received from Core
- *
- * @param request A SDLChangeRegistration object
- */
-- (void)onChangeRegistration:(SDLChangeRegistration *)request;
-
-/**
- * Called when a `CloseApplication` request is received from Core
- *
- * @param request A SDLCloseApplication object
- */
-- (void)onCloseApplication:(SDLCloseApplication *)request;
-
-/**
- * Called when a `CreateInteractionChoiceSet` request is received from Core
- *
- * @param request A SDLCreateInteractionChoiceSet object
- */
-- (void)onCreateInteractionChoiceSet:(SDLCreateInteractionChoiceSet *)request;
-
-/**
- * Called when a `SDLCreateWindow` request is received from Core
- *
- * @param request A SDLCreateWindow object
- */
-- (void)onCreateWindow:(SDLCreateWindow *)request;
-
-/**
- * Called when a `DeleteCommand` request is received from Core
- *
- * @param request A SDLDeleteCommand object
- */
-- (void)onDeleteCommand:(SDLDeleteCommand *)request;
-
-/**
- * Called when a `DeleteFile` request is received from Core
- *
- * @param request A SDLDeleteFile object
- */
-- (void)onDeleteFile:(SDLDeleteFile *)request;
-
-/**
- * Called when a `DeleteInteractionChoiceSet` request is received from Core
- *
- * @param request A SDLDeleteInteractionChoiceSet object
- */
-- (void)onDeleteInteractionChoiceSet:(SDLDeleteInteractionChoiceSet *)request;
-
-/**
- * Called when a `DeleteSubMenu` request is received from Core
- *
- * @param request A SDLDeleteSubMenu object
- */
-- (void)onDeleteSubMenu:(SDLDeleteSubMenu *)request;
-
-/**
- * Called when a `SDLDeleteWindow` request is received from Core
- *
- * @param request A SDLDeleteWindow object
- */
-- (void)onDeleteWindow:(SDLDeleteWindow *)request;
-
-/**
- * Called when a `DiagnosticMessage` request is received from Core
- *
- * @param request A SDLDiagnosticMessage object
- */
-- (void)onDiagnosticMessage:(SDLDiagnosticMessage *)request;
-
-/**
- * Called when a `DialNumber` request is received from Core
- *
- * @param request A SDLDialNumber object
- */
-- (void)onDialNumber:(SDLDialNumber *)request;
-
-/**
- * Called when a `EncodedSyncPData` request is received from Core
- *
- * @param request A SDLEncodedSyncPData object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onEncodedSyncPData:(SDLEncodedSyncPData *)request __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when a `EndAudioPassThru` request is received from Core
- *
- * @param request A SDLEndAudioPassThru object
- */
-- (void)onEndAudioPassThru:(SDLEndAudioPassThru *)request;
-
-/**
- * Called when a `GetAppServiceData` request is received from Core
- *
- * @param request A SDLGetAppServiceData object
- */
-- (void)onGetAppServiceData:(SDLGetAppServiceData *)request;
-
-/**
- * Called when a `GetCloudAppProperties` request is received from Core
- *
- * @param request A SDLGetCloudAppProperties object
- */
-- (void)onGetCloudAppProperties:(SDLGetCloudAppProperties *)request;
-
-/**
- * Called when a `GetDTCs` request is received from Core
- *
- * @param request A SDLGetDTCs object
- */
-- (void)onGetDTCs:(SDLGetDTCs *)request;
-
-/**
- * Called when a `GetFile` request is received from Core
- *
- * @param request A SDLGetFile object
- */
-- (void)onGetFile:(SDLGetFile *)request;
-
-/**
- * Called when a `GetInteriorVehicleData` request is received from Core
- *
- * @param request A SDLGetInteriorVehicleData object
- */
-- (void)onGetInteriorVehicleData:(SDLGetInteriorVehicleData *)request;
-
-/**
- * Called when a `GetInteriorVehicleDataConsent` request is received from Core
- *
- * @param request A SDLGetInteriorVehicleDataConsent object
- */
-- (void)onGetInteriorVehicleConsentData:(SDLGetInteriorVehicleDataConsent *)request;
-
-/**
- * Called when a `GetSystemCapability` request is received from Core
- *
- * @param request A SDLGetSystemCapability object
- */
-- (void)onGetSystemCapability:(SDLGetSystemCapability *)request;
-
-/**
- * Called when a `GetVehicleData` request is received from Core
- *
- * @param request A SDLGetVehicleData object
- */
-- (void)onGetVehicleData:(SDLGetVehicleData *)request;
-
-/**
- * Called when a `GetWayPoints` request is received from Core
- *
- * @param request A SDLGetWayPoints object
- */
-- (void)onGetWayPoints:(SDLGetWayPoints *)request;
-
-/**
- * Called when a `ListFiles` request is received from Core
- *
- * @param request A SDLListFiles object
- */
-- (void)onListFiles:(SDLListFiles *)request;
-
-/**
- * Called when a `PerformAppServiceInteraction` request is received from Core
- *
- * @param request A SDLPerformAppServiceInteraction object
- */
-- (void)onPerformAppServiceInteraction:(SDLPerformAppServiceInteraction *)request;
-
-/**
- * Called when a `PerformAudioPassThru` request is received from Core
- *
- * @param request A SDLPerformAudioPassThru object
- */
-- (void)onPerformAudioPassThru:(SDLPerformAudioPassThru *)request;
-
-/**
- * Called when a `PerformInteraction` request is received from Core
- *
- * @param request A SDLPerformInteraction object
- */
-- (void)onPerformInteraction:(SDLPerformInteraction *)request;
-
-/**
- * Called when a `PublishAppService` request is received from Core
- *
- * @param request A SDLPublishAppService object
- */
-- (void)onPublishAppService:(SDLPublishAppService *)request;
-
-/**
- * Called when a `PutFile` request is received from Core
- *
- * @param request A SDLPutFile object
- */
-- (void)onPutFile:(SDLPutFile *)request;
-
-/**
- * Called when a `ReadDID` request is received from Core
- *
- * @param request A SDLReadDID object
- */
-- (void)onReadDID:(SDLReadDID *)request;
-
-/**
- * Called when a `RegisterAppInterface` request is received from Core
- *
- * @param request A SDLRegisterAppInterface object
- */
-- (void)onRegisterAppInterface:(SDLRegisterAppInterface *)request;
-
-/**
- * Called when a `ReleaseInteriorVehicleDataModule` request is received from Core
- *
- * @param request A SDLReleaseInteriorVehicleDataModule object
- */
-- (void)onReleaseInteriorVehicleDataModule:(SDLReleaseInteriorVehicleDataModule *)request;
-
-/**
- * Called when a `ResetGlobalProperties` request is received from Core
- *
- * @param request A SDLResetGlobalProperties object
- */
-- (void)onResetGlobalProperties:(SDLResetGlobalProperties *)request;
-
-/**
- * Called when a `ScrollableMessage` request is received from Core
- *
- * @param request A SDLScrollableMessage object
- */
-- (void)onScrollableMessage:(SDLScrollableMessage *)request;
-
-/**
- * Called when a `SendHapticData` request is received from Core
- *
- * @param request A SDLSendHapticData object
- */
-- (void)onSendHapticData:(SDLSendHapticData *)request;
-
-/**
- * Called when a `SendLocation` request is received from Core
- *
- * @param request A SDLSendLocation object
- */
-- (void)onSendLocation:(SDLSendLocation *)request;
-
-/**
- * Called when a `SetAppIcon` request is received from Core
- *
- * @param request A SDLSetAppIcon object
- */
-- (void)onSetAppIcon:(SDLSetAppIcon *)request;
-
-/**
- * Called when a `SetCloudAppProperties` request is received from Core
- *
- * @param request A SDLSetCloudAppProperties object
- */
-- (void)onSetCloudAppProperties:(SDLSetCloudAppProperties *)request;
-
-/**
- * Called when a `SetDisplayLayout` request is received from Core
- *
- * @param request A SDLSetDisplayLayout object
- */
-- (void)onSetDisplayLayout:(SDLSetDisplayLayout *)request;
-
-/**
- * Called when a `SetGlobalProperties` request is received from Core
- *
- * @param request A SDLSetGlobalProperties object
- */
-- (void)onSetGlobalProperties:(SDLSetGlobalProperties *)request;
-
-/**
- * Called when a `SetInteriorVehicleData` request is received from Core
- *
- * @param request A SDLSetInteriorVehicleData object
- */
-- (void)onSetInteriorVehicleData:(SDLSetInteriorVehicleData *)request;
-
-/**
- * Called when a `SetMediaClockTimer` request is received from Core
- *
- * @param request A SDLSetMediaClockTimer object
- */
-- (void)onSetMediaClockTimer:(SDLSetMediaClockTimer *)request;
-
-/**
- * Called when a `Show` request is received from Core
- *
- * @param request A SDLShow object
- */
-- (void)onShow:(SDLShow *)request;
-
-/**
- * Called when a `ShowAppMenu` is received from Core
- *
- * @param request A SDLShowAppMenu object
- */
-- (void)onShowAppMenu:(SDLShowAppMenu *)request;
-
-/**
- * Called when a `ShowConstantTBT` request is received from Core
- *
- * @param request A SDLShowConstantTBT object
- */
-- (void)onShowConstantTBT:(SDLShowConstantTBT *)request;
-
-/**
- * Called when a `Slider` request is received from Core
- *
- * @param request A SDLSlider object
- */
-- (void)onSlider:(SDLSlider *)request;
-
-/**
- * Called when a `Speak` request is received from Core
- *
- * @param request A SDLSpeak object
- */
-- (void)onSpeak:(SDLSpeak *)request;
-
-/**
- * Called when a `SubscribeButton` request is received from Core
- *
- * @param request A SDLSubscribeButton object
- */
-- (void)onSubscribeButton:(SDLSubscribeButton *)request;
-
-/**
- * Called when a `SubscribeVehicleData` request is received from Core
- *
- * @param request A SDLSubscribeVehicleData object
- */
-- (void)onSubscribeVehicleData:(SDLSubscribeVehicleData *)request;
-
-/**
- * Called when a `SubscribeWayPoints` request is received from Core
- *
- * @param request A SDLSubscribeWayPoints object
- */
-- (void)onSubscribeWayPoints:(SDLSubscribeWayPoints *)request;
-
-/**
- * Called when a `SyncPData` request is received from Core
- *
- * @param request A SDLSyncPData object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onSyncPData:(SDLSyncPData *)request __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when a `SystemRequest` request is received from Core
- *
- * @param request A SDLSystemRequest object
- */
-- (void)onSystemRequest:(SDLSystemRequest *)request;
-
-/**
- * Called when a `SDLUnpublishAppService` request is received from Core
- *
- * @param request A SDLUnpublishAppService object
- */
-- (void)onUnpublishAppService:(SDLUnpublishAppService *)request;
-
-/**
- * Called when a `UnregisterAppInterface` request is received from Core
- *
- * @param request A SDLUnregisterAppInterface object
- */
-- (void)onUnregisterAppInterface:(SDLUnregisterAppInterface *)request;
-
-/**
- * Called when a `UnsubscribeButton` request is received from Core
- *
- * @param request A SDLUnsubscribeButton object
- */
-- (void)onUnsubscribeButton:(SDLUnsubscribeButton *)request;
-
-/**
- * Called when a `UnsubscribeVehicleData` request is received from Core
- *
- * @param request A SDLUnsubscribeVehicleData object
- */
-- (void)onUnsubscribeVehicleData:(SDLUnsubscribeVehicleData *)request;
-
-/**
- * Called when a `UnsubscribeWayPoints` request is received from Core
- *
- * @param request A SDLUnsubscribeWayPoints object
- */
-- (void)onUnsubscribeWayPoints:(SDLUnsubscribeWayPoints *)request;
-
-/**
- * Called when a `UpdateTurnList` request is received from Core
- *
- * @param request A SDLUpdateTurnList object
- */
-- (void)onUpdateTurnList:(SDLUpdateTurnList *)request;
-
-
-#pragma mark - Notifications
-
-/**
- * Called when an On App Interface Unregistered notification is received from Core
- *
- * @param notification A SDLOnAppInterfaceUnregistered object
- */
-- (void)onOnAppInterfaceUnregistered:(SDLOnAppInterfaceUnregistered *)notification;
-
-/**
- * Called when an On App Service Data notification is received from Core
- *
- * @param notification A SDLOnAppServiceData object
- */
-- (void)onOnAppServiceData:(SDLOnAppServiceData *)notification;
-
-/**
- * Called when an On Audio Pass Thru notification is received from Core
- *
- * @param notification A SDLOnAudioPassThru object
- */
-- (void)onOnAudioPassThru:(SDLOnAudioPassThru *)notification;
-
-/**
- * Called when an On Button Event notification is received from Core
- *
- * @param notification A SDLOnButtonEvent object
- */
-- (void)onOnButtonEvent:(SDLOnButtonEvent *)notification;
-
-/**
- * Called when an On Button Press notification is received from Core
- *
- * @param notification A SDLOnButtonPress object
- */
-- (void)onOnButtonPress:(SDLOnButtonPress *)notification;
-
-/**
- * Called when an On Command notification is received from Core
- *
- * @param notification A SDLOnCommand object
- */
-- (void)onOnCommand:(SDLOnCommand *)notification;
-
-/**
- * Called when an On Encoded Sync P Data notification is received from Core
- *
- * @param notification A SDLOnEncodedSyncPData object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onOnEncodedSyncPData:(SDLOnEncodedSyncPData *)notification __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when an On Hash Change notification is received from Core
- *
- * @param notification A SDLOnHashChange object
- */
-- (void)onOnHashChange:(SDLOnHashChange *)notification;
-
-/**
- * Called when an On Interior Vehicle Data notification is received from Core
- *
- * @param notification A SDLOnInteriorVehicleData object
- */
-- (void)onOnInteriorVehicleData:(SDLOnInteriorVehicleData *)notification;
-
-/**
- * Called when an On Keyboard Input notification is received from Core
- *
- * @param notification A SDLOnKeyboardInput object
- */
-- (void)onOnKeyboardInput:(SDLOnKeyboardInput *)notification;
-
-/**
- * Called when an On Language Change notification is received from Core
- *
- * @param notification A SDLOnLanguageChange object
- */
-- (void)onOnLanguageChange:(SDLOnLanguageChange *)notification;
-
-/**
- * Called when an On Lock Screen notification is received from Core
- *
- * @param notification A SDLOnLockScreenStatus object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onOnLockScreenNotification:(SDLOnLockScreenStatus *)notification __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when an On Permissions Change notification is received from Core
- *
- * @param notification A SDLOnPermissionsChange object
- */
-- (void)onOnPermissionsChange:(SDLOnPermissionsChange *)notification;
-
-/**
- * Called when an On RC Change notification is received from Core
- *
- * @param notification A SDLOnRCStatus object
- */
-- (void)onOnRCStatus:(SDLOnRCStatus *)notification;
-
-/**
- * Called when an On Sync P notification is received from Core
- *
- * @param notification A SDLOnSyncPData object
- */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-- (void)onOnSyncPData:(SDLOnSyncPData *)notification __deprecated;
-#pragma clang diagnostic pop
-
-/**
- * Called when an `OnSystemCapabilityUpdated` notification is received from Core
- *
- * @param notification A SDLOnSystemCapabilityUpdated object
- */
-- (void)onOnSystemCapabilityUpdated:(SDLOnSystemCapabilityUpdated *)notification;
-
-/**
- * Called when an On System Request notification is received from Core
- *
- * @param notification A SDLOnSystemRequest object
- */
-- (void)onOnSystemRequest:(SDLOnSystemRequest *)notification;
-
-/**
- * Called when an On TBT Client State notification is received from Core
- *
- * @param notification A SDLOnTBTClientState object
- */
-- (void)onOnTBTClientState:(SDLOnTBTClientState *)notification;
-
-/**
- * Called when an On Touch Event notification is received from Core
- *
- * @param notification A SDLOnTouchEvent object
- */
-- (void)onOnTouchEvent:(SDLOnTouchEvent *)notification;
-
-/**
- * Called when an On Vehicle Data notification is received from Core
- *
- * @param notification A SDLOnVehicleData object
- */
-- (void)onOnVehicleData:(SDLOnVehicleData *)notification;
-
-/**
- * Called when an On Way Point Change notification is received from Core
- *
- * @param notification A SDLOnWayPointChange object
- */
-- (void)onOnWayPointChange:(SDLOnWayPointChange *)notification;
-
-#pragma mark - Other
-
-/**
- * Called when an Error message is received from Core
- *
- * @param e An exception message
- */
-- (void)onError:(NSException *)e;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPutFile.h b/SmartDeviceLink/SDLPutFile.h
index ac621a0b4..98a05fe69 100644
--- a/SmartDeviceLink/SDLPutFile.h
+++ b/SmartDeviceLink/SDLPutFile.h
@@ -88,7 +88,14 @@ NS_ASSUME_NONNULL_BEGIN
*
* Required, max length 255 characters
*/
-@property (strong, nonatomic) NSString *syncFileName;
+@property (strong, nonatomic) NSString *syncFileName __deprecated_msg("use sdlFileName instead");
+
+/**
+* File reference name
+*
+* Required, max length 255 characters
+*/
+@property (strong, nonatomic) NSString *sdlFileName;
/**
* A FileType value representing a selected file type
diff --git a/SmartDeviceLink/SDLPutFile.m b/SmartDeviceLink/SDLPutFile.m
index 162ca5b6d..2470be16d 100644
--- a/SmartDeviceLink/SDLPutFile.m
+++ b/SmartDeviceLink/SDLPutFile.m
@@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
- self.syncFileName = fileName;
+ self.sdlFileName = fileName;
self.fileType = fileType;
return self;
@@ -95,6 +95,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error];
}
+- (void)setSdlFileName:(NSString *)syncFileName {
+ [self.parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName];
+}
+
+- (NSString *)sdlFileName {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error];
+}
+
- (void)setFileType:(SDLFileType)fileType {
[self.parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType];
}
diff --git a/SmartDeviceLink/SDLRPCMessageType.h b/SmartDeviceLink/SDLRPCMessageType.h
index 5e01c4a4b..ac0df1958 100644
--- a/SmartDeviceLink/SDLRPCMessageType.h
+++ b/SmartDeviceLink/SDLRPCMessageType.h
@@ -3,6 +3,8 @@
#import <Foundation/Foundation.h>
+#import "SDLEnum.h"
+
/**
The type of RPC message
*/
@@ -16,3 +18,15 @@ typedef NS_ENUM(Byte, SDLRPCMessageType) {
/// A message that does not have a response
SDLRPCMessageTypeNotification
};
+
+/// A type of RPC message
+typedef SDLEnum SDLRPCMessageTypeName SDL_SWIFT_ENUM;
+
+/// A request that will require a response
+extern SDLRPCMessageTypeName const SDLRPCMessageTypeNameRequest;
+
+/// A response to a request
+extern SDLRPCMessageTypeName const SDLRPCMessageTypeNameResponse;
+
+/// A message that does not have a response
+extern SDLRPCMessageTypeName const SDLRPCMessageTypeNameNotification;
diff --git a/SmartDeviceLink/SDLRPCMessageType.m b/SmartDeviceLink/SDLRPCMessageType.m
new file mode 100644
index 000000000..365cd26ef
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCMessageType.m
@@ -0,0 +1,13 @@
+//
+// SDLRPCMessageType.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 6/12/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLRPCMessageType.h"
+
+SDLRPCMessageTypeName const SDLRPCMessageTypeNameRequest = @"request";
+SDLRPCMessageTypeName const SDLRPCMessageTypeNameResponse = @"response";
+SDLRPCMessageTypeName const SDLRPCMessageTypeNameNotification = @"notification";
diff --git a/SmartDeviceLink/SDLRPCParameterNames.h b/SmartDeviceLink/SDLRPCParameterNames.h
index f7745d877..d6fc07086 100644
--- a/SmartDeviceLink/SDLRPCParameterNames.h
+++ b/SmartDeviceLink/SDLRPCParameterNames.h
@@ -1,5 +1,35 @@
+/*
+ * 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.
+ */
// SDLRPCParameterNames.h
-//
#import <Foundation/Foundation.h>
#import "SDLMacros.h"
@@ -88,6 +118,8 @@ extern SDLRPCParameterName const SDLRPCParameterNameButtonEventMode;
extern SDLRPCParameterName const SDLRPCParameterNameButtonName;
extern SDLRPCParameterName const SDLRPCParameterNameButtonPressMode;
extern SDLRPCParameterName const SDLRPCParameterNameCancelID;
+extern SDLRPCParameterName const SDLRPCParameterNameCapacity;
+extern SDLRPCParameterName const SDLRPCParameterNameCapacityUnit;
extern SDLRPCParameterName const SDLRPCParameterNameColor;
extern SDLRPCParameterName const SDLRPCParameterNameCol;
extern SDLRPCParameterName const SDLRPCParameterNameColSpan;
@@ -170,6 +202,8 @@ extern SDLRPCParameterName const SDLRPCParameterNameDriverBeltDeployed;
extern SDLRPCParameterName const SDLRPCParameterNameDriverBraking;
extern SDLRPCParameterName const SDLRPCParameterNameDriverBuckleBelted;
extern SDLRPCParameterName const SDLRPCParameterNameDriverCurtainAirbagDeployed;
+extern SDLRPCParameterName const SDLRPCParameterNameDriverDistraction;
+extern SDLRPCParameterName const SDLRPCParameterNameDriverDistractionCapability;
extern SDLRPCParameterName const SDLRPCParameterNameDriverDistractionStatus;
extern SDLRPCParameterName const SDLRPCParameterNameDriverDoorAjar;
extern SDLRPCParameterName const SDLRPCParameterNameDriverKneeAirbagDeployed;
@@ -231,6 +265,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameGraphicSupported;
extern SDLRPCParameterName const SDLRPCParameterNameGreen;
extern SDLRPCParameterName const SDLRPCParameterNameGrid;
extern SDLRPCParameterName const SDLRPCParameterNameHandledRPCs;
+extern SDLRPCParameterName const SDLRPCParameterNameHandsOffSteering;
extern SDLRPCParameterName const SDLRPCParameterNameHapticRectData;
extern SDLRPCParameterName const SDLRPCParameterNameHapticSpatialDataSupported;
extern SDLRPCParameterName const SDLRPCParameterNameHardware;
@@ -323,6 +358,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameLength;
extern SDLRPCParameterName const SDLRPCParameterNameLevel;
extern SDLRPCParameterName const SDLRPCParameterNameLevels;
extern SDLRPCParameterName const SDLRPCParameterNameLevelSpan;
+extern SDLRPCParameterName const SDLRPCParameterNameLevelState;
extern SDLRPCParameterName const SDLRPCParameterNameLightControlCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameLightControlData;
extern SDLRPCParameterName const SDLRPCParameterNameLightState;
@@ -358,7 +394,6 @@ extern SDLRPCParameterName const SDLRPCParameterNameMassageEnabled;
extern SDLRPCParameterName const SDLRPCParameterNameMassageEnabledAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameMassageMode;
extern SDLRPCParameterName const SDLRPCParameterNameMassageModeAvailable;
-extern SDLRPCParameterName const SDLRPCParameterNameMemoryAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameMassageZone;
extern SDLRPCParameterName const SDLRPCParameterNameMaxBitrate;
extern SDLRPCParameterName const SDLRPCParameterNameMaxDuration;
@@ -379,10 +414,12 @@ extern SDLRPCParameterName const SDLRPCParameterNameMediaTrack;
extern SDLRPCParameterName const SDLRPCParameterNameMediaImage;
extern SDLRPCParameterName const SDLRPCParameterNameMediaType;
extern SDLRPCParameterName const SDLRPCParameterNameMemory;
+extern SDLRPCParameterName const SDLRPCParameterNameMemoryAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameMenuIcon;
extern SDLRPCParameterName const SDLRPCParameterNameMenuId;
extern SDLRPCParameterName const SDLRPCParameterNameMenuLayout;
extern SDLRPCParameterName const SDLRPCParameterNameMenuLayoutsAvailable;
+extern SDLRPCParameterName const SDLRPCParameterNameMenuLength;
extern SDLRPCParameterName const SDLRPCParameterNameMenuName;
extern SDLRPCParameterName const SDLRPCParameterNameMenuParams;
extern SDLRPCParameterName const SDLRPCParameterNameMenuTitle;
@@ -447,7 +484,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameOS;
extern SDLRPCParameterName const SDLRPCParameterNameOSVersion;
extern SDLRPCParameterName const SDLRPCParameterNameParameterPermissions;
extern SDLRPCParameterName const SDLRPCParameterNameParameters;
-extern SDLRPCParameterName const SDLRPCParameterNameParentId;
+extern SDLRPCParameterName const SDLRPCParameterNameParentID;
extern SDLRPCParameterName const SDLRPCParameterNameParkBrakeActive;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerAirbagDeployed;
extern SDLRPCParameterName const SDLRPCParameterNamePassengerBeltDeployed;
@@ -610,6 +647,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameSteeringWheelAngle;
extern SDLRPCParameterName const SDLRPCParameterNameStereoAudioOutputMuted;
extern SDLRPCParameterName const SDLRPCParameterNameSubAdministrativeArea;
extern SDLRPCParameterName const SDLRPCParameterNameSubLocality;
+extern SDLRPCParameterName const SDLRPCParameterNameSubMenuDepth;
extern SDLRPCParameterName const SDLRPCParameterNameSubscribe;
extern SDLRPCParameterName const SDLRPCParameterNameSubThoroughfare;
extern SDLRPCParameterName const SDLRPCParameterNameSuccess;
diff --git a/SmartDeviceLink/SDLRPCParameterNames.m b/SmartDeviceLink/SDLRPCParameterNames.m
index 4c8909a13..2a8d3a93b 100644
--- a/SmartDeviceLink/SDLRPCParameterNames.m
+++ b/SmartDeviceLink/SDLRPCParameterNames.m
@@ -1,3 +1,34 @@
+/*
+ * 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.
+ */
// SDLRPCParameterNames.h
#import "NSMutableDictionary+Store.h"
@@ -85,6 +116,8 @@ SDLRPCParameterName const SDLRPCParameterNameButtonEventMode = @"buttonEventMode
SDLRPCParameterName const SDLRPCParameterNameButtonName = @"buttonName";
SDLRPCParameterName const SDLRPCParameterNameButtonPressMode = @"buttonPressMode";
SDLRPCParameterName const SDLRPCParameterNameCancelID = @"cancelID";
+SDLRPCParameterName const SDLRPCParameterNameCapacity = @"capacity";
+SDLRPCParameterName const SDLRPCParameterNameCapacityUnit = @"capacityUnit";
SDLRPCParameterName const SDLRPCParameterNameCoolingEnabled = @"coolingEnabled";
SDLRPCParameterName const SDLRPCParameterNameCoolingEnabledAvailable = @"coolingEnabledAvailable";
SDLRPCParameterName const SDLRPCParameterNameCoolingLevel = @"coolingLevel";
@@ -165,6 +198,8 @@ SDLRPCParameterName const SDLRPCParameterNameDriverBeltDeployed = @"driverBeltDe
SDLRPCParameterName const SDLRPCParameterNameDriverBraking = @"driverBraking";
SDLRPCParameterName const SDLRPCParameterNameDriverBuckleBelted = @"driverBuckleBelted";
SDLRPCParameterName const SDLRPCParameterNameDriverCurtainAirbagDeployed = @"driverCurtainAirbagDeployed";
+SDLRPCParameterName const SDLRPCParameterNameDriverDistraction = @"driverDistraction";
+SDLRPCParameterName const SDLRPCParameterNameDriverDistractionCapability = @"driverDistractionCapability";
SDLRPCParameterName const SDLRPCParameterNameDriverDistractionStatus = @"driverDistractionStatus";
SDLRPCParameterName const SDLRPCParameterNameDriverDoorAjar = @"driverDoorAjar";
SDLRPCParameterName const SDLRPCParameterNameDriverKneeAirbagDeployed = @"driverKneeAirbagDeployed";
@@ -226,6 +261,7 @@ SDLRPCParameterName const SDLRPCParameterNameGraphicSupported = @"graphicSupport
SDLRPCParameterName const SDLRPCParameterNameGreen = @"green";
SDLRPCParameterName const SDLRPCParameterNameGrid = @"grid";
SDLRPCParameterName const SDLRPCParameterNameHandledRPCs = @"handledRPCs";
+SDLRPCParameterName const SDLRPCParameterNameHandsOffSteering = @"handsOffSteering";
SDLRPCParameterName const SDLRPCParameterNameHapticRectData = @"hapticRectData";
SDLRPCParameterName const SDLRPCParameterNameHapticSpatialDataSupported = @"hapticSpatialDataSupported";
SDLRPCParameterName const SDLRPCParameterNameHardware = @"hardware";
@@ -319,6 +355,7 @@ SDLRPCParameterName const SDLRPCParameterNameLength = @"length";
SDLRPCParameterName const SDLRPCParameterNameLevel = @"level";
SDLRPCParameterName const SDLRPCParameterNameLevels = @"levels";
SDLRPCParameterName const SDLRPCParameterNameLevelSpan = @"levelspan";
+SDLRPCParameterName const SDLRPCParameterNameLevelState = @"levelState";
SDLRPCParameterName const SDLRPCParameterNameLightControlCapabilities = @"lightControlCapabilities";
SDLRPCParameterName const SDLRPCParameterNameLightControlData = @"lightControlData";
SDLRPCParameterName const SDLRPCParameterNameLightState = @"lightState";
@@ -375,6 +412,7 @@ SDLRPCParameterName const SDLRPCParameterNameMenuIcon = @"menuIcon";
SDLRPCParameterName const SDLRPCParameterNameMenuId = @"menuID";
SDLRPCParameterName const SDLRPCParameterNameMenuLayout = @"menuLayout";
SDLRPCParameterName const SDLRPCParameterNameMenuLayoutsAvailable = @"menuLayoutsAvailable";
+SDLRPCParameterName const SDLRPCParameterNameMenuLength = @"menuLength";
SDLRPCParameterName const SDLRPCParameterNameMenuName = @"menuName";
SDLRPCParameterName const SDLRPCParameterNameMenuParams = @"menuParams";
SDLRPCParameterName const SDLRPCParameterNameMenuTitle = @"menuTitle";
@@ -440,7 +478,7 @@ SDLRPCParameterName const SDLRPCParameterNameOS = @"os";
SDLRPCParameterName const SDLRPCParameterNameOSVersion = @"osVersion";
SDLRPCParameterName const SDLRPCParameterNameParameterPermissions = @"parameterPermissions";
SDLRPCParameterName const SDLRPCParameterNameParameters = @"parameters";
-SDLRPCParameterName const SDLRPCParameterNameParentId = @"parentID";
+SDLRPCParameterName const SDLRPCParameterNameParentID = @"parentID";
SDLRPCParameterName const SDLRPCParameterNameParkBrakeActive = @"parkBrakeActive";
SDLRPCParameterName const SDLRPCParameterNamePassengerAirbagDeployed = @"passengerAirbagDeployed";
SDLRPCParameterName const SDLRPCParameterNamePassengerBeltDeployed = @"passengerBeltDeployed";
@@ -604,6 +642,7 @@ SDLRPCParameterName const SDLRPCParameterNameSteeringWheelAngle = @"steeringWhee
SDLRPCParameterName const SDLRPCParameterNameStereoAudioOutputMuted = @"stereoAudioOutputMuted";
SDLRPCParameterName const SDLRPCParameterNameSubAdministrativeArea = @"subAdministrativeArea";
SDLRPCParameterName const SDLRPCParameterNameSubLocality = @"subLocality";
+SDLRPCParameterName const SDLRPCParameterNameSubMenuDepth = @"subMenuDepth";
SDLRPCParameterName const SDLRPCParameterNameSubscribe = @"subscribe";
SDLRPCParameterName const SDLRPCParameterNameSubThoroughfare = @"subThoroughfare";
SDLRPCParameterName const SDLRPCParameterNameSuccess = @"success";
diff --git a/SmartDeviceLink/SDLRPCPermissionStatus.h b/SmartDeviceLink/SDLRPCPermissionStatus.h
new file mode 100644
index 000000000..72a471443
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCPermissionStatus.h
@@ -0,0 +1,48 @@
+//
+// SDLRPCPermissionStatus.h
+// SmartDeviceLink
+//
+// Created by James Lapinski on 6/29/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLRPCFunctionNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// An object containing the result status of a permission element request
+@interface SDLRPCPermissionStatus : NSObject
+
+/**
+ Name of the individual RPC.
+
+ Required
+ */
+@property (strong, nonatomic, readonly) SDLRPCFunctionName rpcName;
+
+/**
+ * Whether or not the RPC is allowed.
+ */
+@property (assign, nonatomic, readonly, getter=isRPCAllowed) BOOL rpcAllowed;
+
+/**
+ * Holds a dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed
+ */
+@property (strong, nonatomic, nullable, readonly) NSDictionary<NSString *, NSNumber *> *rpcParameters;
+
+/**
+ * Initializes a SDLRPCPermissionStatus object.
+ *
+ * @param rpcName The name of the RPC.
+ * @param isRPCAllowed The permission status for the RPC.
+ * @param rpcParameters A dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed
+ *
+ * @return An instance of the SDLRPCPermissionStatus class.
+ */
+- (instancetype)initWithRPCName:(SDLRPCFunctionName)rpcName isRPCAllowed:(BOOL)isRPCAllowed rpcParameters:(nullable NSDictionary<NSString *, NSNumber *> *)rpcParameters;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRPCPermissionStatus.m b/SmartDeviceLink/SDLRPCPermissionStatus.m
new file mode 100644
index 000000000..7c6a8d00a
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCPermissionStatus.m
@@ -0,0 +1,34 @@
+//
+// SDLRPCPermissionStatus.m
+// SmartDeviceLink
+//
+// Created by James Lapinski on 6/29/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLRPCPermissionStatus.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLRPCPermissionStatus
+
+- (instancetype)initWithRPCName:(SDLRPCFunctionName)rpcName isRPCAllowed:(BOOL)isRPCAllowed rpcParameters:(nullable NSDictionary<NSString *,NSNumber *> *)rpcParameters {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _rpcName = rpcName;
+ _rpcAllowed = isRPCAllowed;
+ _rpcParameters = rpcParameters;
+
+ return self;
+}
+
+#pragma mark - Description
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"RPC Permission status, RPC name: %@, allowed: %@, RPC parameters %@", self.rpcName, (self.isRPCAllowed ? @"YES" : @"NO"), self.rpcParameters];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLResponseDispatcher.m b/SmartDeviceLink/SDLResponseDispatcher.m
index 7c5956616..5408ba9ed 100644
--- a/SmartDeviceLink/SDLResponseDispatcher.m
+++ b/SmartDeviceLink/SDLResponseDispatcher.m
@@ -162,7 +162,7 @@ NS_ASSUME_NONNULL_BEGIN
__block NSArray<SDLResponseHandler> *handlers = nil;
__block NSArray<SDLRPCRequest *> *requests = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
__strong typeof(weakself) strongself = weakself;
NSMutableArray *handlerArray = [NSMutableArray array];
NSMutableArray *requestArray = [NSMutableArray array];
@@ -236,7 +236,7 @@ NS_ASSUME_NONNULL_BEGIN
__block SDLResponseHandler handler = nil;
__block SDLRPCRequest *request = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
handler = self->_rpcResponseHandlerMap[response.correlationID];
request = self->_rpcRequestDictionary[response.correlationID];
}];
@@ -336,14 +336,6 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Utilities
-- (void)sdl_runSyncOnQueue:(void (^)(void))block {
- if (dispatch_get_specific(SDLProcessingQueueName) != nil) {
- block();
- } else {
- dispatch_sync(self.readWriteQueue, block);
- }
-}
-
- (void)sdl_runAsyncOnQueue:(void (^)(void))block {
if (dispatch_get_specific(SDLProcessingQueueName) != nil) {
block();
@@ -356,7 +348,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSMapTable<SDLRPCCorrelationId *, SDLResponseHandler> *)rpcResponseHandlerMap {
__block NSMapTable<SDLRPCCorrelationId *, SDLResponseHandler> *map = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
map = self->_rpcResponseHandlerMap;
}];
@@ -365,7 +357,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSMutableDictionary<SDLRPCCorrelationId *, SDLRPCRequest *> *)rpcRequestDictionary {
__block NSMutableDictionary<SDLRPCCorrelationId *, SDLRPCRequest *> *dict = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
dict = self->_rpcRequestDictionary;
}];
@@ -374,7 +366,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSMapTable<SDLAddCommandCommandId *, SDLRPCCommandNotificationHandler> *)commandHandlerMap {
__block NSMapTable<SDLAddCommandCommandId *, SDLRPCCommandNotificationHandler> *map = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
map = self->_commandHandlerMap;
}];
@@ -383,7 +375,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSMapTable<SDLSubscribeButtonName *, SDLRPCButtonNotificationHandler> *)buttonHandlerMap {
__block NSMapTable<SDLSubscribeButtonName *, SDLRPCButtonNotificationHandler> *map = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
map = self->_buttonHandlerMap;
}];
@@ -392,7 +384,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSMapTable<SDLSoftButtonId *, SDLRPCButtonNotificationHandler> *)customButtonHandlerMap {
__block NSMapTable<SDLSoftButtonId *, SDLRPCButtonNotificationHandler> *map = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
map = self->_customButtonHandlerMap;
}];
@@ -401,7 +393,7 @@ NS_ASSUME_NONNULL_BEGIN
- (nullable SDLAudioPassThruHandler)audioPassThruHandler {
__block SDLAudioPassThruHandler audioPassThruHandler = nil;
- [self sdl_runSyncOnQueue:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
audioPassThruHandler = self->_audioPassThruHandler;
}];
diff --git a/SmartDeviceLink/SDLScreenManager.h b/SmartDeviceLink/SDLScreenManager.h
index 4ffe0a28a..a08d3b40d 100644
--- a/SmartDeviceLink/SDLScreenManager.h
+++ b/SmartDeviceLink/SDLScreenManager.h
@@ -9,10 +9,12 @@
#import <Foundation/Foundation.h>
#import "NSNumber+NumberType.h"
+#import "SDLButtonName.h"
#import "SDLInteractionMode.h"
+#import "SDLMenuManagerConstants.h"
#import "SDLMetadataType.h"
+#import "SDLNotificationConstants.h"
#import "SDLTextAlignment.h"
-#import "SDLMenuManagerConstants.h"
@class SDLArtwork;
@class SDLChoiceCell;
@@ -21,6 +23,8 @@
@class SDLKeyboardProperties;
@class SDLMenuCell;
@class SDLMenuConfiguration;
+@class SDLOnButtonEvent;
+@class SDLOnButtonPress;
@class SDLSoftButtonObject;
@class SDLSystemCapabilityManager;
@class SDLVoiceCommand;
@@ -45,6 +49,13 @@ typedef void(^SDLScreenManagerUpdateCompletionHandler)(NSError *__nullable error
*/
typedef void(^SDLPreloadChoiceCompletionHandler)(NSError *__nullable error);
+/// A handler run when the subscribe button has been selected
+///
+/// @param buttonPress Indicates whether this is a long or short button press event
+/// @param buttonEvent Indicates that the button has been depressed or released
+/// @param error The error if one occurred
+typedef void (^SDLSubscribeButtonHandler)(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error);
+
/// 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..
@interface SDLScreenManager : NSObject
@@ -199,7 +210,7 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
*/
- (void)stop;
-#pragma mark Text and Graphic
+#pragma mark - Text and Graphic
/**
Delays all screen updates until endUpdatesWithCompletionHandler: is called.
*/
@@ -241,13 +252,48 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
*/
- (void)endUpdatesWithCompletionHandler:(nullable SDLScreenManagerUpdateCompletionHandler)handler;
-#pragma mark Soft Button
+#pragma mark - Soft Buttons
/// Retrieve a SoftButtonObject based on its name.
/// @param name The name of the button
- (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name;
-#pragma mark Choice Sets
+#pragma mark - Subscribe Buttons
+
+/// 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 `error` parameter of the updateHandler.
+/// @param buttonName The name of the hard button to subscribe to
+/// @param updateHandler The block run when the subscribe button is selected
+/// @return An object that can be used to unsubscribe the block using `unsubscribeButtonWithObserver:withCompletionHandler:`.
+- (id<NSObject>)subscribeButton:(SDLButtonName)buttonName withUpdateHandler:(SDLSubscribeButtonHandler)updateHandler;
+
+/// 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 `error` parameter of the selector.
+///
+/// The selector supports the following parameters:
+///
+/// 1. A selector with no parameters. The observer will be notified when a button press occurs (it will not know if a short or long press has occurred).
+///
+/// 2. A selector with one parameter: (SDLButtonName). The observer will be notified when a button press occurs (both a short and long press will trigger the selector, but it will not be able to distinguish between them). It will not be notified of button events.
+///
+/// 3. A selector with two parameters: (SDLButtonName, NSError). The observer will be notified when a button press occurs (both a short and long press will trigger the selector, but it will not be able to distinguish between them). It will not be notified of button events.
+///
+/// 4. A selector with three parameters: (SDLButtonName, NSError, SDLOnButtonPress). The observer will be notified when a long or short button press occurs (and can distinguish between a short or long press), but will not be notified of individual button events.
+///
+/// 5. A selector with four parameters: (SDLButtonName, NSError, SDLOnButtonPress, SDLOnButtonEvent). The observer will be notified when any button press or any button event occurs (and can distinguish between them).
+///
+/// To unsubscribe from the hard button, call `unsubscribeButton:withObserver:withCompletionHandler:`.
+///
+/// @param buttonName The name of the hard button to subscribe to
+/// @param observer The object that will have `selector` called whenever the button has been selected
+/// @param selector The selector on `observer` that will be called whenever the button has been selected
+- (void)subscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer selector:(SEL)selector;
+
+/// 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.
+/// @param buttonName The name of the hard button to subscribe to
+/// @param observer The object that will be unsubscribed. If a block was subscribed, the return value should be passed. If a selector was subscribed, the observer object should be passed
+/// @param completionHandler A handler called when the observer has been unsubscribed to the hard button
+- (void)unsubscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer withCompletionHandler:(SDLScreenManagerUpdateCompletionHandler)completionHandler;
+
+#pragma mark - Choice Sets
/**
Preload cells to the head unit. This will *greatly* reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You *do not* 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.
@@ -309,7 +355,7 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
*/
- (void)dismissKeyboardWithCancelID:(NSNumber<SDLInt> *)cancelID;
-#pragma mark Menu
+#pragma mark - Menu
/**
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.
diff --git a/SmartDeviceLink/SDLScreenManager.m b/SmartDeviceLink/SDLScreenManager.m
index 91c240662..9950521e8 100644
--- a/SmartDeviceLink/SDLScreenManager.m
+++ b/SmartDeviceLink/SDLScreenManager.m
@@ -11,6 +11,7 @@
#import "SDLChoiceSetManager.h"
#import "SDLMenuManager.h"
#import "SDLSoftButtonManager.h"
+#import "SDLSubscribeButtonManager.h"
#import "SDLTextAndGraphicManager.h"
#import "SDLVoiceCommandManager.h"
@@ -23,6 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLMenuManager *menuManager;
@property (strong, nonatomic) SDLVoiceCommandManager *voiceCommandMenuManager;
@property (strong, nonatomic) SDLChoiceSetManager *choiceSetManager;
+@property (strong, nonatomic) SDLSubscribeButtonManager *subscribeButtonManager;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
@@ -42,6 +44,7 @@ NS_ASSUME_NONNULL_BEGIN
_textAndGraphicManager = [[SDLTextAndGraphicManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
_softButtonManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
+ _subscribeButtonManager = [[SDLSubscribeButtonManager alloc] initWithConnectionManager:connectionManager];
_menuManager = [[SDLMenuManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
_voiceCommandMenuManager = [[SDLVoiceCommandManager alloc] initWithConnectionManager:connectionManager];
_choiceSetManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
@@ -54,6 +57,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.softButtonManager start];
[self.menuManager start];
[self.choiceSetManager start];
+ [self.subscribeButtonManager start];
handler(nil);
}
@@ -64,10 +68,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.menuManager stop];
[self.voiceCommandMenuManager stop];
[self.choiceSetManager stop];
-}
-
-- (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name {
- return [self.softButtonManager softButtonObjectNamed:name];
+ [self.subscribeButtonManager stop];
}
#pragma mark - Setters
@@ -259,6 +260,26 @@ NS_ASSUME_NONNULL_BEGIN
[self.textAndGraphicManager updateWithCompletionHandler:handler];
}
+#pragma mark - Subscribe Buttons
+
+- (id<NSObject>)subscribeButton:(SDLButtonName)buttonName withUpdateHandler:(SDLSubscribeButtonHandler)updateHandler {
+ return [self.subscribeButtonManager subscribeButton:buttonName withUpdateHandler:updateHandler];
+}
+
+- (void)subscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer selector:(SEL)selector {
+ [self.subscribeButtonManager subscribeButton:buttonName withObserver:observer selector:selector];
+}
+
+- (void)unsubscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer withCompletionHandler:(SDLScreenManagerUpdateCompletionHandler)completionHandler {
+ [self.subscribeButtonManager unsubscribeButton:buttonName withObserver:observer withCompletionHandler:completionHandler];
+}
+
+#pragma mark - Soft Buttons
+
+- (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name {
+ return [self.softButtonManager softButtonObjectNamed:name];
+}
+
#pragma mark - Choice Sets
- (void)deleteChoices:(NSArray<SDLChoiceCell *> *)choices {
diff --git a/SmartDeviceLink/SDLSecondaryTransportManager.h b/SmartDeviceLink/SDLSecondaryTransportManager.h
index 85f3cc79e..3552588db 100644
--- a/SmartDeviceLink/SDLSecondaryTransportManager.h
+++ b/SmartDeviceLink/SDLSecondaryTransportManager.h
@@ -6,7 +6,7 @@
// Copyright © 2018 Xevo Inc. All rights reserved.
//
-#import "SDLProtocolListener.h"
+#import "SDLProtocolDelegate.h"
#import "SDLStreamingProtocolDelegate.h"
@class SDLControlFramePayloadRPCStartServiceAck;
@@ -34,7 +34,7 @@ extern SDLSecondaryTransportState *const SDLSecondaryTransportStateReconnecting;
manager with appropriate SDLProtocol instance. When the secondary transport is
disconnected, this manager retries connection with a regular interval.
*/
-@interface SDLSecondaryTransportManager : NSObject <SDLProtocolListener>
+@interface SDLSecondaryTransportManager : NSObject <SDLProtocolDelegate>
/// Create a new secondary transport manager.
/// @param streamingProtocolDelegate a delegate to handle updates on protocol instances
@@ -46,11 +46,13 @@ extern SDLSecondaryTransportState *const SDLSecondaryTransportStateReconnecting;
/// @param primaryProtocol The protocol that runs on the main (primary) transport
- (void)startWithPrimaryProtocol:(SDLProtocol *)primaryProtocol;
-/// Stop the manager.
-- (void)stop;
+/// Stop the manager
+/// @param completionHandler Handler called when the manager has shutdown
+- (void)stopWithCompletionHandler:(void (^)(void))completionHandler;
/// Destroys the secondary transport.
-- (BOOL)disconnectSecondaryTransport;
+/// @param completionHandler Handler called when the session has been destroyed
+- (void)disconnectSecondaryTransportWithCompletionHandler:(void (^)(void))completionHandler;
@end
diff --git a/SmartDeviceLink/SDLSecondaryTransportManager.m b/SmartDeviceLink/SDLSecondaryTransportManager.m
index a65bd4bb3..f6054494e 100644
--- a/SmartDeviceLink/SDLSecondaryTransportManager.m
+++ b/SmartDeviceLink/SDLSecondaryTransportManager.m
@@ -110,9 +110,15 @@ struct TransportProtocolUpdated {
/// The current hmi level of the SDL app.
@property (strong, nonatomic, nullable) SDLHMILevel currentHMILevel;
+/// The current application state of the app on the phone. This information is tracked because TCP transport can only reliably work when the app on the phone is in the foreground. If the phone is locked or the app is put in the background for a long time, the OS can reclaim the socket.
+@property (assign, nonatomic) UIApplicationState currentApplicationState;
+
/// A background task used to close the secondary transport before the app is suspended.
@property (strong, nonatomic) SDLBackgroundTaskManager *backgroundTaskManager;
+/// A handler called when the secondary transport has been shutdown
+@property (nonatomic, copy, nullable) void (^disconnectCompletionHandler)(void);
+
@end
@implementation SDLSecondaryTransportManager
@@ -139,7 +145,16 @@ struct TransportProtocolUpdated {
_backgroundTaskManager = [[SDLBackgroundTaskManager alloc] initWithBackgroundTaskName:BackgroundTaskSecondaryTransportName];
+ _currentApplicationState = UIApplicationStateInactive;
+ __weak typeof(self) weakSelf = self;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ strongSelf.currentApplicationState = UIApplication.sharedApplication.applicationState;
+ });
+
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_appStateDidBecomeInactive:) name:UIApplicationWillResignActiveNotification object:nil];
return self;
}
@@ -166,7 +181,7 @@ struct TransportProtocolUpdated {
[self.stateMachine transitionToState:SDLSecondaryTransportStateStarted];
}
-- (void)stop {
+- (void)stopWithCompletionHandler:(void (^)(void))completionHandler {
SDLLogD(@"Stopping manager");
// this method must be called in SDLLifecycleManager's state machine queue
@@ -178,32 +193,20 @@ struct TransportProtocolUpdated {
SDLLogD(@"Stopping audio / video services on both transports");
[self sdl_handleTransportUpdateWithPrimaryAvailable:NO secondaryAvailable:NO];
- [self.stateMachine transitionToState:SDLSecondaryTransportStateStopped];
-}
+ if ([self.stateMachine.currentState isEqualToEnum:SDLSecondaryTransportStateStopped]) {
+ return completionHandler();
+ }
-#pragma mark - Manager Lifecycle
+ // In order to stop the secondary transport
+ // 1. The observer must be told to shut down the services running on the transports. This can take a few moments since a request must be sent to the module a response must be awaited.
+ // 2. Once the services have been shutdown, the observer will notifiy this class by calling `disconnectSecondaryTransportWithCompletionHandler`. The secondary transport can now be shutdown. This can take a few memoments since the I/O streams must be closed on the thread they were opened on.
+ // 3. Once the secondary transport has shutdown successfully, the `disconnectCompletionHandler` will be called.
+ self.disconnectCompletionHandler = completionHandler;
-- (void)sdl_startManager {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_onAppStateUpdated:) name:UIApplicationDidBecomeActiveNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_onAppStateUpdated:) name:UIApplicationWillResignActiveNotification object:nil];
+ [self.stateMachine transitionToState:SDLSecondaryTransportStateStopped];
}
-- (void)sdl_stopManager {
- SDLLogD(@"SDLSecondaryTransportManager stop");
-
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
-
- self.streamingServiceTransportMap = [@{@(SDLServiceTypeAudio):@(SDLTransportClassInvalid),
- @(SDLServiceTypeVideo):@(SDLTransportClassInvalid)} mutableCopy];
- self.secondaryTransportType = SDLSecondaryTransportTypeDisabled;
- self.transportsForAudioService = @[];
- self.transportsForVideoService = @[];
-
- self.ipAddress = nil;
- self.tcpPort = TCPPortUnspecified;
- self.currentHMILevel = nil;
-}
+#pragma mark - Manager Lifecycle
- (void)sdl_configureManager:(nullable NSArray<SDLSecondaryTransportTypeBox *> *)availableSecondaryTransports
availableTransportsForAudio:(nullable NSArray<SDLTransportClassBox *> *)availableTransportsForAudio
@@ -264,12 +267,25 @@ struct TransportProtocolUpdated {
- (void)didEnterStateStopped {
SDLLogD(@"Secondary transport manager stopped");
- [self sdl_stopManager];
+
+ self.streamingServiceTransportMap = [@{@(SDLServiceTypeAudio):@(SDLTransportClassInvalid),
+ @(SDLServiceTypeVideo):@(SDLTransportClassInvalid)} mutableCopy];
+ self.secondaryTransportType = SDLSecondaryTransportTypeDisabled;
+ self.transportsForAudioService = @[];
+ self.transportsForVideoService = @[];
+
+ self.ipAddress = nil;
+ self.tcpPort = TCPPortUnspecified;
+ self.currentHMILevel = nil;
+
+ if (self.disconnectCompletionHandler != nil) {
+ self.disconnectCompletionHandler();
+ self.disconnectCompletionHandler = nil;
+ }
}
- (void)didEnterStateStarted {
SDLLogD(@"Secondary transport manager started");
- [self sdl_startManager];
}
- (void)didEnterStateConfigured {
@@ -280,6 +296,8 @@ struct TransportProtocolUpdated {
|| self.secondaryTransportType == SDLSecondaryTransportTypeIAP)
&& self.sdl_isHMILevelNonNone) {
[self.stateMachine transitionToState:SDLSecondaryTransportStateConnecting];
+ } else {
+ SDLLogD(@"The secondary transport manager is not ready to transition to connecting state. The app's application state needs to be Active in order to create a socket (current app state is %ld) and we need the socket address (current IP address: %@ and port: %d)", (long)self.currentApplicationState, self.ipAddress, self.tcpPort);
}
}
@@ -304,17 +322,12 @@ struct TransportProtocolUpdated {
[self sdl_handleTransportUpdateWithPrimaryAvailable:YES secondaryAvailable:NO];
}
-- (void)willTransitionFromStateRegisteredToStateReconnecting {
- SDLLogD(@"Manger is closing transport but will try to reconnect if configured correctly. Stopping services on secondary transport");
- [self sdl_handleTransportUpdateWithPrimaryAvailable:YES secondaryAvailable:NO];
-}
-
- (void)didEnterStateReconnecting {
- SDLLogD(@"Secondary transport is reconnecting");
+ SDLLogD(@"The secondary transport manager will try to reconnect in %.01f seconds", RetryConnectionDelay);
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(RetryConnectionDelay * NSEC_PER_SEC)), _stateMachineQueue, ^{
if ([weakSelf.stateMachine isCurrentState:SDLSecondaryTransportStateReconnecting]) {
- SDLLogD(@"Attempting reconnection");
+ SDLLogD(@"Attempting to reconnect");
[weakSelf.stateMachine transitionToState:SDLSecondaryTransportStateConfigured];
}
});
@@ -388,9 +401,11 @@ struct TransportProtocolUpdated {
#pragma mark - Transport management
#pragma mark Primary transport
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
- if (startServiceACK.header.serviceType != SDLServiceTypeRPC) { return; }
- SDLLogV(@"Received Start Service ACK header of RPC service on primary transport");
+
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
+ if (startServiceACK.header.serviceType != SDLServiceTypeRPC || self.primaryProtocol != protocol) { return; }
+
+ SDLLogV(@"Received Start Service ACK header of RPC service on primary (%@) transport", protocol.transport);
// Keep header to acquire Session ID
self.primaryRPCHeader = startServiceACK.header;
@@ -400,9 +415,11 @@ struct TransportProtocolUpdated {
[self sdl_onStartServiceAckReceived:payload];
}
-- (void)handleTransportEventUpdateMessage:(SDLProtocolMessage *)transportEventUpdate {
+- (void)protocol:(SDLProtocol *)protocol didReceiveTransportEventUpdate:(SDLProtocolMessage *)transportEventUpdate {
+ if (self.primaryProtocol != protocol) { return; }
+
SDLControlFramePayloadTransportEventUpdate *payload = [[SDLControlFramePayloadTransportEventUpdate alloc] initWithData:transportEventUpdate.payload];
- SDLLogV(@"Recieved transport event update on primary transport: %@", payload);
+ SDLLogV(@"Recieved transport event update on primary (%@) transport: %@", protocol.transport, payload);
[self sdl_onTransportEventUpdateReceived:payload];
}
@@ -427,20 +444,24 @@ struct TransportProtocolUpdated {
}
}
-- (BOOL)disconnectSecondaryTransport {
+- (void)disconnectSecondaryTransportWithCompletionHandler:(void (^)(void))completionHandler {
if (self.secondaryTransport == nil) {
SDLLogW(@"Attempted to disconnect secondary transport but it's already stopped.");
- return NO;
+ return completionHandler();
}
- SDLLogD(@"Disconnecting secondary transport");
- [self.secondaryTransport disconnect];
- self.secondaryTransport = nil;
- self.secondaryProtocol = nil;
+ __weak typeof(self) weakSelf = self;
+ [self.secondaryTransport disconnectWithCompletionHandler:^{
+ SDLLogD(@"Disconnecting secondary transport manager");
- [self.backgroundTaskManager endBackgroundTask];
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ strongSelf.secondaryTransport = nil;
+ strongSelf.secondaryProtocol = nil;
+ [strongSelf.streamingServiceTransportMap removeAllObjects];
- return YES;
+ [strongSelf.backgroundTaskManager endBackgroundTask];
+ return completionHandler();
+ }];
}
- (BOOL)sdl_startTCPSecondaryTransport {
@@ -454,9 +475,8 @@ struct TransportProtocolUpdated {
SDLTCPTransport *transport = [[SDLTCPTransport alloc] init];
transport.hostName = self.ipAddress;
transport.portNumber = [NSString stringWithFormat:@"%d", self.tcpPort];
- SDLProtocol *protocol = [[SDLProtocol alloc] init];
- transport.delegate = protocol;
- protocol.transport = transport;
+
+ SDLProtocol *protocol = [[SDLProtocol alloc] initWithTransport:transport encryptionManager:self.primaryProtocol.encryptionLifecycleManager];
protocol.securityManager = self.primaryProtocol.securityManager;
self.secondaryProtocol = protocol;
self.secondaryTransport = transport;
@@ -479,9 +499,7 @@ struct TransportProtocolUpdated {
SDLLogD(@"Starting Secondary Transport: iAP");
SDLIAPTransport *transport = [[SDLIAPTransport alloc] init];
- SDLProtocol *protocol = [[SDLProtocol alloc] init];
- transport.delegate = protocol;
- protocol.transport = transport;
+ SDLProtocol *protocol = [[SDLProtocol alloc] initWithTransport:transport encryptionManager:self.primaryProtocol.encryptionLifecycleManager];
protocol.securityManager = self.primaryProtocol.securityManager;
self.secondaryProtocol = protocol;
self.secondaryTransport = transport;
@@ -514,7 +532,7 @@ struct TransportProtocolUpdated {
return NO;
}
- if (self.sdl_getAppState != UIApplicationStateActive) {
+ if (self.currentApplicationState != UIApplicationStateActive) {
SDLLogD(@"App state is not Active, TCP transport is not ready");
return NO;
}
@@ -522,23 +540,12 @@ struct TransportProtocolUpdated {
return YES;
}
-- (UIApplicationState)sdl_getAppState {
- if ([NSThread isMainThread]) {
- return [UIApplication sharedApplication].applicationState;
- } else {
- __block UIApplicationState appState;
- dispatch_sync(dispatch_get_main_queue(), ^{
- appState = [UIApplication sharedApplication].applicationState;
- });
- return appState;
- }
-}
-
-
-#pragma mark - SDLProtocolListener Implementation
+#pragma mark - SDLProtocolDelegate Implementation
// called on transport's thread, notifying that the transport is established
-- (void)onProtocolOpened {
+- (void)protocolDidOpen:(SDLProtocol *)protocol {
+ if (self.secondaryProtocol != protocol) { return; }
+
SDLLogD(@"Secondary transport connected");
self.registerTransportTimer = [[SDLTimer alloc] initWithDuration:RegisterTransportTime repeat:NO];
@@ -551,12 +558,12 @@ struct TransportProtocolUpdated {
return;
}
- // if the state is still Connecting, go back to Configured state and retry immediately
+ // If still in Connecting state, shutdown the transport and try to reconnect
if ([strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateConnecting]) {
- SDLLogD(@"Retry secondary transport connection after registration timeout");
- [strongSelf.stateMachine transitionToState:SDLSecondaryTransportStateConfigured];
+ SDLLogD(@"Shutting down and restarting the secondary transport connection after registration timeout");
+ [strongSelf sdl_transportClosed];
} else {
- SDLLogD(@"Will not retry secondary transport connection because current state is: %@", strongSelf.stateMachine.currentState);
+ SDLLogD(@"Could not register the secondary transport with the module. The services will not be started on the secondary transport.");
}
});
};
@@ -565,27 +572,44 @@ struct TransportProtocolUpdated {
[self.secondaryProtocol registerSecondaryTransport];
}
-- (void)onTransportError:(NSError *)error {
- SDLLogE(@"The transport errored. Disconnecting the transport");
- [self disconnectSecondaryTransport];
+/// Called on the transport's thread, notifying that the transport has errored before a connection was established.
+/// @param error The error
+/// @param protocol The protocol
+- (void)protocol:(SDLProtocol *)protocol transportDidError:(NSError *)error {
+ if (self.secondaryProtocol != protocol) { return; }
+
+ SDLLogE(@"The secondary transport errored.");
+ [self sdl_transportClosed];
}
-// called on transport's thread, notifying that the transport is disconnected
-// (Note: when transport's disconnect method is called, this method will not be called)
-- (void)onProtocolClosed {
- SDLLogD(@"secondary transport disconnected");
+/// Called on transport's thread, notifying that the transport is disconnected.
+/// @discussion When the transport's disconnect method is called, this method will not be called.
+/// @param protocol The protocol
+- (void)protocolDidClose:(SDLProtocol *)protocol {
+ if (self.secondaryProtocol != protocol) { return; }
+
+ SDLLogE(@"The secondary transport disconnected.");
+ [self sdl_transportClosed];
+}
+/// Try to reconnect the secondary transport if the transport errored during the connection attempt or closed unexpectedly.
+- (void)sdl_transportClosed {
dispatch_async(self.stateMachineQueue, ^{
if ([self sdl_isTransportOpened]) {
+ SDLLogV(@"Secondary transport is ready to reconnect. Attempting to reconnect the secondary transport");
+ [self.streamingProtocolDelegate transportClosed];
[self.stateMachine transitionToState:SDLSecondaryTransportStateReconnecting];
+ } else {
+ SDLLogD(@"Secondary transport is not ready to reconnect. Will not attempt to reconnect the secondary transport");
}
});
}
// called from SDLProtocol's _receiveQueue of secondary transport
-- (void)handleProtocolRegisterSecondaryTransportACKMessage:(SDLProtocolMessage *)registerSecondaryTransportACK {
- SDLLogD(@"Received Register Secondary Transport ACK frame");
+- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportACK:(SDLProtocolMessage *)registerSecondaryTransportACK {
+ if (self.secondaryProtocol != protocol) { return; }
+ SDLLogD(@"Received Register Secondary Transport ACK on the secondary (%@) transport", protocol.transport);
dispatch_async(self.stateMachineQueue, ^{
// secondary transport is now ready
[self.stateMachine transitionToState:SDLSecondaryTransportStateRegistered];
@@ -593,10 +617,14 @@ struct TransportProtocolUpdated {
}
// called from SDLProtocol's _receiveQueue of secondary transport
-- (void)handleProtocolRegisterSecondaryTransportNAKMessage:(SDLProtocolMessage *)registerSecondaryTransportNAK {
- SDLLogW(@"Received Register Secondary Transport NAK frame");
+- (void)protocol:(SDLProtocol *)protocol didReceiveRegisterSecondaryTransportNAK:(SDLProtocolMessage *)registerSecondaryTransportNAK {
+ if (self.secondaryProtocol != protocol) { return; }
+ SDLLogW(@"Received Register Secondary Transport NAK on the secondary (%@) transport", protocol.transport);
dispatch_async(self.stateMachineQueue, ^{
+ if ([self.stateMachine.currentState isEqualToEnum:SDLSecondaryTransportStateRegistered]) {
+ [self sdl_handleTransportUpdateWithPrimaryAvailable:YES secondaryAvailable:NO];
+ }
[self.stateMachine transitionToState:SDLSecondaryTransportStateReconnecting];
});
}
@@ -677,34 +705,42 @@ struct TransportProtocolUpdated {
/// Closes and re-opens the the secondary transport when the app is backgrounded and foregrounded on the device respectively. This is done because sockets can be reclaimed by the system at anytime when the app is not in the foreground.
/// @param notification Notification from the OS that the app's life-cycle state has changed
-- (void)sdl_onAppStateUpdated:(NSNotification *)notification {
+- (void)sdl_appStateDidBecomeActive:(NSNotification *)notification {
+ self.currentApplicationState = UIApplicationStateActive;
+
__weak typeof(self) weakSelf = self;
dispatch_async(self.stateMachineQueue, ^{
__strong typeof(self) strongSelf = weakSelf;
- if (notification.name == UIApplicationWillResignActiveNotification) {
- SDLLogD(@"App will enter the background");
- if ([strongSelf sdl_isTransportOpened] && strongSelf.secondaryTransportType == SDLSecondaryTransportTypeTCP) {
- SDLLogD(@"Starting background task to keep TCP transport alive");
- strongSelf.backgroundTaskManager.taskExpiringHandler = [strongSelf sdl_backgroundTaskEndedHandler];
- [strongSelf.backgroundTaskManager startBackgroundTask];
- } else {
- SDLLogD(@"TCP transport already disconnected, will not start a background task.");
- }
- } else if (notification.name == UIApplicationDidBecomeActiveNotification) {
- SDLLogD(@"App entered the foreground");
- if ([strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateRegistered]) {
- SDLLogD(@"In the registered state; TCP transport has not yet been shutdown. Ending the background task.");
- [strongSelf.backgroundTaskManager endBackgroundTask];
- } else if ([strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateConfigured]
- && strongSelf.secondaryTransportType == SDLSecondaryTransportTypeTCP
- && [strongSelf sdl_isTCPReady]
- && [strongSelf sdl_isHMILevelNonNone]) {
- SDLLogD(@"In the configured state; restarting the TCP transport. Ending the background task.");
- [strongSelf.backgroundTaskManager endBackgroundTask];
- [strongSelf.stateMachine transitionToState:SDLSecondaryTransportStateConnecting];
- } else {
- SDLLogD(@"TCP transport not ready to start, our current state is: %@", strongSelf.stateMachine.currentState);
- }
+ SDLLogD(@"App entered the foreground");
+ if ([strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateRegistered]) {
+ SDLLogD(@"In the registered state; TCP transport has not yet been shutdown. Ending the background task.");
+ [strongSelf.backgroundTaskManager endBackgroundTask];
+ } else if ([strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateConfigured]
+ && strongSelf.secondaryTransportType == SDLSecondaryTransportTypeTCP
+ && [strongSelf sdl_isTCPReady]
+ && [strongSelf sdl_isHMILevelNonNone]) {
+ SDLLogD(@"In the configured state; restarting the TCP transport. Ending the background task.");
+ [strongSelf.backgroundTaskManager endBackgroundTask];
+ [strongSelf.stateMachine transitionToState:SDLSecondaryTransportStateConnecting];
+ } else {
+ SDLLogD(@"TCP transport not ready to start, secondary transport state must be in state Configured (currently in state: %@), the SDL app hmi level must be non-NONE (currently in state: %@), and the app must be ready to start a TCP socket (current app state: %ld, current IP address: %@, current port: %d)", strongSelf.stateMachine.currentState, strongSelf.currentHMILevel, self.currentApplicationState, self.ipAddress, self.tcpPort);
+ }
+ });
+}
+
+- (void)sdl_appStateDidBecomeInactive:(NSNotification *)notification {
+ self.currentApplicationState = UIApplicationStateInactive;
+
+ __weak typeof(self) weakSelf = self;
+ dispatch_async(self.stateMachineQueue, ^{
+ __strong typeof(self) strongSelf = weakSelf;
+ SDLLogD(@"App will enter the background");
+ if ([strongSelf sdl_isTransportOpened] && strongSelf.secondaryTransportType == SDLSecondaryTransportTypeTCP) {
+ SDLLogD(@"Starting background task to keep TCP transport alive");
+ strongSelf.backgroundTaskManager.taskExpiringHandler = [strongSelf sdl_backgroundTaskEndedHandler];
+ [strongSelf.backgroundTaskManager startBackgroundTask];
+ } else {
+ SDLLogD(@"TCP transport already disconnected, will not start a background task.");
}
});
}
@@ -715,7 +751,7 @@ struct TransportProtocolUpdated {
__weak typeof(self) weakSelf = self;
return ^{
__strong typeof(self) strongSelf = weakSelf;
- if (strongSelf.sdl_getAppState == UIApplicationStateActive || [strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateStopped]) {
+ if (strongSelf.currentApplicationState == UIApplicationStateActive || [strongSelf.stateMachine isCurrentState:SDLSecondaryTransportStateStopped]) {
// Return NO as we do not need to perform any cleanup and can end the background task immediately
SDLLogV(@"No cleanup needed since app has been foregrounded.");
return NO;
@@ -790,6 +826,7 @@ struct TransportProtocolUpdated {
}
#pragma mark - RPC Notifications
+
/// Check and track the HMI status to ensure that the secondary transport only attempts a connection in non-NONE HMI states
///
/// See: https://github.com/smartdevicelink/sdl_evolution/blob/master/proposals/0214-secondary-transport-optimization.md
diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m
index 979bd1bcd..d3a68735c 100644
--- a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m
+++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m
@@ -50,39 +50,42 @@ NS_ASSUME_NONNULL_BEGIN
[super start];
if (self.isCancelled) { return; }
- // Check the state of our images
+ // Check if soft buttons have images and, if so, if the images need to be uploaded
if (![self sdl_supportsSoftButtonImages]) {
- // We don't support images at all
+ // The module does not support images
SDLLogW(@"Soft button images are not supported. Attempting to send text-only soft buttons. If any button does not contain text, no buttons will be sent.");
- // Send text buttons if all the soft buttons have text
+ // Send text-only buttons if all current states for the soft buttons have text
__weak typeof(self) weakself = self;
[self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^(BOOL success) {
+ __strong typeof(weakself) strongself = weakself;
if (!success) {
- SDLLogE(@"Head unit does not support images and some of the soft buttons do not have text, so none of the buttons will be sent.");
+ SDLLogE(@"Buttons will not be sent because the module does not support images and some of the buttons do not have text");
}
- [weakself finishOperation];
+ [strongself finishOperation];
}];
- } else if ([self sdl_currentStateHasImages] && ![self sdl_allCurrentStateImagesAreUploaded]) {
- // If there are images that aren't uploaded
- // Send text buttons if all the soft buttons have text
+ } else if (![self sdl_allStateImagesAreUploaded]) {
+ // If there are images in the first soft button state that have not yet been uploaded, send a text-only version of the soft buttons (the text-only buttons will only be sent if all the first button states have text)
[self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^(BOOL success) {}];
- // Upload initial images
+ // Upload images used in the first soft button state
__weak typeof(self) weakself = self;
[self sdl_uploadInitialStateImagesWithCompletionHandler:^{
- // Send initial soft buttons w/ images
- [weakself sdl_sendCurrentStateSoftButtonsWithCompletionHandler:^{
- // Upload other images
- [weakself sdl_uploadOtherStateImagesWithCompletionHandler:^{
+ SDLLogV(@"Finished sending images for the first soft button states");
+ // Now that the images have been uploaded, send the soft buttons with images
+ __strong typeof(weakself) strongself = weakself;
+ [strongself sdl_sendCurrentStateSoftButtonsWithCompletionHandler:^{
+ // Finally, upload the images used in the other button states
+ __strong typeof(weakself) strongself = weakself;
+ [strongself sdl_uploadOtherStateImagesWithCompletionHandler:^{
__strong typeof(weakself) strongself = weakself;
- SDLLogV(@"Finished sending other images for soft buttons");
+ SDLLogV(@"Finished sending images for the other soft button states");
[strongself finishOperation];
}];
}];
}];
} else {
- // All the images are already uploaded. Send initial soft buttons w/ images.
+ // All the images have been uploaded. Send initial soft buttons with images.
__weak typeof(self) weakself = self;
[self sdl_sendCurrentStateSoftButtonsWithCompletionHandler:^{
__strong typeof(weakself) strongself = weakself;
@@ -95,8 +98,9 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Uploading Images
+/// Upload the initial state images.
+/// @param handler Called when all images have been uploaded
- (void)sdl_uploadInitialStateImagesWithCompletionHandler:(void (^)(void))handler {
- // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready.
NSMutableArray<SDLArtwork *> *initialStatesToBeUploaded = [NSMutableArray array];
for (SDLSoftButtonObject *object in self.softButtonObjects) {
if ([self sdl_artworkNeedsUpload:object.currentState.artwork]) {
@@ -104,41 +108,13 @@ NS_ASSUME_NONNULL_BEGIN
}
}
- if (initialStatesToBeUploaded.count == 0) {
- SDLLogV(@"No initial state artworks to upload");
- handler();
- return;
- }
-
- SDLLogD(@"Uploading soft button initial artworks");
- NSMutableArray<NSString *> *failedArtworkNames = [NSMutableArray array];
- __weak typeof(self) weakself = self;
- [self.fileManager uploadArtworks:[initialStatesToBeUploaded copy] progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) {
- SDLLogV(@"Uploaded initial state artwork: %@, error: %@, percent complete: %f.2%%", artworkName, error, uploadPercentage * 100);
- if (error != nil) {
- [failedArtworkNames addObject:artworkName];
- }
-
- if (weakself.isCancelled) {
- [weakself finishOperation];
- return NO;
- }
-
- return YES;
- } completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error uploading soft button artworks: %@", error);
- } else {
- SDLLogD(@"Soft button initial state artworks uploaded");
- }
-
- handler();
- }];
+ [self sdl_uploadImages:initialStatesToBeUploaded forStateName:@"Initial" completionHandler:handler];
}
+/// Upload the other state images.
+/// @param handler Called when all images have been uploaded
- (void)sdl_uploadOtherStateImagesWithCompletionHandler:(void (^)(void))handler {
NSMutableArray<SDLArtwork *> *otherStatesToBeUploaded = [NSMutableArray array];
- // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready.
for (SDLSoftButtonObject *object in self.softButtonObjects) {
for (SDLSoftButtonState *state in object.states) {
if ([state.name isEqualToString:object.currentState.name]) { continue; }
@@ -148,35 +124,39 @@ NS_ASSUME_NONNULL_BEGIN
}
}
- if (otherStatesToBeUploaded.count == 0) {
- SDLLogV(@"No other state artworks to upload");
- handler();
+ [self sdl_uploadImages:otherStatesToBeUploaded forStateName:@"Other" completionHandler:handler];
+}
+
+/// Helper method for uploading images
+/// @param images The images to upload
+/// @param stateName The name of the button states for which the images are being uploaded. Used for logs.
+/// @param completionHandler Called when all images have been uploaded
+- (void)sdl_uploadImages:(NSArray<SDLArtwork *> *)images forStateName:(NSString *)stateName completionHandler:(void (^)(void))completionHandler {
+ if (images.count == 0) {
+ SDLLogV(@"No images to upload for %@ states", stateName);
+ completionHandler();
return;
}
- SDLLogD(@"Uploading soft button other state artworks");
- NSMutableArray<NSString *> *failedArtworkNames = [NSMutableArray array];
+ SDLLogD(@"Uploading images for %@ states", stateName);
__weak typeof(self) weakself = self;
- [self.fileManager uploadArtworks:[otherStatesToBeUploaded copy] progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) {
- SDLLogV(@"Uploaded other state artwork: %@, error: %@, percent complete: %f.2%%", artworkName, error, uploadPercentage * 100);
- if (error != nil) {
- [failedArtworkNames addObject:artworkName];
- }
-
- if (weakself.isCancelled) {
- [weakself finishOperation];
+ [self.fileManager uploadArtworks:[images copy] progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) {
+ __strong typeof(weakself) strongself = weakself;
+ SDLLogV(@"Uploaded %@ states images: %@, error: %@, percent complete: %f.2%%", stateName, artworkName, error, uploadPercentage * 100);
+ if (strongself.isCancelled) {
+ [strongself finishOperation];
return NO;
}
return YES;
} completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
if (error != nil) {
- SDLLogE(@"Error uploading soft button artworks: %@", error);
+ SDLLogE(@"Error uploading %@ states images: %@", stateName, error);
} else {
- SDLLogD(@"Soft button other state artworks uploaded");
+ SDLLogD(@"All %@ states images uploaded", stateName);
}
- handler();
+ completionHandler();
}];
}
@@ -251,20 +231,13 @@ NS_ASSUME_NONNULL_BEGIN
return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && self.softButtonCapabilities.imageSupported.boolValue && !artwork.isStaticIcon);
}
-- (BOOL)sdl_currentStateHasImages {
- for (SDLSoftButtonObject *object in self.softButtonObjects) {
- if (object.currentState.artwork != nil) {
- return YES;
- }
- }
-
- return NO;
-}
-
-- (BOOL)sdl_allCurrentStateImagesAreUploaded {
+/// 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) {
- SDLArtwork *artwork = button.currentState.artwork;
- if ([self sdl_artworkNeedsUpload:artwork]) {
+ for (SDLSoftButtonState *state in button.states) {
+ SDLArtwork *artwork = state.artwork;
+ if (![self sdl_artworkNeedsUpload:artwork]) { continue; }
return NO;
}
}
diff --git a/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h
index cfa10ca5d..436bd5ca5 100644
--- a/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h
+++ b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.h
@@ -9,7 +9,7 @@
#import <Foundation/Foundation.h>
#import "SDLHMILevel.h"
-#import "SDLProtocolListener.h"
+#import "SDLProtocolDelegate.h"
#import "SDLStreamingAudioManagerType.h"
#import "SDLStreamingMediaManagerConstants.h"
@@ -25,7 +25,7 @@
NS_ASSUME_NONNULL_BEGIN
-@interface SDLStreamingAudioLifecycleManager : NSObject <SDLProtocolListener, SDLStreamingAudioManagerType>
+@interface SDLStreamingAudioLifecycleManager : NSObject <SDLProtocolDelegate, SDLStreamingAudioManagerType>
@property (nonatomic, strong, readonly) SDLAudioStreamManager *audioTranscodingManager;
@@ -79,6 +79,11 @@ NS_ASSUME_NONNULL_BEGIN
/// @param audioEndedCompletionHandler Called when the module ACKs or NAKs to the request to end the audio service.
- (void)endAudioServiceWithCompletionHandler:(void (^)(void))audioEndedCompletionHandler;
+/// This method is used internally to stop audio streaming when the secondary transport has been closed due to an connection error. The primary transport is still open.
+/// 1. Since the transport has been closed, we can not send an end audio service control frame to the module.
+/// 2. Since the primary transport is still open, we will not reset the `hmiLevel`. This lets us resume audio streaming if the secondary transport can be reestablished during the same app session.
+- (void)secondaryTransportDidDisconnect;
+
/**
* This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback
*
diff --git a/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m
index 50fb56dac..af806d779 100644
--- a/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m
+++ b/SmartDeviceLink/SDLStreamingAudioLifecycleManager.m
@@ -108,9 +108,13 @@ NS_ASSUME_NONNULL_BEGIN
[self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
}
-- (void)endAudioServiceWithCompletionHandler:(void (^)(void))completionHandler {
+- (void)secondaryTransportDidDisconnect {
+ [self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
+}
+
+- (void)endAudioServiceWithCompletionHandler:(void (^)(void))audioEndedCompletionHandler {
SDLLogD(@"Ending audio service");
- self.audioServiceEndedCompletionHandler = completionHandler;
+ self.audioServiceEndedCompletionHandler = audioEndedCompletionHandler;
[self.audioTranscodingManager stop];
[self.protocol endServiceWithType:SDLServiceTypeAudio];
@@ -186,16 +190,16 @@ NS_ASSUME_NONNULL_BEGIN
[self.protocol endServiceWithType:SDLServiceTypeAudio];
}
-#pragma mark - SDLProtocolListener
+#pragma mark - SDLProtocolDelegate
#pragma mark Start Service ACK/NAK
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
if (startServiceACK.header.serviceType != SDLServiceTypeAudio) { return; }
self.audioEncrypted = startServiceACK.header.encrypted;
SDLControlFramePayloadAudioStartServiceAck *audioAckPayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithData:startServiceACK.payload];
- SDLLogD(@"Request to start audio service ACKed with payload: %@", audioAckPayload);
+ SDLLogD(@"Request to start audio service ACKed on transport %@, with payload: %@", protocol.transport, audioAckPayload);
if (audioAckPayload.mtu != SDLControlFrameInt64NotFound) {
[[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)audioAckPayload.mtu forServiceType:SDLServiceTypeAudio];
@@ -204,27 +208,28 @@ NS_ASSUME_NONNULL_BEGIN
[self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateReady];
}
-- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK {
if (startServiceNAK.header.serviceType != SDLServiceTypeAudio) { return; }
- SDLLogE(@"Request to start audio service NAKed");
+
+ SDLLogE(@"Request to start audio service NAKed on transport %@, with payload: %@", protocol.transport, startServiceNAK.payload);
[self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
}
#pragma mark End Service ACK/NAK
-- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK {
if (endServiceACK.header.serviceType != SDLServiceTypeAudio) { return; }
- SDLLogD(@"Request to end audio service ACKed");
+ SDLLogD(@"Request to end audio service ACKed on transport %@", protocol.transport);
[self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
}
-- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK {
if (endServiceNAK.header.serviceType != SDLServiceTypeAudio) { return; }
SDLControlFramePayloadNak *nakPayload = [[SDLControlFramePayloadNak alloc] initWithData:endServiceNAK.payload];
- SDLLogE(@"Request to end audio service NAKed with playlod: %@", nakPayload);
+ SDLLogE(@"Request to end audio service NAKed on transport %@, with payload: %@", protocol.transport, nakPayload);
/// Core will NAK the audio end service control frame if audio is not streaming or if video is streaming but the HMI does not recognize that audio is streaming.
[self.audioStreamStateMachine transitionToState:SDLAudioStreamManagerStateStopped];
diff --git a/SmartDeviceLink/SDLStreamingMediaManager.h b/SmartDeviceLink/SDLStreamingMediaManager.h
index c3184c21d..495f466cf 100644
--- a/SmartDeviceLink/SDLStreamingMediaManager.h
+++ b/SmartDeviceLink/SDLStreamingMediaManager.h
@@ -135,6 +135,11 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager configuration:(SDLConfiguration *)configuration systemCapabilityManager:(nullable SDLSystemCapabilityManager *)systemCapabilityManager NS_DESIGNATED_INITIALIZER;
/**
+ * Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on `SDLManager`.
+ */
+- (void)startWithProtocol:(SDLProtocol *)protocol;
+
+/**
* Stop the manager. This method is used internally.
*/
- (void)stop;
@@ -181,22 +186,17 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (BOOL)sendAudioData:(NSData *)audioData;
-#pragma mark - Secondary Transport Specific
-
-/**
- * Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on `SDLManager`.
- */
-- (void)startWithProtocol:(SDLProtocol *)protocol __deprecated_msg("Use startSecondaryTransportWithProtocol: instead");
+#pragma mark - Deprecated Methods
/**
* Start the audio feature of the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on `SDLManager`.
*/
-- (void)startAudioWithProtocol:(SDLProtocol *)protocol __deprecated_msg("Use startSecondaryTransportWithProtocol: instead");
+- (void)startAudioWithProtocol:(SDLProtocol *)protocol __deprecated_msg("Use startWithProtocol: instead");
/**
* Start the video feature of the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on `SDLManager`.
*/
-- (void)startVideoWithProtocol:(SDLProtocol *)protocol __deprecated_msg("Use startSecondaryTransportWithProtocol: instead");
+- (void)startVideoWithProtocol:(SDLProtocol *)protocol __deprecated_msg("Use startWithProtocol: instead");
@end
diff --git a/SmartDeviceLink/SDLStreamingMediaManager.m b/SmartDeviceLink/SDLStreamingMediaManager.m
index 01c8e557e..3b6a14890 100644
--- a/SmartDeviceLink/SDLStreamingMediaManager.m
+++ b/SmartDeviceLink/SDLStreamingMediaManager.m
@@ -94,17 +94,17 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Secondary Transport
-- (void)startSecondaryTransportWithProtocol:(SDLProtocol *)protocol {
+- (void)startWithProtocol:(SDLProtocol *)protocol {
[self didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:protocol fromOldAudioProtocol:nil toNewAudioProtocol:protocol];
}
-- (void)sdl_disconnectSecondaryTransport {
+- (void)sdl_disconnectSecondaryTransportWithCompletionHandler:(void (^)(void))completionHandler {
if (self.secondaryTransportManager == nil) {
SDLLogV(@"Attempting to disconnect a non-existent secondary transport. Returning.");
- return;
+ return completionHandler();
}
- [self.secondaryTransportManager disconnectSecondaryTransport];
+ [self.secondaryTransportManager disconnectSecondaryTransportWithCompletionHandler:completionHandler];
}
# pragma mark SDLStreamingProtocolDelegate
@@ -149,22 +149,51 @@ NS_ASSUME_NONNULL_BEGIN
// This will always run
dispatch_group_notify(endServiceTask, [SDLGlobals sharedGlobals].sdlProcessingQueue, ^{
if (oldVideoProtocol != nil || oldAudioProtocol != nil) {
- SDLLogV(@"Disconnecting the secondary transport");
- [self sdl_disconnectSecondaryTransport];
-
- SDLLogD(@"Destroying the audio and video protocol and starting new audio and video protocols");
- self.audioProtocol = nil;
- self.videoProtocol = nil;
+ [self sdl_reconnectSecondaryTransportWithNewVideoProtocol:newVideoProtocol newAudioProtocol:newAudioProtocol transportDestroyed:false];
+ } else {
+ SDLLogV(@"No need to disconnect the secondary transport. Starting new audio and video protocols");
+ [self sdl_startNewProtocolForAudio:newAudioProtocol forVideo:newVideoProtocol];
}
-
- [self sdl_startNewProtocolForAudio:newAudioProtocol forVideo:newVideoProtocol];
});
}
+- (void)transportClosed {
+ [self sdl_reconnectSecondaryTransportWithNewVideoProtocol:nil newAudioProtocol:nil transportDestroyed:true];
+}
+
+/// Disconnects the secondary transport. If the transport is still open and a new video or audio protocol have been set, then a new video/audio sessions are attempted. If the transport has been closed, then the audio/video managers are stopped.
+/// @param newVideoProtocol The new video protocol
+/// @param newAudioProtocol The new audio protocol
+/// @param transportDestroyed Whether or not the transport is still open
+- (void)sdl_reconnectSecondaryTransportWithNewVideoProtocol:(nullable SDLProtocol *)newVideoProtocol newAudioProtocol:(nullable SDLProtocol *)newAudioProtocol transportDestroyed:(BOOL)transportDestroyed {
+ SDLLogV(@"Disconnecting the secondary transport");
+ __weak typeof(self) weakSelf = self;
+ [self sdl_disconnectSecondaryTransportWithCompletionHandler:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (transportDestroyed) {
+ SDLLogD(@"Transport destroyed. Shutting down audio and video managers");
+ [strongSelf.audioLifecycleManager secondaryTransportDidDisconnect];
+ [strongSelf.videoLifecycleManager secondaryTransportDidDisconnect];
+ strongSelf.audioProtocol = nil;
+ strongSelf.videoProtocol = nil;
+ } else {
+ SDLLogD(@"Checking if new audio and video sessions need to be started on the transport");
+ strongSelf.audioProtocol = nil;
+ strongSelf.videoProtocol = nil;
+ [strongSelf sdl_startNewProtocolForAudio:newAudioProtocol forVideo:newVideoProtocol];
+ }
+ }];
+}
+
/// Starts the audio and/or video services using the new protocol.
/// @param newAudioProtocol The new audio protocol
/// @param newVideoProtocol The new video protocol
- (void)sdl_startNewProtocolForAudio:(nullable SDLProtocol *)newAudioProtocol forVideo:(nullable SDLProtocol *)newVideoProtocol {
+ if (newAudioProtocol == nil && newVideoProtocol == nil) {
+ SDLLogD(@"No new audio or video session will be started");
+ return;
+ }
+
if (newAudioProtocol != nil) {
self.audioProtocol = newAudioProtocol;
[self.audioLifecycleManager startWithProtocol:newAudioProtocol];
@@ -177,16 +206,7 @@ NS_ASSUME_NONNULL_BEGIN
}
}
-- (void)startWithProtocol:(SDLProtocol *)protocol {
- self.audioProtocol = protocol;
- self.videoProtocol = protocol;
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- [self startAudioWithProtocol:protocol];
- [self startVideoWithProtocol:protocol];
-#pragma clang diagnostic pop
-}
+#pragma mark Deprecated
- (void)startAudioWithProtocol:(SDLProtocol *)protocol {
self.audioProtocol = protocol;
diff --git a/SmartDeviceLink/SDLStreamingProtocolDelegate.h b/SmartDeviceLink/SDLStreamingProtocolDelegate.h
index 259cc502b..1639c3b7d 100644
--- a/SmartDeviceLink/SDLStreamingProtocolDelegate.h
+++ b/SmartDeviceLink/SDLStreamingProtocolDelegate.h
@@ -14,9 +14,9 @@ NS_ASSUME_NONNULL_BEGIN
@protocol SDLStreamingProtocolDelegate <NSObject>
-/// Called when protocol instance for audio and/or video service has been updated.
+/// Called when protocol instance for audio and/or video service has been updated and the transport is established.
///
-/// If `newVideoProtocol` or `newAudioProtocol` is nil it indicates that underlying transport has become unavailable.
+/// If `newVideoProtocol` or `newAudioProtocol` have been set then the transport is established and a current session can be started. If `newVideoProtocol` or `newAudioProtocol` is nil it indicates that underlying transport will become unavailable and any ongoing sessions on that transport should be stopped (i.e. send a request to the module to stop the session and wait for a response).
///
/// @param oldVideoProtocol protocol instance that was being used for video streaming
/// @param newVideoProtocol protocol instance that will be used for video streaming
@@ -24,6 +24,11 @@ NS_ASSUME_NONNULL_BEGIN
/// @param newAudioProtocol protocol instance that will be used for audio streaming
- (void)didUpdateFromOldVideoProtocol:(nullable SDLProtocol *)oldVideoProtocol toNewVideoProtocol:(nullable SDLProtocol *)newVideoProtocol fromOldAudioProtocol:(nullable SDLProtocol *)oldAudioProtocol toNewAudioProtocol:(nullable SDLProtocol *)newAudioProtocol;
+/// Called when the audio and/or video must be stopped because the transport has been destroyed or errored out.
+///
+/// Since the transport does not exist, current sessions can not be properly stopped (i.e. no request can be sent module to stop the session) but the observer still needs to stop creating and sending data.
+- (void)transportClosed;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLStreamingVideoLifecycleManager.h b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.h
index 54021b6ba..9fb1b39a1 100644
--- a/SmartDeviceLink/SDLStreamingVideoLifecycleManager.h
+++ b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.h
@@ -10,7 +10,7 @@
#import <VideoToolbox/VideoToolbox.h>
#import "SDLHMILevel.h"
-#import "SDLProtocolListener.h"
+#import "SDLProtocolDelegate.h"
#import "SDLStreamingMediaManagerConstants.h"
#import "SDLVideoStreamingFormat.h"
#import "SDLVideoStreamingState.h"
@@ -32,7 +32,7 @@
NS_ASSUME_NONNULL_BEGIN
-@interface SDLStreamingVideoLifecycleManager : NSObject <SDLProtocolListener>
+@interface SDLStreamingVideoLifecycleManager : NSObject <SDLProtocolDelegate>
@property (strong, nonatomic, readonly) SDLStateMachine *videoStreamStateMachine;
@property (strong, nonatomic, readonly) SDLVideoStreamManagerState *currentVideoStreamState;
@@ -157,6 +157,11 @@ NS_ASSUME_NONNULL_BEGIN
/// @param videoEndedCompletionHandler Called when the module ACKs or NAKs to the request to end the video service.
- (void)endVideoServiceWithCompletionHandler:(void (^)(void))videoEndedCompletionHandler;
+/// This method is used internally to stop video streaming when the secondary transport has been closed due to an connection error. The primary transport is still open.
+/// 1. Since the transport has been closed, we can not send an end video service control frame to the module.
+/// 2. Since the primary transport is still open, we will not reset the `hmiLevel`, `videoStreamingState` or the video scale manager. This lets us resume video streaming if the secondary transport can be reestablished during the same app session.
+- (void)secondaryTransportDidDisconnect;
+
/**
* This method receives raw image data and will run iOS8+'s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.
*
diff --git a/SmartDeviceLink/SDLStreamingVideoLifecycleManager.m b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.m
index 168ddf3e3..b5f75cf32 100644
--- a/SmartDeviceLink/SDLStreamingVideoLifecycleManager.m
+++ b/SmartDeviceLink/SDLStreamingVideoLifecycleManager.m
@@ -212,10 +212,16 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
}
-- (void)endVideoServiceWithCompletionHandler:(void (^)(void))completionHandler {
+- (void)secondaryTransportDidDisconnect {
+ SDLLogD(@"Stopping video manager");
+ [self.focusableItemManager stop];
+ [self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
+}
+
+- (void)endVideoServiceWithCompletionHandler:(void (^)(void))videoEndedCompletionHandler {
SDLLogD(@"Ending video service");
[self sdl_disposeDisplayLink];
- self.videoServiceEndedCompletionHandler = completionHandler;
+ self.videoServiceEndedCompletionHandler = videoEndedCompletionHandler;
[self.protocol endServiceWithType:SDLServiceTypeVideo];
}
@@ -503,17 +509,16 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self.protocol endServiceWithType:SDLServiceTypeVideo];
}
-#pragma mark - SDLProtocolListener
+#pragma mark - SDLProtocolDelegate
#pragma mark Start Service ACK/NAK
-- (void)handleProtocolStartServiceACKMessage:(SDLProtocolMessage *)startServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceACK:(SDLProtocolMessage *)startServiceACK {
if (startServiceACK.header.serviceType != SDLServiceTypeVideo) { return; }
self.videoEncrypted = startServiceACK.header.encrypted;
SDLControlFramePayloadVideoStartServiceAck *videoAckPayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithData:startServiceACK.payload];
- SDLLogD(@"Request to start video service ACKed with payload: %@", videoAckPayload);
-
+ SDLLogD(@"Request to start video service ACKed on transport %@, with payload: %@", protocol.transport, videoAckPayload);
if (videoAckPayload.mtu != SDLControlFrameInt64NotFound) {
[[SDLGlobals sharedGlobals] setDynamicMTUSize:(NSUInteger)videoAckPayload.mtu forServiceType:SDLServiceTypeVideo];
@@ -540,11 +545,11 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateReady];
}
-- (void)handleProtocolStartServiceNAKMessage:(SDLProtocolMessage *)startServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveStartServiceNAK:(SDLProtocolMessage *)startServiceNAK {
if (startServiceNAK.header.serviceType != SDLServiceTypeVideo) { return; }
SDLControlFramePayloadNak *nakPayload = [[SDLControlFramePayloadNak alloc] initWithData:startServiceNAK.payload];
- SDLLogE(@"Request to start video service NAKed with reason: %@", nakPayload.description);
+ SDLLogE(@"Request to start video service NAKed on transport %@, with payload: %@", protocol.transport, nakPayload);
// If we have no payload rejected params, we don't know what to do to retry, so we'll just stop and maybe cry
if (nakPayload.rejectedParams.count == 0) {
@@ -568,18 +573,18 @@ typedef void(^SDLVideoCapabilityResponseHandler)(SDLVideoStreamingCapability *_N
#pragma mark End Service ACK/NAK
-- (void)handleProtocolEndServiceACKMessage:(SDLProtocolMessage *)endServiceACK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceACK:(SDLProtocolMessage *)endServiceACK {
if (endServiceACK.header.serviceType != SDLServiceTypeVideo) { return; }
- SDLLogD(@"Request to end video service ACKed");
+ SDLLogD(@"Request to end video service ACKed on transport %@", protocol.transport);
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
}
-- (void)handleProtocolEndServiceNAKMessage:(SDLProtocolMessage *)endServiceNAK {
+- (void)protocol:(SDLProtocol *)protocol didReceiveEndServiceNAK:(SDLProtocolMessage *)endServiceNAK {
if (endServiceNAK.header.serviceType != SDLServiceTypeVideo) { return; }
SDLControlFramePayloadNak *nakPayload = [[SDLControlFramePayloadNak alloc] initWithData:endServiceNAK.payload];
- SDLLogE(@"Request to end video service NAKed with payload: %@", nakPayload);
+ SDLLogE(@"Request to end video service NAKed on transport %@, with payload: %@", protocol.transport, nakPayload);
/// Core will NAK the video end service control frame if video is not streaming or if video is streaming but the HMI does not recognize that video is streaming.
[self.videoStreamStateMachine transitionToState:SDLVideoStreamManagerStateStopped];
diff --git a/SmartDeviceLink/SDLSubscribeButtonManager.h b/SmartDeviceLink/SDLSubscribeButtonManager.h
new file mode 100644
index 000000000..c73d3d83b
--- /dev/null
+++ b/SmartDeviceLink/SDLSubscribeButtonManager.h
@@ -0,0 +1,75 @@
+//
+// SDLSubscribeButtonManager.h
+// SmartDeviceLink
+//
+// Created by Nicole on 5/21/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLButtonName.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLNotificationConstants.h"
+
+@class SDLSystemCapabilityManager;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// A handler run when the subscribe button has been selected.
+/// @param buttonPress Indicates whether this is a long or short button press event
+/// @param buttonEvent Indicates whether the button has been depressed or released
+/// @param error The error, if one occurred, during the subscription
+typedef void (^SDLSubscribeButtonUpdateHandler)(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error);
+
+/// The handler run when the update has completed.
+/// @param error An error if the update failed
+typedef void(^SDLSubscribeButtonUpdateCompletionHandler)(NSError *__nullable error);
+
+/// Manager for handling subscriptions to hard buttons.
+@interface SDLSubscribeButtonManager : NSObject
+
+/// Initialize the manager with required dependencies.
+/// @param connectionManager The connection manager object for sending RPCs
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager;
+
+/// Starts the manager. This method is used internally.
+- (void)start;
+
+/// Stops the manager. This method is used internally.
+- (void)stop;
+
+/// 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 `error` parameter of the updateHandler.
+/// @param buttonName The name of the hard button to subscribe to
+/// @param updateHandler The block run when the subscribe button is selected
+/// @return An object that can be used to unsubscribe the block using `unsubscribeButtonWithObserver:withCompletionHandler:`.
+- (id<NSObject>)subscribeButton:(SDLButtonName)buttonName withUpdateHandler:(nullable SDLSubscribeButtonUpdateHandler)updateHandler;
+
+/// 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 `error` parameter of the selector.
+///
+/// The selector supports the following parameters:
+///
+/// 1. A selector with no parameters. The observer will be notified when a button press occurs (it will not know if a short or long press has occurred).
+///
+/// 2. A selector with one parameter, (SDLButtonName). The observer will be notified when a button press occurs (it will not know if a short or long press has occurred).
+///
+/// 3. A selector with two parameters, (SDLButtonName, NSError). The observer will be notified when a button press occurs (it will not know if a short or long press has occurred).
+///
+/// 4. A selector with three parameters, (SDLButtonName, NSError, SDLOnButtonPress). The observer will be notified when a long or short button press occurs, but not a button event.
+///
+/// 5. A selector with four parameters, (SDLButtonName, NSError, SDLOnButtonPress, SDLOnButtonEvent). The observer will be notified when any button press or any button event occurs.
+///
+/// To unsubscribe to the hard button, please call `unsubscribeButton:withObserver:withCompletionHandler:`.
+///
+/// @param buttonName The name of the hard button to subscribe to
+/// @param observer The object that will have `selector` called whenever the button has been selected
+/// @param selector The selector on `observer` that will be called whenever the button has been selected
+- (void)subscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer selector:(SEL)selector;
+
+/// 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.
+/// @param buttonName The name of the hard button to subscribe to
+/// @param observer The object that will be unsubscribed. If a block was subscribed, the return value should be passed. If a selector was subscribed, the observer object should be passed
+/// @param completionHandler A handler called when the observer has been unsubscribed to the hard button
+- (void)unsubscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer withCompletionHandler:(nullable SDLSubscribeButtonUpdateCompletionHandler)completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeButtonManager.m b/SmartDeviceLink/SDLSubscribeButtonManager.m
new file mode 100644
index 000000000..f311291c5
--- /dev/null
+++ b/SmartDeviceLink/SDLSubscribeButtonManager.m
@@ -0,0 +1,298 @@
+//
+// SDLSDLSubscribeButtonManager.m
+// SmartDeviceLink
+//
+// Created by Nicole on 5/21/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLSubscribeButtonManager.h"
+
+#import "SDLError.h"
+#import "SDLGlobals.h"
+#import "SDLHMIPermissions.h"
+#import "SDLLogMacros.h"
+#import "SDLOnButtonPress.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLOnPermissionsChange.h"
+#import "SDLPermissionItem.h"
+#import "SDLPredefinedWindows.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLSubscribeButton.h"
+#import "SDLSubscribeButtonObserver.h"
+#import "SDLUnsubscribeButton.h"
+#import "SDLUnsubscribeButtonResponse.h"
+#import "SDLOnButtonEvent.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLSubscribeButtonManager()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (strong, nonatomic) NSMutableDictionary<SDLButtonName, NSMutableArray<SDLSubscribeButtonObserver *> *> *subscribeButtonObservers;
+@property (copy, nonatomic) dispatch_queue_t readWriteQueue;
+
+@end
+
+@implementation SDLSubscribeButtonManager
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager {
+ self = [super init];
+ if (!self) { return nil; }
+
+ if (@available(iOS 10.0, *)) {
+ _readWriteQueue = dispatch_queue_create_with_target("com.sdl.subscribeButtonManager.readWriteQueue", DISPATCH_QUEUE_SERIAL, [SDLGlobals sharedGlobals].sdlProcessingQueue);
+ } else {
+ _readWriteQueue = [SDLGlobals sharedGlobals].sdlProcessingQueue;
+ }
+
+ _connectionManager = connectionManager;
+ _subscribeButtonObservers = [NSMutableDictionary dictionary];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_handleButtonEvent:) name:SDLDidReceiveButtonEventNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_handleButtonPress:) name:SDLDidReceiveButtonPressNotification object:nil];
+
+ return self;
+}
+
+- (void)start { }
+
+- (void)stop {
+ __weak typeof(self) weakSelf = self;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ __strong typeof(weakSelf) strongself = weakSelf;
+ [strongself->_subscribeButtonObservers removeAllObjects];
+ }];
+}
+
+#pragma mark - Subscribe
+
+- (id<NSObject>)subscribeButton:(SDLButtonName)buttonName withUpdateHandler:(nullable SDLSubscribeButtonUpdateHandler)updateHandler {
+ SDLLogD(@"Subscribing to subscribe button with name: %@, with block", buttonName);
+
+ NSObject *observer = [[NSObject alloc] init];
+ SDLSubscribeButtonObserver *observerObject = [[SDLSubscribeButtonObserver alloc] initWithObserver:observer updateHandler:updateHandler];
+
+ if (self.subscribeButtonObservers[buttonName].count > 0) {
+ // The app has already subscribed to the button, simply add the observer to the list of observers for the button name.
+ [self sdl_addSubscribedObserver:observerObject forButtonName:buttonName];
+ } else {
+ // The app has not yet subscribed to the button, send the `SubscribeButton` request for the button name.
+ [self sdl_subscribeToButtonNamed:buttonName withObserverObject:observerObject];
+ }
+
+ return observer;
+}
+
+- (void)subscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer selector:(SEL)selector; {
+ SDLLogD(@"Subscribing to subscribe button with name: %@, observer object: %@, selector: %@", buttonName, observer, NSStringFromSelector(selector));
+
+ NSUInteger numberOfParametersInSelector = [NSStringFromSelector(selector) componentsSeparatedByString:@":"].count - 1;
+ if (numberOfParametersInSelector > 4) {
+ SDLLogE(@"Attempted to subscribe to a subscribe button using a selector that contains more than 4 parameters");
+ return;
+ }
+
+ if (observer == nil) {
+ SDLLogE(@"Attempted to subscribe to subscribe button with name %@ with a selector on a *nil* observer, which will always fail", buttonName);
+ return;
+ }
+
+ SDLSubscribeButtonObserver *observerObject = [[SDLSubscribeButtonObserver alloc] initWithObserver:observer selector:selector];
+ if (self.subscribeButtonObservers[buttonName].count > 0) {
+ [self sdl_addSubscribedObserver:observerObject forButtonName:buttonName];
+ return;
+ }
+
+ [self sdl_subscribeToButtonNamed:buttonName withObserverObject:observerObject];
+}
+
+/// Helper method for checking if the observer is currently subscribed to the button
+/// @param observer The observer
+/// @param buttonName The name of the button
+/// @return True if the observer is currently subscribed to the button; false if not
+- (BOOL)sdl_isSubscribedObserver:(id<NSObject>)observer forButtonName:(SDLButtonName)buttonName {
+ BOOL isSubscribedObserver = NO;
+ for (SDLSubscribeButtonObserver *subscribedObserver in self.subscribeButtonObservers[buttonName]) {
+ if (subscribedObserver.observer != observer ) { continue; }
+ isSubscribedObserver = YES;
+ break;
+ }
+
+ return isSubscribedObserver;
+}
+
+/// Helper method for adding an observer for the button
+/// @param subscribedObserver The observer
+/// @param buttonName The name of the button
+- (void)sdl_addSubscribedObserver:(SDLSubscribeButtonObserver *)subscribedObserver forButtonName:(SDLButtonName)buttonName {
+ __weak typeof(self) weakSelf = self;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (strongSelf.subscribeButtonObservers[buttonName] == nil) {
+ SDLLogV(@"Adding first subscriber for button: %@", buttonName);
+ strongSelf.subscribeButtonObservers[buttonName] = [NSMutableArray arrayWithObject:subscribedObserver];
+ } else {
+ SDLLogV(@"Adding another subscriber for button: %@", buttonName);
+ [strongSelf.subscribeButtonObservers[buttonName] addObject:subscribedObserver];
+ }
+ }];
+}
+
+#pragma mark Send Subscribe Request
+
+/// Helper method for sending a `SubscribeButton` request and notifying subscribers of button events.
+/// @param buttonName The name of the subscribe button
+/// @param observerObject The observer object
+- (void)sdl_subscribeToButtonNamed:(SDLButtonName)buttonName withObserverObject:(SDLSubscribeButtonObserver *)observerObject {
+ SDLSubscribeButton *subscribeButton = [[SDLSubscribeButton alloc] initWithButtonName:buttonName handler:nil];
+ __weak typeof(self) weakSelf = self;
+
+ [self.connectionManager sendConnectionRequest:subscribeButton withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ // Check if the request was successful. If a subscription request got sent for a button that is already subscribed then the module will respond with `IGNORED` so just act as if subscription succeeded.
+ if (!response.success.boolValue && ![response.resultCode isEqualToEnum:SDLResultIgnored]) {
+ [strongSelf sdl_invokeObserver:observerObject withButtonName:buttonName buttonPress:nil buttonEvent:nil error:error];
+ return;
+ }
+
+ [strongSelf sdl_addSubscribedObserver:observerObject forButtonName:buttonName];
+ }];
+}
+
+#pragma mark - Unsubscribe
+#pragma mark Send Unsubscribe Request
+
+- (void)unsubscribeButton:(SDLButtonName)buttonName withObserver:(id<NSObject>)observer withCompletionHandler:(nullable SDLSubscribeButtonUpdateCompletionHandler)completionHandler {
+ if (self.subscribeButtonObservers[buttonName] == nil || ![self sdl_isSubscribedObserver:observer forButtonName:buttonName]) {
+ SDLLogE(@"Attempting to unsubscribe to the %@ subscribe button which is not currently subscribed", buttonName);
+ return completionHandler([NSError sdl_subscribeButtonManager_notSubscribed]);
+ }
+
+ // If we have more than one observer, just remove this observer
+ if (self.subscribeButtonObservers[buttonName].count > 1) {
+ [self sdl_removeSubscribedObserver:observer forButtonName:buttonName];
+ return completionHandler(nil);
+ }
+
+ // If there's only one observer, unsubscribe from the button
+ SDLUnsubscribeButton *unsubscribeButton = [[SDLUnsubscribeButton alloc] initWithButtonName:buttonName];
+ __weak typeof(self) weakSelf = self;
+ [self.connectionManager sendConnectionRequest:unsubscribeButton withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (!response.success.boolValue) {
+ SDLLogE(@"Attempt to unsubscribe from subscribe button %@ failed", buttonName);
+ return completionHandler(error);
+ }
+
+ SDLLogD(@"Successfully unsubscribed from subscribe button named %@", buttonName);
+ [strongSelf sdl_removeSubscribedObserver:observer forButtonName:buttonName];
+ return completionHandler(error);
+ }];
+}
+
+/// Helper method for removing an observer for the button
+/// @param observer The observer
+/// @param buttonName The name of the button
+- (void)sdl_removeSubscribedObserver:(id<NSObject>)observer forButtonName:(SDLButtonName)buttonName {
+ __weak typeof(self) weakSelf = self;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ for (NSUInteger i = 0; i < strongSelf.subscribeButtonObservers[buttonName].count; i++) {
+ SDLSubscribeButtonObserver *subscribedObserver = (SDLSubscribeButtonObserver *)strongSelf.subscribeButtonObservers[buttonName][i];
+ if (subscribedObserver.observer != observer) { continue; }
+ // Okay to mutate because we will break immediately afterward
+ [strongSelf.subscribeButtonObservers[buttonName] removeObjectAtIndex:i];
+ break;
+ }
+ }];
+}
+
+#pragma mark - Notifications
+
+/// Button event notification from the module
+/// @param notification Information about the button event
+- (void)sdl_handleButtonEvent:(SDLRPCNotificationNotification *)notification {
+ SDLOnButtonEvent *buttonEvent = (SDLOnButtonEvent *)notification.notification;
+ if (buttonEvent == nil) { return; }
+
+ SDLButtonName buttonName = buttonEvent.buttonName;
+ for (SDLSubscribeButtonObserver *subscribeButtonObserver in self.subscribeButtonObservers[buttonName]) {
+ [self sdl_invokeObserver:subscribeButtonObserver withButtonName:buttonName buttonPress:nil buttonEvent:buttonEvent error:nil];
+ }
+}
+
+/// Button press notification from the module
+/// @param notification Information about the button press
+- (void)sdl_handleButtonPress:(SDLRPCNotificationNotification *)notification {
+ SDLOnButtonPress *buttonPress = (SDLOnButtonPress *)notification.notification;
+ if (buttonPress == nil) { return; }
+
+ SDLButtonName buttonName = buttonPress.buttonName;
+ for (SDLSubscribeButtonObserver *subscribeButtonObserver in self.subscribeButtonObservers[buttonName]) {
+ [self sdl_invokeObserver:subscribeButtonObserver withButtonName:buttonName buttonPress:buttonPress buttonEvent:nil error:nil];
+ }
+}
+
+/// Helper method for notifying subscribers of button events.
+/// @param observer The object that will have `selector` called
+/// @param buttonName The name of the subscribe button
+/// @param buttonPress Indicates whether this is a long or short button press event
+/// @param buttonEvent Indicates that the button has been depressed or released
+/// @param error The error, if one occurred; nil if not
+- (void)sdl_invokeObserver:(SDLSubscribeButtonObserver *)observer withButtonName:(SDLButtonName)buttonName buttonPress:(nullable SDLOnButtonPress *)buttonPress buttonEvent:(nullable SDLOnButtonEvent *)buttonEvent error:(nullable NSError *)error {
+ if (observer.updateBlock != nil) {
+ observer.updateBlock(buttonPress, buttonEvent, error);
+ } else {
+ if (![observer.observer respondsToSelector:observer.selector]) {
+ @throw [NSException sdl_invalidSubscribeButtonSelectorExceptionWithSelector:observer.selector];
+ }
+
+ NSUInteger numberOfParametersInSelector = [NSStringFromSelector(observer.selector) componentsSeparatedByString:@":"].count - 1;
+
+ // If a selector has 0, 1, 2, or 3 parameters and only a button event has occured, do not notify the observer of the button event.
+ if (buttonEvent != nil && numberOfParametersInSelector <= 3) {
+ return;
+ }
+
+ NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[(NSObject *)observer.observer methodSignatureForSelector:observer.selector]];
+ [invocation setSelector:observer.selector];
+ [invocation setTarget:observer.observer];
+
+ if (numberOfParametersInSelector >= 1) {
+ [invocation setArgument:&buttonName atIndex:2];
+ }
+ if (numberOfParametersInSelector >= 2) {
+ [invocation setArgument:&error atIndex:3];
+ }
+ if (numberOfParametersInSelector >= 3) {
+ [invocation setArgument:&buttonPress atIndex:4];
+ }
+ if (numberOfParametersInSelector >= 4) {
+ [invocation setArgument:&buttonEvent atIndex:5];
+ }
+ if (numberOfParametersInSelector >= 5) {
+ @throw [NSException sdl_invalidSubscribeButtonSelectorExceptionWithSelector:observer.selector];
+ }
+
+ [invocation invoke];
+ }
+}
+
+#pragma mark - Getters
+
+- (NSMutableDictionary<SDLButtonName, NSMutableArray<SDLSubscribeButtonObserver *> *> *)subscribeButtonObservers {
+ __block NSMutableDictionary<SDLButtonName, NSMutableArray<SDLSubscribeButtonObserver *> *> *dict = nil;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ dict = self->_subscribeButtonObservers;
+ }];
+
+ return dict;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeButtonObserver.h b/SmartDeviceLink/SDLSubscribeButtonObserver.h
new file mode 100644
index 000000000..49e783f97
--- /dev/null
+++ b/SmartDeviceLink/SDLSubscribeButtonObserver.h
@@ -0,0 +1,42 @@
+//
+// SDLSubscribeButtonObserver.h
+// SmartDeviceLink
+//
+// Created by Nicole on 5/21/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLNotificationConstants.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// A handler mirroring the one in SDLSubscribeButtonManager.h for `subscribeButton:withBlock:`
+typedef void (^SDLSubscribeButtonUpdateHandler)(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error);
+
+/// An observer object for SDLSubscribeButtonManager
+@interface SDLSubscribeButtonObserver : NSObject
+
+/// The object that will be used to call the selector if available, and to unsubscribe this observer
+@property (weak, nonatomic) id<NSObject> observer;
+
+/// A selector called when the observer is triggered
+@property (assign, nonatomic) SEL selector;
+
+/// A block called when the observer is triggered
+@property (copy, nonatomic) SDLSubscribeButtonUpdateHandler updateBlock;
+
+/// Create an observer using an object and a selector on that object
+/// @param observer The object to be called when the subscription triggers
+/// @param selector The selector to be called when the subscription triggers
+/// @return The observer
+- (instancetype)initWithObserver:(id<NSObject>)observer selector:(SEL)selector;
+
+/// Create an observer using an object and a callback block
+/// @param observer The object that can be used to unsubscribe the block
+/// @param block The block that will be called when the subscription triggers
+/// @return The observer
+- (instancetype)initWithObserver:(id<NSObject>)observer updateHandler:(SDLSubscribeButtonUpdateHandler)block;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeButtonObserver.m b/SmartDeviceLink/SDLSubscribeButtonObserver.m
new file mode 100644
index 000000000..9c9b72f68
--- /dev/null
+++ b/SmartDeviceLink/SDLSubscribeButtonObserver.m
@@ -0,0 +1,45 @@
+//
+// SDLSubscribeButtonObserver.m
+// SmartDeviceLink
+//
+// Created by Nicole on 5/21/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SDLSubscribeButtonObserver.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSubscribeButtonObserver
+
+- (instancetype)initWithObserver:(id<NSObject>)observer selector:(SEL)selector {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _observer = observer;
+ _selector = selector;
+
+ return self;
+}
+
+- (instancetype)initWithObserver:(id<NSObject>)observer updateHandler:(SDLSubscribeButtonUpdateHandler)block {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _observer = observer;
+ _updateBlock = block;
+
+ return self;
+}
+
+- (NSString *)description {
+ if (self.selector) {
+ return [NSString stringWithFormat:@"Observer: %@[%@] - %@", [_observer class], _observer, NSStringFromSelector(_selector)];
+ } else {
+ return [NSString stringWithFormat:@"Block Observer: %@", _observer];
+ }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.h b/SmartDeviceLink/SDLSubscribeVehicleData.h
index e835b07e3..9658a375c 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleData.h
+++ b/SmartDeviceLink/SDLSubscribeVehicleData.h
@@ -48,7 +48,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 clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 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:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for subscribing to all possible vehicle data items.
@@ -83,7 +83,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 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:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation 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:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for subscribing to all possible vehicle data items.
@@ -119,7 +119,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:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: 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:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for subscribing to all possible vehicle data items.
@@ -127,8 +127,6 @@ NS_ASSUME_NONNULL_BEGIN
* @param gps - gps
* @param speed - speed
* @param rpm - rpm
- * @param fuelLevel - fuelLevel
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - instantFuelConsumption
* @param fuelRange - fuelRange
* @param externalTemperature - externalTemperature
@@ -153,9 +151,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModeStatus - clusterModeStatus
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLSubscribeVehicleData object
*/
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm fuelLevel:(nullable NSNumber<SDLBool> *)fuelLevel fuelLevel_State:(nullable NSNumber<SDLBool> *)fuelLevel_State 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 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;
+- (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 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;
/**
* A boolean value. If true, subscribes for GearStatus data.
@@ -180,12 +179,12 @@ NS_ASSUME_NONNULL_BEGIN
/**
* A boolean value. If true, subscribes Fuel Level data.
*/
-@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel;
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
* A boolean value. If true, subscribes Fuel Level State data.
*/
-@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel_State;
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel_State __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
* A boolean value. If true, subscribes Fuel Range data.
@@ -243,6 +242,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *wiperStatus;
/**
+ * To indicate whether driver hands are off the steering wheel
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *handsOffSteering;
+
+/**
* A boolean value. If true, subscribes Head Lamp Status data.
*/
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *headLampStatus;
@@ -309,7 +313,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.
-
+
@param vehicleDataName The name of the OEM custom vehicle data item.
@param vehicleDataState A boolean value. If true, requests the OEM custom vehicle data item.
@@ -319,7 +323,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.
-
+
@param vehicleDataName The name of the OEM custom vehicle data item.
@return The state of an OEM custom vehicle data item for the given vehicle data name.
diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.m b/SmartDeviceLink/SDLSubscribeVehicleData.m
index 9e4cc4000..98eaf936a 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleData.m
+++ b/SmartDeviceLink/SDLSubscribeVehicleData.m
@@ -15,46 +15,55 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (instancetype)init {
- if (self = [super initWithName:SDLRPCFunctionNameSubscribeVehicleData]) {
+ self = [super initWithName:SDLRPCFunctionNameSubscribeVehicleData];
+ if (!self) {
+ return nil;
}
return self;
}
#pragma clang diagnostic pop
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 wiperStatus:(BOOL)wiperStatus {
- self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) instantFuelConsumption:@(instantFuelConsumption) fuelRange:nil externalTemperature:@(externalTemperature) turnSignal:nil 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:nil electronicParkBrakeStatus:nil cloudAppVehicleID:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
+ self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:nil externalTemperature:@(externalTemperature) turnSignal:nil 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:nil electronicParkBrakeStatus:nil cloudAppVehicleID:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
self.prndl = @(prndl);
-#pragma clang diagnostic push
+#pragma clang diagnostic pop
}
return self;
}
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation 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) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) 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:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
+ 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:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
self.prndl = @(prndl);
-#pragma clang diagnostic push
+#pragma clang diagnostic pop
}
return self;
}
- (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) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) 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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
+ 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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
self.prndl = @(prndl);
-#pragma clang diagnostic push
+#pragma clang diagnostic pop
}
+
return self;
}
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm fuelLevel:(nullable NSNumber<SDLBool> *)fuelLevel fuelLevel_State:(nullable NSNumber<SDLBool> *)fuelLevel_State 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 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 {
+- (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 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 {
self = [self init];
if (!self) {
return nil;
@@ -62,8 +71,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = speed;
self.rpm = rpm;
- self.fuelLevel = fuelLevel;
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
self.externalTemperature = externalTemperature;
@@ -88,6 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -339,6 +347,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSNumber.class error:nil];
}
+- (void)setHandsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable NSNumber<SDLBool> *)handsOffSteering {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:NSNumber.class error:&error];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h
index cb969d589..9cac0fa26 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h
+++ b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h
@@ -17,13 +17,11 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLSubscribeVehicleDataResponse : SDLRPCResponse
/**
- * Convenience init for setting all possible values on vehicle data items.
+ * Convenience init for setting all data on vehicle data items.
*
* @param gps - gps
* @param speed - speed
* @param rpm - rpm
- * @param fuelLevel - fuelLevel
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - instantFuelConsumption
* @param fuelRange - fuelRange
* @param externalTemperature - externalTemperature
@@ -48,9 +46,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModes - clusterModes
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLSubscribeVehicleDataResponse object
*/
-- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm fuelLevel:(nullable SDLVehicleDataResult *)fuelLevel fuelLevel_State:(nullable SDLVehicleDataResult *)fuelLevel_State 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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey;
+- (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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering;
/**
The result of requesting to subscribe to the GearStatus.
@@ -83,14 +82,14 @@ NS_ASSUME_NONNULL_BEGIN
Optional
*/
-@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel;
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
The result of requesting to subscribe to the fuel level state.
Optional
*/
-@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel_State;
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel_State __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
The result of requesting to subscribe to the fuel range.
@@ -170,6 +169,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLVehicleDataResult *wiperStatus;
/**
+ To indicate whether driver hands are off the steering wheel
+ */
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *handsOffSteering;
+
+/**
The result of requesting to subscribe to the status of the head lamps.
Optional
diff --git a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m
index 15b890db3..0f9982431 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m
+++ b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m
@@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma clang diagnostic pop
-- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm fuelLevel:(nullable SDLVehicleDataResult *)fuelLevel fuelLevel_State:(nullable SDLVehicleDataResult *)fuelLevel_State 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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey {
+- (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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering; {
self = [self init];
if (!self) {
return nil;
@@ -32,8 +32,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = speed;
self.rpm = rpm;
- self.fuelLevel = fuelLevel;
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
self.externalTemperature = externalTemperature;
@@ -58,6 +56,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModes = clusterModes;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -309,6 +308,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:SDLVehicleDataResult.class error:nil];
}
+- (void)setHandsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable SDLVehicleDataResult *)handsOffSteering {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:SDLVehicleDataResult.class error:&error];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSystemCapability.h b/SmartDeviceLink/SDLSystemCapability.h
index f0ac7b2d8..d41136c2f 100755
--- a/SmartDeviceLink/SDLSystemCapability.h
+++ b/SmartDeviceLink/SDLSystemCapability.h
@@ -1,21 +1,46 @@
-//
-// SDLSystemCapability.h
-// SmartDeviceLink-iOS
-//
-// Created by Joel Fischer on 7/10/17.
-// Copyright © 2017 smartdevicelink. All rights reserved.
-//
+/*
+* 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 "SDLSystemCapabilityType.h"
@class SDLAppServicesCapabilities;
-@class SDLPhoneCapability;
+@class SDLDisplayCapability;
+@class SDLDriverDistractionCapability;
@class SDLNavigationCapability;
-@class SDLVideoStreamingCapability;
+@class SDLPhoneCapability;
@class SDLRemoteControlCapabilities;
@class SDLSeatLocationCapability;
-@class SDLDisplayCapability;
+@class SDLVideoStreamingCapability;
NS_ASSUME_NONNULL_BEGIN
@@ -82,6 +107,11 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithSeatLocationCapability:(SDLSeatLocationCapability *)capability;
+/// Convenience init for a Driver Distraction capability
+/// @param capability Describes capabilities when the driver is distracted
+/// @return A SDLSystemCapability object
+- (instancetype)initWithDriverDistractionCapability:(SDLDriverDistractionCapability *)capability;
+
/**
* 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.
*/
@@ -138,6 +168,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSArray<SDLDisplayCapability *> *displayCapabilities;
+/**
+ * Describes capabilities when the driver is distracted
+ *
+ * @since SDL 7.0.0
+ */
+@property (nullable, strong, nonatomic) SDLDriverDistractionCapability *driverDistractionCapability;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSystemCapability.m b/SmartDeviceLink/SDLSystemCapability.m
index 3936e463b..8cfe47dbe 100755
--- a/SmartDeviceLink/SDLSystemCapability.m
+++ b/SmartDeviceLink/SDLSystemCapability.m
@@ -1,23 +1,48 @@
-//
-// SDLSystemCapability.m
-// SmartDeviceLink-iOS
-//
-// Created by Joel Fischer on 7/10/17.
-// Copyright © 2017 smartdevicelink. All rights reserved.
-//
+/*
+* 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 "SDLSystemCapability.h"
#import "NSMutableDictionary+Store.h"
#import "SDLAppServicesCapabilities.h"
-#import "SDLRPCParameterNames.h"
+#import "SDLDisplayCapability.h"
+#import "SDLDriverDistractionCapability.h"
#import "SDLNavigationCapability.h"
#import "SDLPhoneCapability.h"
-#import "SDLSystemCapabilityType.h"
-#import "SDLVideoStreamingCapability.h"
#import "SDLRemoteControlCapabilities.h"
+#import "SDLRPCParameterNames.h"
#import "SDLSeatLocationCapability.h"
-#import "SDLDisplayCapability.h"
+#import "SDLSystemCapabilityType.h"
+#import "SDLVideoStreamingCapability.h"
NS_ASSUME_NONNULL_BEGIN
@@ -107,6 +132,18 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)initWithDriverDistractionCapability:(SDLDriverDistractionCapability *)capability {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.systemCapabilityType = SDLSystemCapabilityTypeDriverDistraction;
+ self.driverDistractionCapability = capability;
+
+ return self;
+}
+
- (void)setSystemCapabilityType:(SDLSystemCapabilityType)type {
[self.store sdl_setObject:type forName:SDLRPCParameterNameSystemCapabilityType];
}
@@ -172,6 +209,14 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectsForName:SDLRPCParameterNameDisplayCapabilities ofClass:SDLDisplayCapability.class error:nil];
}
+- (void)setDriverDistractionCapability:(nullable SDLDriverDistractionCapability *)driverDistractionCapability {
+ [self.store sdl_setObject:driverDistractionCapability forName:SDLRPCParameterNameDriverDistractionCapability];
+}
+
+- (nullable SDLDriverDistractionCapability *)driverDistractionCapability {
+ return [self.store sdl_objectForName:SDLRPCParameterNameDriverDistractionCapability ofClass:SDLDriverDistractionCapability.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h
index ca1c35792..bbedc4c66 100644
--- a/SmartDeviceLink/SDLSystemCapabilityManager.h
+++ b/SmartDeviceLink/SDLSystemCapabilityManager.h
@@ -19,6 +19,7 @@
@class SDLButtonCapabilities;
@class SDLDisplayCapability;
@class SDLDisplayCapabilities;
+@class SDLDriverDistractionCapability;
@class SDLHMICapabilities;
@class SDLNavigationCapability;
@class SDLPhoneCapability;
@@ -156,58 +157,36 @@ typedef void (^SDLCapabilityUpdateWithErrorHandler)(SDLSystemCapability * _Nulla
/**
* If returned, the platform supports app services
- *
- * @see SDLAppServicesCapabilities
- *
- * Optional
*/
@property (nullable, strong, nonatomic, readonly) SDLAppServicesCapabilities *appServicesCapabilities;
/**
If returned, the platform supports navigation
-
- @see SDLNavigationCapability
-
- Optional
*/
@property (nullable, strong, nonatomic, readonly) SDLNavigationCapability *navigationCapability;
/**
If returned, the platform supports making phone calls
-
- @see SDLPhoneCapability
-
- Optional
*/
@property (nullable, strong, nonatomic, readonly) SDLPhoneCapability *phoneCapability;
/**
If returned, the platform supports video streaming
-
- @see SDLVideoStreamingCapability
-
- Optional
*/
@property (nullable, strong, nonatomic, readonly) SDLVideoStreamingCapability *videoStreamingCapability;
/**
If returned, the platform supports remote control capabilities
-
- @see SDLRemoteControlCapabilities
-
- Optional
*/
@property (nullable, strong, nonatomic, readonly) SDLRemoteControlCapabilities *remoteControlCapability;
/**
If returned, the platform supports remote control capabilities for seats
-
- @see SDLSeatLocationCapability
-
- Optional
*/
@property (nullable, strong, nonatomic, readonly) SDLSeatLocationCapability *seatLocationCapability;
+/// If returned, the platform supports driver distraction capabilities
+@property (nullable, strong, nonatomic, readonly) SDLDriverDistractionCapability *driverDistractionCapability;
/**
* 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.
diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m
index 9d085e100..8c979a18e 100644
--- a/SmartDeviceLink/SDLSystemCapabilityManager.m
+++ b/SmartDeviceLink/SDLSystemCapabilityManager.m
@@ -14,6 +14,7 @@
#import "SDLConnectionManagerType.h"
#import "SDLDisplayCapabilities.h"
#import "SDLDisplayCapability.h"
+#import "SDLDriverDistractionCapability.h"
#import "SDLError.h"
#import "SDLGenericResponse.h"
#import "SDLGetSystemCapability.h"
@@ -68,6 +69,7 @@ typedef NSString * SDLServiceID;
@property (nullable, strong, nonatomic, readwrite) SDLVideoStreamingCapability *videoStreamingCapability;
@property (nullable, strong, nonatomic, readwrite) SDLRemoteControlCapabilities *remoteControlCapability;
@property (nullable, strong, nonatomic, readwrite) SDLSeatLocationCapability *seatLocationCapability;
+@property (nullable, strong, nonatomic, readwrite) SDLDriverDistractionCapability *driverDistractionCapability;
@property (nullable, strong, nonatomic) NSMutableDictionary<SDLServiceID, SDLAppServiceCapability *> *appServicesCapabilitiesDictionary;
@@ -78,6 +80,8 @@ typedef NSString * SDLServiceID;
@property (assign, nonatomic) BOOL shouldConvertDeprecatedDisplayCapabilities;
@property (strong, nonatomic) SDLHMILevel currentHMILevel;
+@property (copy, nonatomic) dispatch_queue_t readWriteQueue;
+
@end
@implementation SDLSystemCapabilityManager
@@ -90,6 +94,12 @@ typedef NSString * SDLServiceID;
return nil;
}
+ if (@available(iOS 10.0, *)) {
+ _readWriteQueue = dispatch_queue_create_with_target("com.sdl.systemCapabilityManager.readWriteQueue", DISPATCH_QUEUE_SERIAL, [SDLGlobals sharedGlobals].sdlProcessingQueue);
+ } else {
+ _readWriteQueue = [SDLGlobals sharedGlobals].sdlProcessingQueue;
+ }
+
_connectionManager = manager;
_shouldConvertDeprecatedDisplayCapabilities = YES;
_appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary];
@@ -99,7 +109,7 @@ typedef NSString * SDLServiceID;
_currentHMILevel = SDLHMILevelNone;
- [self sdl_registerForNotifications];
+ [self sdl_registerForNotifications];
return self;
}
@@ -111,32 +121,35 @@ typedef NSString * SDLServiceID;
*/
- (void)stop {
SDLLogD(@"System Capability manager stopped");
- _displayCapabilities = nil;
- _displays = nil;
- _hmiCapabilities = nil;
- _softButtonCapabilities = nil;
- _buttonCapabilities = nil;
- _presetBankCapabilities = nil;
- _hmiZoneCapabilities = nil;
- _speechCapabilities = nil;
- _prerecordedSpeechCapabilities = nil;
- _vrCapability = NO;
- _audioPassThruCapabilities = nil;
- _pcmStreamCapability = nil;
- _navigationCapability = nil;
- _phoneCapability = nil;
- _videoStreamingCapability = nil;
- _remoteControlCapability = nil;
- _seatLocationCapability = nil;
- _appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary];
-
- _supportsSubscriptions = NO;
- [_capabilityObservers removeAllObjects];
- [_subscriptionStatus removeAllObjects];
-
- _currentHMILevel = SDLHMILevelNone;
-
- _shouldConvertDeprecatedDisplayCapabilities = YES;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ self.displayCapabilities = nil;
+ self.displays = nil;
+ self.hmiCapabilities = nil;
+ self.softButtonCapabilities = nil;
+ self.buttonCapabilities = nil;
+ self.presetBankCapabilities = nil;
+ self.hmiZoneCapabilities = nil;
+ self.speechCapabilities = nil;
+ self.prerecordedSpeechCapabilities = nil;
+ self.vrCapability = NO;
+ self.audioPassThruCapabilities = nil;
+ self.pcmStreamCapability = nil;
+ self.navigationCapability = nil;
+ self.phoneCapability = nil;
+ self.videoStreamingCapability = nil;
+ self.remoteControlCapability = nil;
+ self.seatLocationCapability = nil;
+ self.driverDistractionCapability = nil;
+
+ self.supportsSubscriptions = NO;
+
+ self.appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary];
+ [self.capabilityObservers removeAllObjects];
+ [self.subscriptionStatus removeAllObjects];
+
+ self.currentHMILevel = SDLHMILevelNone;
+ self.shouldConvertDeprecatedDisplayCapabilities = YES;
+ }];
}
#pragma mark - Getters
@@ -250,17 +263,17 @@ typedef NSString * SDLServiceID;
// Create the deprecated capabilities for backward compatibility if developers try to access them
SDLDisplayCapabilities *convertedCapabilities = [[SDLDisplayCapabilities alloc] init];
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated"
- convertedCapabilities.displayType = SDLDisplayTypeGeneric; // deprecated but it is mandatory
- #pragma clang diagnostic pop
- convertedCapabilities.displayName = self.displays.firstObject.displayName;
- convertedCapabilities.textFields = [defaultMainWindowCapabilities.textFields copy];
- convertedCapabilities.imageFields = [defaultMainWindowCapabilities.imageFields copy];
- convertedCapabilities.templatesAvailable = [defaultMainWindowCapabilities.templatesAvailable copy];
- convertedCapabilities.numCustomPresetsAvailable = [defaultMainWindowCapabilities.numCustomPresetsAvailable copy];
- convertedCapabilities.mediaClockFormats = @[]; // mandatory field but allows empty array
- convertedCapabilities.graphicSupported = @([defaultMainWindowCapabilities.imageTypeSupported containsObject:SDLImageTypeDynamic]);
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ convertedCapabilities.displayType = SDLDisplayTypeGeneric; // deprecated but it is mandatory
+#pragma clang diagnostic pop
+ convertedCapabilities.displayName = self.displays.firstObject.displayName;
+ convertedCapabilities.textFields = [defaultMainWindowCapabilities.textFields copy];
+ convertedCapabilities.imageFields = [defaultMainWindowCapabilities.imageFields copy];
+ convertedCapabilities.templatesAvailable = [defaultMainWindowCapabilities.templatesAvailable copy];
+ convertedCapabilities.numCustomPresetsAvailable = [defaultMainWindowCapabilities.numCustomPresetsAvailable copy];
+ convertedCapabilities.mediaClockFormats = @[]; // mandatory field but allows empty array
+ convertedCapabilities.graphicSupported = @([defaultMainWindowCapabilities.imageTypeSupported containsObject:SDLImageTypeDynamic]);
self.displayCapabilities = convertedCapabilities;
self.buttonCapabilities = defaultMainWindowCapabilities.buttonCapabilities;
@@ -282,6 +295,8 @@ typedef NSString * SDLServiceID;
return self.hmiCapabilities.remoteControl.boolValue;
} else if ([type isEqualToEnum:SDLSystemCapabilityTypeSeatLocation]) {
return self.hmiCapabilities.seatLocation.boolValue;
+ } else if ([type isEqualToEnum:SDLSystemCapabilityTypeDriverDistraction]) {
+ return self.hmiCapabilities.driverDistraction.boolValue;
} else if ([type isEqualToEnum:SDLSystemCapabilityTypeAppServices]) {
//This is a corner case that the param was not available in 5.1.0, but the app services feature was available. We have to say it's available because we don't know.
if ([[SDLGlobals sharedGlobals].rpcVersion isEqualToVersion:[SDLVersion versionWithString:@"5.1.0"]]) {
@@ -315,6 +330,8 @@ typedef NSString * SDLServiceID;
return [[SDLSystemCapability alloc] initWithDisplayCapabilities:self.displays];
} else if ([type isEqualToEnum:SDLSystemCapabilityTypeSeatLocation] && self.seatLocationCapability != nil) {
return [[SDLSystemCapability alloc] initWithSeatLocationCapability:self.seatLocationCapability];
+ } else if ([type isEqualToEnum:SDLSystemCapabilityTypeDriverDistraction] && self.driverDistractionCapability != nil) {
+ return [[SDLSystemCapability alloc] initWithDriverDistractionCapability:self.driverDistractionCapability];
} else if ([type isEqualToEnum:SDLSystemCapabilityTypeRemoteControl] && self.remoteControlCapability != nil) {
return [[SDLSystemCapability alloc] initWithRemoteControlCapability:self.remoteControlCapability];
} else if ([type isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming] && self.videoStreamingCapability != nil) {
@@ -378,7 +395,9 @@ typedef NSString * SDLServiceID;
SDLLogD(@"GetSystemCapability response succeeded, type: %@, response: %@", type, getSystemCapabilityResponse);
if (![weakself.subscriptionStatus[type] isEqualToNumber:subscribe] && weakself.supportsSubscriptions) {
- weakself.subscriptionStatus[type] = subscribe;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ weakself.subscriptionStatus[type] = subscribe;
+ }];
}
[weakself sdl_saveSystemCapability:getSystemCapabilityResponse.systemCapability error:error completionHandler:handler];
@@ -423,6 +442,12 @@ typedef NSString * SDLServiceID;
return NO;
}
self.seatLocationCapability = systemCapability.seatLocationCapability;
+ } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeDriverDistraction]) {
+ if ([self.driverDistractionCapability isEqual:systemCapability.driverDistractionCapability]) {
+ [self sdl_callObserversForUpdate:systemCapability error:error handler:handler];
+ return NO;
+ }
+ self.driverDistractionCapability = systemCapability.driverDistractionCapability;
} else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming]) {
if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) {
[self sdl_callObserversForUpdate:systemCapability error:error handler:handler];
@@ -451,15 +476,11 @@ typedef NSString * SDLServiceID;
- (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newCapabilities {
SDLLogV(@"Saving app services capability update with new capabilities: %@", newCapabilities);
for (SDLAppServiceCapability *capability in newCapabilities.appServices) {
- if (capability.updateReason == nil) {
- // First update, new capability
- self.appServicesCapabilitiesDictionary[capability.updatedAppServiceRecord.serviceID] = capability;
- } else if ([capability.updateReason isEqualToEnum:SDLServiceUpdateRemoved]) {
- self.appServicesCapabilitiesDictionary[capability.updatedAppServiceRecord.serviceID] = nil;
- } else {
- // Everything else involves adding or updating the existing service record
- self.appServicesCapabilitiesDictionary[capability.updatedAppServiceRecord.serviceID] = capability;
- }
+ // If the capability has been removed, delete the saved capability; otherwise just update with the new capability
+ SDLAppServiceCapability *newCapability = [capability.updateReason isEqualToEnum:SDLServiceUpdateRemoved] ? nil : capability;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ self.appServicesCapabilitiesDictionary[capability.updatedAppServiceRecord.serviceID] = newCapability;
+ }];
}
}
@@ -510,64 +531,22 @@ typedef NSString * SDLServiceID;
#pragma mark - Manager Subscriptions
+#pragma mark Subscribing
+
- (nullable id<NSObject>)subscribeToCapabilityType:(SDLSystemCapabilityType)type withBlock:(SDLCapabilityUpdateHandler)block {
SDLLogD(@"Subscribing to capability type: %@ with a handler (DEPRECATED)", type);
SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] block:block];
- if ([self.currentHMILevel isEqualToEnum:SDLHMILevelNone] && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
- SDLLogE(@"Attempted to subscribe to type: %@ in HMI level NONE, which is not allowed. Please wait until you are in HMI BACKGROUND, LIMITED, or FULL before attempting to subscribe to any SystemCapabilityType other than DISPLAYS.", type);
- [self sdl_invokeObserver:observerObject withCapabilityType:type capability:nil error:[NSError sdl_systemCapabilityManager_cannotUpdateInHMINONE]];
- return nil;
- }
-
- if (self.capabilityObservers[type] == nil) {
- SDLLogD(@"This is the first subscription to capability type: %@, sending a GetSystemCapability with subscribe true", type);
- self.capabilityObservers[type] = [NSMutableArray arrayWithObject:observerObject];
-
- // We don't want to send this for the displays type because that's automatically subscribed
- if (![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
- [self sdl_sendGetSystemCapabilityWithType:type subscribe:@YES completionHandler:nil];
- } else {
- // If we're not calling the GSC RPC we should invoke the observer with the cached data
- [self sdl_invokeObserver:observerObject withCapabilityType:type capability:[self sdl_cachedCapabilityForType:type] error:nil];
- }
- } else {
- // Store the observer and call it immediately with the cached value
- [self.capabilityObservers[type] addObject:observerObject];
- [self sdl_invokeObserver:observerObject withCapabilityType:type capability:[self sdl_cachedCapabilityForType:type] error:nil];
- }
-
- return observerObject.observer;
+ id<NSObject> subscribedObserver = [self sdl_subscribeToCapabilityType:type observerObject:observerObject];
+ return subscribedObserver;
}
- (nullable id<NSObject>)subscribeToCapabilityType:(SDLSystemCapabilityType)type withUpdateHandler:(SDLCapabilityUpdateWithErrorHandler)handler {
SDLLogD(@"Subscribing to capability type: %@ with a handler", type);
SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] updateHandler:handler];
- if ([self.currentHMILevel isEqualToEnum:SDLHMILevelNone] && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
- SDLLogE(@"Attempted to subscribe to type: %@ in HMI level NONE, which is not allowed. Please wait until you are in HMI BACKGROUND, LIMITED, or FULL before attempting to subscribe to any SystemCapabilityType other than DISPLAYS.", type);
- [self sdl_invokeObserver:observerObject withCapabilityType:type capability:nil error:[NSError sdl_systemCapabilityManager_cannotUpdateInHMINONE]];
- return nil;
- }
-
- if (self.capabilityObservers[type] == nil) {
- SDLLogD(@"This is the first subscription to capability type: %@, sending a GetSystemCapability with subscribe true", type);
- self.capabilityObservers[type] = [NSMutableArray arrayWithObject:observerObject];
-
- // We don't want to send this for the displays type because that's automatically subscribed
- if (![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
- [self sdl_sendGetSystemCapabilityWithType:type subscribe:@YES completionHandler:nil];
- } else {
- // If we're not calling the GSC RPC we should invoke the observer with the cached data
- [self sdl_invokeObserver:observerObject withCapabilityType:type capability:[self sdl_cachedCapabilityForType:type] error:nil];
- }
- } else {
- // Store the observer and call it immediately with the cached value
- [self.capabilityObservers[type] addObject:observerObject];
- [self sdl_invokeObserver:observerObject withCapabilityType:type capability:[self sdl_cachedCapabilityForType:type] error:nil];
- }
-
- return observerObject.observer;
+ id<NSObject> subscribedObserver = [self sdl_subscribeToCapabilityType:type observerObject:observerObject];
+ return subscribedObserver;
}
- (BOOL)subscribeToCapabilityType:(SDLSystemCapabilityType)type withObserver:(id<NSObject>)observer selector:(SEL)selector {
@@ -584,15 +563,28 @@ typedef NSString * SDLServiceID;
}
SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:observer selector:selector];
+
+ id<NSObject> subscribedObserver = [self sdl_subscribeToCapabilityType:type observerObject:observerObject];
+ return subscribedObserver == nil ? NO : YES;
+}
+
+/// Helper method for subscribing to a system capability type
+/// @param type The SystemCapabilityType that will be subscribed
+/// @param observerObject An object that can be used to unsubscribe the block. If nil, the subscription was not succesful.
+/// @return The observer if the subscription was succesful; nil if not.
+- (nullable id<NSObject>)sdl_subscribeToCapabilityType:(SDLSystemCapabilityType)type observerObject:(SDLSystemCapabilityObserver *)observerObject {
if ([self.currentHMILevel isEqualToEnum:SDLHMILevelNone] && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
SDLLogE(@"Attempted to subscribe to type: %@ in HMI level NONE, which is not allowed. Please wait until you are in HMI BACKGROUND, LIMITED, or FULL before attempting to subscribe to any SystemCapabilityType other than DISPLAYS.", type);
[self sdl_invokeObserver:observerObject withCapabilityType:type capability:nil error:[NSError sdl_systemCapabilityManager_cannotUpdateInHMINONE]];
- return NO;
+ return nil;
}
if (self.capabilityObservers[type] == nil) {
SDLLogD(@"This is the first subscription to capability type: %@, sending a GetSystemCapability with subscribe true", type);
- self.capabilityObservers[type] = [NSMutableArray arrayWithObject:observerObject];
+
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ self.capabilityObservers[type] = [NSMutableArray arrayWithObject:observerObject];
+ }];
// We don't want to send this for the displays type because that's automatically subscribed
if (![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
@@ -603,18 +595,25 @@ typedef NSString * SDLServiceID;
}
} else {
// Store the observer and call it immediately with the cached value
- [self.capabilityObservers[type] addObject:observerObject];
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ [self.capabilityObservers[type] addObject:observerObject];
+ }];
+
[self sdl_invokeObserver:observerObject withCapabilityType:type capability:[self sdl_cachedCapabilityForType:type] error:nil];
}
- return YES;
+ return observerObject.observer;
}
+#pragma mark Unubscribing
+
- (void)unsubscribeFromCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer {
SDLLogD(@"Unsubscribing from capability type: %@", type);
for (SDLSystemCapabilityObserver *capabilityObserver in self.capabilityObservers[type]) {
if ([observer isEqual:capabilityObserver.observer] && self.capabilityObservers[type] != nil) {
- [self.capabilityObservers[type] removeObject:capabilityObserver];
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ [self.capabilityObservers[type] removeObject:capabilityObserver];
+ }];
[self sdl_removeNilObserversAndUnsubscribeIfNecessary];
break;
@@ -622,6 +621,43 @@ typedef NSString * SDLServiceID;
}
}
+- (void)sdl_removeNilObserversAndUnsubscribeIfNecessary {
+ SDLLogV(@"Checking for nil observers and removing them, then checking for subscriptions we don't need and unsubscribing.");
+ // Loop through our observers
+ for (SDLSystemCapabilityType key in self.capabilityObservers.allKeys) {
+ for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[key]) {
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ // If an observer object is nil, remove it
+ if (observer.observer == nil) {
+ [self.capabilityObservers[key] removeObject:observer];
+ }
+
+ // If we no longer have any observers for that type, remove the array
+ if (self.capabilityObservers[key].count == 0) {
+ [self.capabilityObservers removeObjectForKey:key];
+ }
+ }];
+ }
+ }
+
+ // If we don't support subscriptions, we don't want to unsubscribe by sending an RPC below
+ if (!self.supportsSubscriptions) {
+ return;
+ }
+
+ // Loop through our subscription statuses, check if we're subscribed. If we are, and we do not have observers for that type, and that type is not DISPLAYS, then unsubscribe.
+ for (SDLSystemCapabilityType type in self.subscriptionStatus.allKeys) {
+ if ([self.subscriptionStatus[type] isEqualToNumber:@YES]
+ && self.capabilityObservers[type] == nil
+ && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
+ SDLLogD(@"Removing the last subscription to type %@, sending a GetSystemCapability with subscribe false (will unsubscribe)", type);
+ [self sdl_sendGetSystemCapabilityWithType:type subscribe:@NO completionHandler:nil];
+ }
+ }
+}
+
+#pragma mark Notifying Subscribers
+
/// Calls all observers of a capability type with an updated capability
/// @param capability The new capability update
/// @param handler The update handler to call, if one exists after the observers are called
@@ -651,7 +687,7 @@ typedef NSString * SDLServiceID;
observer.updateBlock(capability, subscribed, error);
} else {
if (![observer.observer respondsToSelector:observer.selector]) {
- @throw [NSException sdl_invalidSelectorExceptionWithSelector:observer.selector];
+ @throw [NSException sdl_invalidSystemCapabilitySelectorExceptionWithSelector:observer.selector];
}
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[(NSObject *)observer.observer methodSignatureForSelector:observer.selector]];
@@ -669,46 +705,13 @@ typedef NSString * SDLServiceID;
[invocation setArgument:&subscribed atIndex:4];
}
if (numberOfParametersInSelector >= 4) {
- @throw [NSException sdl_invalidSelectorExceptionWithSelector:observer.selector];
+ @throw [NSException sdl_invalidSystemCapabilitySelectorExceptionWithSelector:observer.selector];
}
[invocation invoke];
}
}
-- (void)sdl_removeNilObserversAndUnsubscribeIfNecessary {
- SDLLogV(@"Checking for nil observers and removing them, then checking for subscriptions we don't need and unsubscribing.");
- // Loop through our observers
- for (SDLSystemCapabilityType key in self.capabilityObservers.allKeys) {
- for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[key]) {
- // If an observer object is nil, remove it
- if (observer.observer == nil) {
- [self.capabilityObservers[key] removeObject:observer];
- }
-
- // If we no longer have any observers for that type, remove the array
- if (self.capabilityObservers[key].count == 0) {
- [self.capabilityObservers removeObjectForKey:key];
- }
- }
- }
-
- // If we don't support subscriptions, we don't want to unsubscribe by sending an RPC below
- if (!self.supportsSubscriptions) {
- return;
- }
-
- // Loop through our subscription statuses, check if we're subscribed. If we are, and we do not have observers for that type, and that type is not DISPLAYS, then unsubscribe.
- for (SDLSystemCapabilityType type in self.subscriptionStatus.allKeys) {
- if ([self.subscriptionStatus[type] isEqualToNumber:@YES]
- && self.capabilityObservers[type] == nil
- && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
- SDLLogD(@"Removing the last subscription to type %@, sending a GetSystemCapability with subscribe false (will unsubscribe)", type);
- [self sdl_sendGetSystemCapabilityWithType:type subscribe:@NO completionHandler:nil];
- }
- }
-}
-
#pragma mark - Notifications
/// Registers for notifications and responses from Core
@@ -801,6 +804,36 @@ typedef NSString * SDLServiceID;
self.currentHMILevel = onHMIStatus.hmiLevel;
}
+
+#pragma mark Getters
+
+- (NSMutableDictionary<SDLSystemCapabilityType, NSMutableArray<SDLSystemCapabilityObserver *> *> *)capabilityObservers {
+ __block NSMutableDictionary<SDLSystemCapabilityType, NSMutableArray<SDLSystemCapabilityObserver *> *> *dict = nil;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ dict = self->_capabilityObservers;
+ }];
+
+ return dict;
+}
+
+- (NSMutableDictionary<SDLSystemCapabilityType, NSNumber<SDLBool> *> *)subscriptionStatus {
+ __block NSMutableDictionary<SDLSystemCapabilityType, NSNumber<SDLBool> *> *dict = nil;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ dict = self->_subscriptionStatus;
+ }];
+
+ return dict;
+}
+
+- (nullable NSMutableDictionary<SDLServiceID, SDLAppServiceCapability *> *)appServicesCapabilitiesDictionary {
+ __block NSMutableDictionary<SDLServiceID, SDLAppServiceCapability *> *dict = nil;
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ dict = self->_appServicesCapabilitiesDictionary;
+ }];
+
+ return dict;
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSystemCapabilityType.h b/SmartDeviceLink/SDLSystemCapabilityType.h
index 60f11a78a..2c5092794 100755
--- a/SmartDeviceLink/SDLSystemCapabilityType.h
+++ b/SmartDeviceLink/SDLSystemCapabilityType.h
@@ -1,10 +1,34 @@
-//
-// SDLSystemCapabilityType.h
-// SmartDeviceLink-iOS
-//
-// Created by Joel Fischer on 7/10/17.
-// Copyright © 2017 smartdevicelink. All rights reserved.
-//
+/*
+* 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"
@@ -49,3 +73,8 @@ extern SDLSystemCapabilityType const SDLSystemCapabilityTypeSeatLocation;
@since SDL 6.0
*/
extern SDLSystemCapabilityType const SDLSystemCapabilityTypeDisplays;
+
+/**
+ * @since SDL 7.0.0
+ */
+extern SDLSystemCapabilityType const SDLSystemCapabilityTypeDriverDistraction;
diff --git a/SmartDeviceLink/SDLSystemCapabilityType.m b/SmartDeviceLink/SDLSystemCapabilityType.m
index 4185345e6..5f5894ec5 100755
--- a/SmartDeviceLink/SDLSystemCapabilityType.m
+++ b/SmartDeviceLink/SDLSystemCapabilityType.m
@@ -15,3 +15,4 @@ SDLSystemCapabilityType const SDLSystemCapabilityTypeVideoStreaming = @"VIDEO_ST
SDLSystemCapabilityType const SDLSystemCapabilityTypeRemoteControl = @"REMOTE_CONTROL";
SDLSystemCapabilityType const SDLSystemCapabilityTypeSeatLocation = @"SEAT_LOCATION";
SDLSystemCapabilityType const SDLSystemCapabilityTypeDisplays = @"DISPLAYS";
+SDLSystemCapabilityType const SDLSystemCapabilityTypeDriverDistraction = @"DRIVER_DISTRACTION";
diff --git a/SmartDeviceLink/SDLTCPTransport.m b/SmartDeviceLink/SDLTCPTransport.m
index 0dc347f8a..962c1ffc4 100644
--- a/SmartDeviceLink/SDLTCPTransport.m
+++ b/SmartDeviceLink/SDLTCPTransport.m
@@ -9,6 +9,7 @@
#import "SDLTCPTransport.h"
#import "SDLMutableDataQueue.h"
#import "SDLError.h"
+#import "SDLGlobals.h"
#import "SDLLogMacros.h"
#import "SDLTimer.h"
#import <errno.h>
@@ -16,6 +17,7 @@
NS_ASSUME_NONNULL_BEGIN
NSString *const TCPIOThreadName = @"com.smartdevicelink.tcpiothread";
+NSTimeInterval const IOThreadCanceledSemaphoreWaitSecs = 1.0;
NSUInteger const DefaultReceiveBufferSize = 16 * 1024;
NSTimeInterval ConnectionTimeoutSecs = 30.0;
@@ -30,15 +32,21 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
@property (nullable, nonatomic, strong) SDLTimer *connectionTimer;
@property (nonatomic, assign) BOOL transportConnected;
@property (nonatomic, assign) BOOL transportErrorNotified;
+/// A semaphore used to block the current thread until we know that the I/O streams have been shutdown on the ioThread
+@property (nonatomic, strong) dispatch_semaphore_t ioThreadCancelledSemaphore;
+
@end
@implementation SDLTCPTransport
- (instancetype)init {
- if (self = [super init]) {
- _receiveBufferSize = DefaultReceiveBufferSize;
- _sendDataQueue = [[SDLMutableDataQueue alloc] init];
- }
+ self = [super init];
+ if (!self) { return nil; }
+
+ _receiveBufferSize = DefaultReceiveBufferSize;
+ _sendDataQueue = [[SDLMutableDataQueue alloc] init];
+ _ioThreadCancelledSemaphore = dispatch_semaphore_create(0);
+
return self;
}
@@ -52,10 +60,6 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
return self;
}
-- (void)dealloc {
- SDLLogV(@"dealloc");
-}
-
#pragma mark - Stream Lifecycle
// Note: When a connection is refused (e.g. TCP port number is not correct) or timed out (e.g. invalid IP address), then onError will be notified.
@@ -95,22 +99,55 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
[self.ioThread start];
}
-- (void)disconnect {
- if (self.ioThread == nil) {
- SDLLogV(@"TCP transport thread already disconnected");
- return;
- }
-
+- (void)disconnectWithCompletionHandler:(void (^)(void))disconnectCompletionHandler {
SDLLogD(@"Disconnecting");
[self.sendDataQueue removeAllObjects];
self.transportErrorNotified = NO;
self.transportConnected = NO;
- // Attempt to cancel the `ioThread`. Once the thread realizes it has been cancelled, it will cleanup the input/output streams.
- [self sdl_cancelIOThread];
+ if (self.ioThread == nil) {
+ SDLLogV(@"TCP transport not yet started or has been shutdown");
+ return disconnectCompletionHandler();
+ }
+
+ // Tell the ioThread 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 ioThread, which would block the ioThread and prevent shutdown.
+ __weak typeof(self) weakSelf = self;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+
+ // Attempt to cancel the ioThread. 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.ioThread cancel];
+ [strongSelf performSelector:@selector(sdl_doNothing) onThread:self.ioThread withObject:nil waitUntilDone:NO];
+
+ // Block the thread until the semaphore has been released by the ioThread (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.");
+ }
+
+ disconnectCompletionHandler();
+ });
}
+/// Wait for the ioThread to destroy the I/O streams. To ensure that we are not blocking the ioThread, this method should only be called from the main thread.
+/// @return Whether or not the session's I/O streams were closed successfully.
+- (BOOL)sdl_isIOThreadCancelled {
+ NSAssert(![NSThread.currentThread.name isEqualToString:TCPIOThreadName], @"%@ must not be called from the ioThread!", NSStringFromSelector(_cmd));
+
+ long lWait = dispatch_semaphore_wait(self.ioThreadCancelledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(IOThreadCanceledSemaphoreWaitSecs * NSEC_PER_SEC)));
+ if (lWait == 0) {
+ SDLLogD(@"ioThread cancelled successfully");
+ return YES;
+ }
+
+ SDLLogE(@"Failed to cancel ioThread within %f seconds", IOThreadCanceledSemaphoreWaitSecs);
+ return NO;
+}
+
+/// Helper method for waking up the ioThread.
+- (void)sdl_doNothing {}
+
#pragma mark - Data Transmission
- (void)sendData:(NSData *)msgBytes {
@@ -139,27 +176,36 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
[self.inputStream open];
[self.outputStream open];
- while (self.ioThread != nil && ![self.ioThread isCancelled]) {
+ while (self.ioThread != nil && !self.ioThread.cancelled) {
BOOL ret = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
if (!ret) {
SDLLogW(@"Failed to start TCP transport run loop");
break;
}
}
- SDLLogD(@"TCP transport run loop terminated");
+ // Close the I/O streams
+ SDLLogD(@"TCP transport run loop terminated");
[self sdl_teardownStream:self.inputStream];
[self sdl_teardownStream:self.outputStream];
-
+ self.inputStream = nil;
+ self.outputStream = nil;
[self.connectionTimer cancel];
+
+ // 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.ioThreadCancelledSemaphore);
}
}
+/// Configures a stream
+/// @param stream An input or output stream
- (void)sdl_setupStream:(NSStream *)stream {
stream.delegate = self;
[stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
+/// Tears down a stream
+/// @param stream An input or output stream
- (void)sdl_teardownStream:(NSStream *)stream {
NSStreamStatus streamStatus = stream.streamStatus;
if (streamStatus != NSStreamStatusNotOpen && streamStatus != NSStreamStatusClosed) {
@@ -169,13 +215,6 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
[stream setDelegate:nil];
}
-- (void)sdl_cancelIOThread {
- [self.ioThread cancel];
-
- // Wake up the run loop in case we don't have any I/O event
- [self performSelector:@selector(sdl_doNothing) onThread:self.ioThread withObject:nil waitUntilDone:NO];
-}
-
#pragma mark - NSStreamDelegate
// this method runs only on the I/O thread (i.e. invoked from the run loop)
@@ -271,8 +310,6 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
NSAssert([[NSThread currentThread] isEqual:self.ioThread], @"sdl_onConnectionTimedOut is called on a wrong thread!");
SDLLogW(@"TCP connection timed out");
- [self sdl_cancelIOThread];
-
if (!self.transportErrorNotified) {
NSAssert(!self.transportConnected, @"transport should not be connected in this case");
[self.delegate onError:[NSError sdl_transport_connectionTimedOutError]];
@@ -283,9 +320,6 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
- (void)sdl_onStreamError:(NSStream *)stream {
NSAssert([[NSThread currentThread] isEqual:self.ioThread], @"sdl_onStreamError is called on a wrong thread!");
- // stop I/O thread
- [self sdl_cancelIOThread];
-
// avoid notifying multiple error events
if (self.transportErrorNotified) {
return;
@@ -333,16 +367,12 @@ NSTimeInterval ConnectionTimeoutSecs = 30.0;
SDLLogD(@"Stream ended");
NSAssert([[NSThread currentThread] isEqual:self.ioThread], @"sdl_onStreamEnd is called on a wrong thread!");
- [self sdl_cancelIOThread];
-
if (!self.transportErrorNotified) {
[self.delegate onTransportDisconnected];
self.transportErrorNotified = YES;
}
}
-- (void)sdl_doNothing {}
-
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLTextField+ScreenManagerExtensions.m b/SmartDeviceLink/SDLTextField+ScreenManagerExtensions.m
index 746c5ae23..28e6b349d 100644
--- a/SmartDeviceLink/SDLTextField+ScreenManagerExtensions.m
+++ b/SmartDeviceLink/SDLTextField+ScreenManagerExtensions.m
@@ -17,7 +17,7 @@
+ (NSArray<SDLTextField *> *)allTextFields {
NSMutableArray<SDLTextField *> *tempTextFields = [NSMutableArray array];
for (SDLTextFieldName fieldName in [self sdl_allTextFieldNames]) {
- [tempTextFields addObject:[[SDLTextField alloc] initWithName:fieldName characterSet:SDLCharacterSetCID1 width:500 rows:8]];
+ [tempTextFields addObject:[[SDLTextField alloc] initWithName:fieldName characterSet:SDLCharacterSetUtf8 width:500 rows:8]];
}
return tempTextFields;
diff --git a/SmartDeviceLink/SDLTextField.h b/SmartDeviceLink/SDLTextField.h
index d1dcedb1d..a345ff145 100644
--- a/SmartDeviceLink/SDLTextField.h
+++ b/SmartDeviceLink/SDLTextField.h
@@ -26,11 +26,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) SDLTextFieldName name;
/**
- * The character set that is supported in this field.
- *
- * @see SDLCharacterSet
- *
- * Required
+ * 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.
*/
@property (strong, nonatomic) SDLCharacterSet characterSet;
diff --git a/SmartDeviceLink/SDLTimer.h b/SmartDeviceLink/SDLTimer.h
index 3ca45fdb1..dcd75c79c 100644
--- a/SmartDeviceLink/SDLTimer.h
+++ b/SmartDeviceLink/SDLTimer.h
@@ -17,6 +17,12 @@ NS_ASSUME_NONNULL_BEGIN
/// The time between calling `start` and when the elapsed block will be called
@property (assign, nonatomic) NSTimeInterval duration;
+/// Whether or not the timer is currently running
+@property (assign, nonatomic) BOOL timerRunning;
+
+/// Whether or not the timer will repeat after it completes
+@property (assign, nonatomic) BOOL repeat;
+
- (instancetype)init NS_UNAVAILABLE;
/// Initialize a timer with a specified duration on the main run loop without repeating
diff --git a/SmartDeviceLink/SDLTimer.m b/SmartDeviceLink/SDLTimer.m
index 5ef063307..39479c9af 100644
--- a/SmartDeviceLink/SDLTimer.m
+++ b/SmartDeviceLink/SDLTimer.m
@@ -41,8 +41,6 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLTimer () <SDLTimerTargetDelegate>
@property (strong, nonatomic, nullable) NSTimer *timer;
-@property (assign, nonatomic) BOOL timerRunning;
-@property (assign, nonatomic) BOOL repeat;
@end
diff --git a/SmartDeviceLink/SDLTouch.h b/SmartDeviceLink/SDLTouch.h
index e001257b9..b6df4bacf 100644
--- a/SmartDeviceLink/SDLTouch.h
+++ b/SmartDeviceLink/SDLTouch.h
@@ -11,13 +11,13 @@
@class SDLTouchEvent;
/// Identifies finger touch
-typedef enum {
+typedef NS_ENUM(NSUInteger, SDLTouchIdentifier) {
/// Touch was first finger
SDLTouchIdentifierFirstFinger = 0,
/// Touch was second finger
SDLTouchIdentifierSecondFinger = 1
-} SDLTouchIdentifier;
+};
NS_ASSUME_NONNULL_BEGIN
diff --git a/SmartDeviceLink/SDLTouchManager.m b/SmartDeviceLink/SDLTouchManager.m
index 5a861663d..242f4e46e 100644
--- a/SmartDeviceLink/SDLTouchManager.m
+++ b/SmartDeviceLink/SDLTouchManager.m
@@ -15,7 +15,6 @@
#import "SDLNotificationConstants.h"
#import "SDLOnTouchEvent.h"
#import "SDLPinchGesture.h"
-#import "SDLProxyListener.h"
#import "SDLRPCNotificationNotification.h"
#import "SDLStreamingVideoScaleManager.h"
#import "SDLTimer.h"
diff --git a/SmartDeviceLink/SDLTransportType.h b/SmartDeviceLink/SDLTransportType.h
index 5d516808d..8cfb4ec7e 100644
--- a/SmartDeviceLink/SDLTransportType.h
+++ b/SmartDeviceLink/SDLTransportType.h
@@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nullable, weak, nonatomic) id<SDLTransportDelegate> delegate;
- (void)connect;
-- (void)disconnect;
+- (void)disconnectWithCompletionHandler:(void (^)(void))disconnectCompletionHandler;
- (void)sendData:(NSData *)dataToSend;
@end
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.h b/SmartDeviceLink/SDLUnsubscribeVehicleData.h
index ed97278f2..bce3c5b71 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleData.h
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.h
@@ -50,7 +50,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 clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 wiperStatus:(BOOL)wiperStatus __deprecated_msg("Use initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 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:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for unsubscribing to all possible vehicle data items.
@@ -85,7 +85,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 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:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: instead");
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation 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:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for unsubscribing to all possible vehicle data items.
@@ -121,7 +121,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:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey: 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:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering: instead");
/**
* Convenience init for unsubscribing from all possible vehicle data items.
@@ -129,8 +129,6 @@ NS_ASSUME_NONNULL_BEGIN
* @param gps - gps
* @param speed - speed
* @param rpm - rpm
- * @param fuelLevel - fuelLevel
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - instantFuelConsumption
* @param fuelRange - fuelRange
* @param externalTemperature - externalTemperature
@@ -155,9 +153,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModeStatus - clusterModeStatus
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLUnsubscribeVehicleData object
*/
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm fuelLevel:(nullable NSNumber<SDLBool> *)fuelLevel fuelLevel_State:(nullable NSNumber<SDLBool> *)fuelLevel_State 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 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;
+- (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 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;
/**
* If true, unsubscribes from GearStatus
@@ -182,12 +181,12 @@ NS_ASSUME_NONNULL_BEGIN
/**
* If true, unsubscribes from Fuel Level
*/
-@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel;
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
* If true, unsubscribes from Fuel Level State
*/
-@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel_State;
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *fuelLevel_State __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
* If true, unsubscribes from Fuel Range
@@ -245,6 +244,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *wiperStatus;
/**
+ * To indicate whether driver hands are off the steering wheel
+ */
+@property (strong, nonatomic, nullable) NSNumber<SDLBool> *handsOffSteering;
+
+/**
* If true, unsubscribes from Head Lamp Status
*/
@property (strong, nonatomic, nullable) NSNumber<SDLBool> *headLampStatus;
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.m b/SmartDeviceLink/SDLUnsubscribeVehicleData.m
index 853f07f06..07174a8e0 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleData.m
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.m
@@ -24,42 +24,45 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic pop
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState 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 wiperStatus:(BOOL)wiperStatus {
- self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) instantFuelConsumption:@(instantFuelConsumption) fuelRange:nil externalTemperature:@(externalTemperature) turnSignal:nil 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:nil electronicParkBrakeStatus:nil cloudAppVehicleID:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
- if (!self) {
- return nil;
- }
+ self = [self initWithGps:@(gps) speed:@(speed) rpm:@(rpm) instantFuelConsumption:@(instantFuelConsumption) fuelRange:nil externalTemperature:@(externalTemperature) turnSignal:nil 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:nil electronicParkBrakeStatus:nil cloudAppVehicleID:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
+ if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- self.prndl = @(prndl);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.prndl = @(prndl);
#pragma clang diagnostic pop
+ }
return self;
}
- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation 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) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) 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:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
- if (!self) {
- return nil;
- }
+ 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:nil eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
+ if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- self.prndl = @(prndl);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.prndl = @(prndl);
#pragma clang diagnostic pop
+ }
return self;
}
- (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) fuelLevel:@(fuelLevel) fuelLevel_State:@(fuelLevelState) 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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey)];
- if (!self) {
- return nil;
- }
+ 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) eCallInfo:@(eCallInfo) airbagStatus:@(airbagStatus) emergencyEvent:@(emergencyEvent) clusterModeStatus:@(clusterModeStatus) myKey:@(myKey) handsOffSteering:nil];
+ if (self) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- self.prndl = @(prndl);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.prndl = @(prndl);
#pragma clang diagnostic pop
+ }
return self;
}
-- (instancetype)initWithGps:(nullable NSNumber<SDLBool> *)gps speed:(nullable NSNumber<SDLBool> *)speed rpm:(nullable NSNumber<SDLBool> *)rpm fuelLevel:(nullable NSNumber<SDLBool> *)fuelLevel fuelLevel_State:(nullable NSNumber<SDLBool> *)fuelLevel_State 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 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 {
+- (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 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 {
self = [self init];
if (!self) {
return nil;
@@ -67,8 +70,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = speed;
self.rpm = rpm;
- self.fuelLevel = fuelLevel;
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
self.externalTemperature = externalTemperature;
@@ -93,6 +94,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModeStatus = clusterModeStatus;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -344,6 +346,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:NSNumber.class error:nil];
}
+- (void)setHandsOffSteering:(nullable NSNumber<SDLBool> *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable NSNumber<SDLBool> *)handsOffSteering {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:NSNumber.class error:&error];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h
index 2bd16c0d9..13f1bf80b 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h
@@ -21,8 +21,6 @@ NS_ASSUME_NONNULL_BEGIN
* @param gps - gps
* @param speed - speed
* @param rpm - rpm
- * @param fuelLevel - fuelLevel
- * @param fuelLevel_State - fuelLevel_State
* @param instantFuelConsumption - instantFuelConsumption
* @param fuelRange - fuelRange
* @param externalTemperature - externalTemperature
@@ -47,9 +45,10 @@ NS_ASSUME_NONNULL_BEGIN
* @param emergencyEvent - emergencyEvent
* @param clusterModes - clusterModes
* @param myKey - myKey
+ * @param handsOffSteering - handsOffSteering
* @return A SDLUnsubscribeVehicleDataResponse object
*/
-- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm fuelLevel:(nullable SDLVehicleDataResult *)fuelLevel fuelLevel_State:(nullable SDLVehicleDataResult *)fuelLevel_State 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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey;
+- (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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering;
/**
The result of requesting to unsubscribe to the GearStatus.
@@ -82,14 +81,14 @@ NS_ASSUME_NONNULL_BEGIN
Optional
*/
-@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel;
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
The result of requesting to unsubscribe to the fuel level state.
Optional
*/
-@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel_State;
+@property (strong, nonatomic, nullable) SDLVehicleDataResult *fuelLevel_State __deprecated_msg("use fuelRange instead on 7.0+ RPC version connections");
/**
The result of requesting to unsubscribe to the fuel range.
@@ -169,6 +168,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, nullable) SDLVehicleDataResult *wiperStatus;
/**
+ The result of requesting to unsubscribe from the status of driver hands are off the steering wheel
+ */
+@property (nullable, strong, nonatomic) SDLVehicleDataResult *handsOffSteering;
+
+/**
The result of requesting to unsubscribe to the status of the head lamps.
Optional
@@ -261,7 +265,7 @@ NS_ASSUME_NONNULL_BEGIN
/**
Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.
-
+
@param vehicleDataName The name of the OEM custom vehicle data item.
@param vehicleDataState SDLVehicleDataResult object containing custom data type and result code information.
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m
index ccb9309a8..f5fb1ae1c 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m
@@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
}
#pragma clang diagnostic pop
-- (instancetype)initWithGps:(nullable SDLVehicleDataResult *)gps speed:(nullable SDLVehicleDataResult *)speed rpm:(nullable SDLVehicleDataResult *)rpm fuelLevel:(nullable SDLVehicleDataResult *)fuelLevel fuelLevel_State:(nullable SDLVehicleDataResult *)fuelLevel_State 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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey {
+- (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 eCallInfo:(nullable SDLVehicleDataResult *)eCallInfo airbagStatus:(nullable SDLVehicleDataResult *)airbagStatus emergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent clusterModes:(nullable SDLVehicleDataResult *)clusterModes myKey:(nullable SDLVehicleDataResult *)myKey handsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering {
self = [self init];
if (!self) {
return nil;
@@ -32,8 +32,6 @@ NS_ASSUME_NONNULL_BEGIN
self.gps = gps;
self.speed = speed;
self.rpm = rpm;
- self.fuelLevel = fuelLevel;
- self.fuelLevel_State = fuelLevel_State;
self.instantFuelConsumption = instantFuelConsumption;
self.fuelRange = fuelRange;
self.externalTemperature = externalTemperature;
@@ -58,6 +56,7 @@ NS_ASSUME_NONNULL_BEGIN
self.emergencyEvent = emergencyEvent;
self.clusterModes = clusterModes;
self.myKey = myKey;
+ self.handsOffSteering = handsOffSteering;
return self;
}
@@ -310,6 +309,15 @@ NS_ASSUME_NONNULL_BEGIN
return [self.parameters sdl_objectForName:vehicleDataName ofClass:SDLVehicleDataResult.class error:nil];
}
+- (void)setHandsOffSteering:(nullable SDLVehicleDataResult *)handsOffSteering {
+ [self.parameters sdl_setObject:handsOffSteering forName:SDLRPCParameterNameHandsOffSteering];
+}
+
+- (nullable SDLVehicleDataResult *)handsOffSteering {
+ NSError *error = nil;
+ return [self.parameters sdl_objectForName:SDLRPCParameterNameHandsOffSteering ofClass:SDLVehicleDataResult.class error:&error];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLVehicleDataType.h b/SmartDeviceLink/SDLVehicleDataType.h
index cbe98886d..e75796b24 100644
--- a/SmartDeviceLink/SDLVehicleDataType.h
+++ b/SmartDeviceLink/SDLVehicleDataType.h
@@ -32,12 +32,12 @@ extern SDLVehicleDataType const SDLVehicleDataTypeRPM;
/**
Vehicle fuel level data
*/
-extern SDLVehicleDataType const SDLVehicleDataTypeFuelLevel;
+extern SDLVehicleDataType const SDLVehicleDataTypeFuelLevel __deprecated_msg("use SDLVehicleDataTypeFuelRange on RPC 7.0+ connections");
/**
Vehicle fuel level state data
*/
-extern SDLVehicleDataType const SDLVehicleDataTypeFuelLevelState;
+extern SDLVehicleDataType const SDLVehicleDataTypeFuelLevelState __deprecated_msg("use SDLVehicleDataTypeFuelRange on RPC 7.0+ connections");
/**
Vehicle fuel consumption data
@@ -125,6 +125,12 @@ extern SDLVehicleDataType const SDLVehicleDataTypeBraking;
extern SDLVehicleDataType const SDLVehicleDataTypeWiperStatus;
/**
+ To indicate whether driver hands are off the steering wheel
+ Added in SDL 7.0.0
+ */
+extern SDLVehicleDataType const SDLVehicleDataTypeHandsOffSteering;
+
+/**
Vehicle headlamp status
*/
extern SDLVehicleDataType const SDLVehicleDataTypeHeadlampStatus;
diff --git a/SmartDeviceLink/SDLVehicleDataType.m b/SmartDeviceLink/SDLVehicleDataType.m
index 7c02733d5..5c268cb47 100644
--- a/SmartDeviceLink/SDLVehicleDataType.m
+++ b/SmartDeviceLink/SDLVehicleDataType.m
@@ -35,5 +35,6 @@ SDLVehicleDataType const SDLVehicleDataTypeSpeed = @"VEHICLEDATA_SPEED";
SDLVehicleDataType const SDLVehicleDataTypeSteeringWheel = @"VEHICLEDATA_STEERINGWHEEL";
SDLVehicleDataType const SDLVehicleDataTypeTirePressure = @"VEHICLEDATA_TIREPRESSURE";
SDLVehicleDataType const SDLVehicleDataTypeTurnSignal = @"VEHICLEDATA_TURNSIGNAL";
+SDLVehicleDataType const SDLVehicleDataTypeHandsOffSteering = @"VEHICLEDATA_HANDSOFFSTEERING";
SDLVehicleDataType const SDLVehicleDataTypeVIN = @"VEHICLEDATA_VIN";
SDLVehicleDataType const SDLVehicleDataTypeWiperStatus = @"VEHICLEDATA_WIPERSTATUS";
diff --git a/SmartDeviceLink/SDLWindowCapability.h b/SmartDeviceLink/SDLWindowCapability.h
index a68eb0127..8360416b2 100644
--- a/SmartDeviceLink/SDLWindowCapability.h
+++ b/SmartDeviceLink/SDLWindowCapability.h
@@ -68,14 +68,14 @@ NS_ASSUME_NONNULL_BEGIN
Size: min 1 max 100
*/
-@property (nullable, strong, nonatomic) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
+@property (nullable, strong, nonatomic) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
/**
The number of soft buttons available on-window and the capabilities for each button.
Size: min 1 max 100
*/
-@property (nullable, strong, nonatomic) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
+@property (nullable, strong, nonatomic) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
/**
An array of available menu layouts. If this parameter is not provided, only the `LIST` layout is assumed to be available.
diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h
index 695b5dd73..51633bb55 100644
--- a/SmartDeviceLink/SmartDeviceLink.h
+++ b/SmartDeviceLink/SmartDeviceLink.h
@@ -198,6 +198,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLDeviceStatus.h"
#import "SDLDisplayCapabilities.h"
#import "SDLDisplayCapability.h"
+#import "SDLDriverDistractionCapability.h"
#import "SDLECallInfo.h"
#import "SDLEmergencyEvent.h"
#import "SDLFuelRange.h"
@@ -437,6 +438,8 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
// Permissions
#import "SDLPermissionConstants.h"
+#import "SDLPermissionElement.h"
+#import "SDLRPCPermissionStatus.h"
#import "SDLPermissionManager.h"
// Screen
diff --git a/SmartDeviceLink/TestSubscribeButtonObserver.h b/SmartDeviceLink/TestSubscribeButtonObserver.h
new file mode 100644
index 000000000..f2cde7318
--- /dev/null
+++ b/SmartDeviceLink/TestSubscribeButtonObserver.h
@@ -0,0 +1,34 @@
+//
+// TestSubscribeButtonObserver.h
+// SmartDeviceLink
+//
+// Created by Nicole on 6/22/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLSubscribeButton.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TestSubscribeButtonObserver : NSObject
+
+@property (assign, nonatomic) NSUInteger selectorCalledCount;
+@property (strong, nonatomic, nullable) NSMutableArray<SDLButtonName> *buttonNamesReceived;
+@property (strong, nonatomic, nullable) NSMutableArray<NSError *> *buttonErrorsReceived;
+@property (strong, nonatomic, nullable) NSMutableArray<SDLOnButtonEvent *> *buttonEventsReceived;
+@property (strong, nonatomic, nullable) NSMutableArray<SDLOnButtonPress *> *buttonPressesReceived;
+
+- (void)buttonPressEvent;
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName;
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error;
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress;
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress buttonEvent:(SDLOnButtonEvent *)buttonEvent;
+
+/// An invalid selector with too many parameters
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress buttonEvent:(SDLOnButtonEvent *)buttonEvent extraParameter:(BOOL)extraParameter;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/TestSubscribeButtonObserver.m b/SmartDeviceLink/TestSubscribeButtonObserver.m
new file mode 100644
index 000000000..99f9f44b9
--- /dev/null
+++ b/SmartDeviceLink/TestSubscribeButtonObserver.m
@@ -0,0 +1,70 @@
+//
+// TestSubscribeButtonObserver.m
+// SmartDeviceLink
+//
+// Created by Nicole on 6/22/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "TestSubscribeButtonObserver.h"
+
+@implementation TestSubscribeButtonObserver
+
+- (instancetype)init {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _selectorCalledCount = 0;
+ _buttonNamesReceived = [NSMutableArray<SDLButtonName> array];
+ _buttonErrorsReceived = [NSMutableArray<NSError *> array];
+ _buttonEventsReceived = [NSMutableArray<SDLOnButtonEvent *> array];
+ _buttonPressesReceived = [NSMutableArray<SDLOnButtonPress *> array];
+
+ return self;
+}
+
+- (void)buttonPressEvent {
+ [self sdl_saveButtonName:nil buttonError:nil buttonPress:nil buttonEvent:nil];
+}
+
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName {
+ [self sdl_saveButtonName:buttonName buttonError:nil buttonPress:nil buttonEvent:nil];
+}
+
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error {
+ [self sdl_saveButtonName:buttonName buttonError:error buttonPress:nil buttonEvent:nil];
+}
+
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress {
+ [self sdl_saveButtonName:buttonName buttonError:error buttonPress:buttonPress buttonEvent:nil];
+}
+
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress buttonEvent:(SDLOnButtonEvent *)buttonEvent {
+ [self sdl_saveButtonName:buttonName buttonError:error buttonPress:buttonPress buttonEvent:buttonEvent];
+}
+
+- (void)buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress buttonEvent:(SDLOnButtonEvent *)buttonEvent extraParameter:(BOOL)extraParameter {
+ [self sdl_saveButtonName:buttonName buttonError:error buttonPress:buttonPress buttonEvent:buttonEvent];
+}
+
+- (void)sdl_saveButtonName:(nullable SDLButtonName)buttonName buttonError:(nullable NSError *)buttonError buttonPress:(nullable SDLOnButtonPress *)buttonPress buttonEvent:(nullable SDLOnButtonEvent *)buttonEvent {
+ self.selectorCalledCount++;
+
+ if (buttonName != nil) {
+ [self.buttonNamesReceived addObject:buttonName];
+ }
+
+ if (buttonError != nil) {
+ [self.buttonErrorsReceived addObject:buttonError];
+ }
+
+ if (buttonPress != nil) {
+ [self.buttonPressesReceived addObject:buttonPress];
+ }
+
+ if (buttonEvent != nil) {
+ [self.buttonEventsReceived addObject:buttonEvent];
+ }
+}
+
+@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m
index 77999e9d9..1341fc916 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m
@@ -33,8 +33,6 @@ describe(@"the audio stream manager", ^{
beforeEach(^{
mockAudioManager.audioConnected = NO;
[testManager pushWithFileURL:testAudioFileURL];
-
- [NSThread sleepForTimeInterval:0.5];
});
describe(@"after attempting to play the file", ^{
@@ -44,7 +42,7 @@ describe(@"the audio stream manager", ^{
});
it(@"should fail to send data", ^{
- expect(mockAudioManager.dataSinceClear.length).to(equal(0));
+ expect(mockAudioManager.dataSinceClear.length).toEventually(equal(0));
expect(mockAudioManager.error.code).toEventually(equal(SDLAudioStreamManagerErrorNotConnected));
});
});
@@ -54,8 +52,6 @@ describe(@"the audio stream manager", ^{
beforeEach(^{
mockAudioManager.audioConnected = NO;
[testManager pushWithData:testAudioFileData];
-
- [NSThread sleepForTimeInterval:0.5];
});
describe(@"after attempting to play the file", ^{
@@ -65,7 +61,7 @@ describe(@"the audio stream manager", ^{
});
it(@"should fail to send data", ^{
- expect(mockAudioManager.dataSinceClear.length).to(equal(0));
+ expect(mockAudioManager.dataSinceClear.length).toEventually(equal(0));
expect(mockAudioManager.error.code).toEventually(equal(SDLAudioStreamManagerErrorNotConnected));
});
});
@@ -76,27 +72,27 @@ describe(@"the audio stream manager", ^{
beforeEach(^{
mockAudioManager.audioConnected = YES;
[testManager pushWithFileURL:testAudioFileURL];
-
- [NSThread sleepForTimeInterval:0.5];
});
it(@"should have a file in the queue", ^{
- expect(testManager.queue).toNot(beEmpty());
+ expect(testManager.queue).toEventuallyNot(beEmpty());
});
describe(@"after attempting to play the file", ^{
beforeEach(^{
[mockAudioManager clearData];
[testManager playNextWhenReady];
-
- [NSThread sleepForTimeInterval:1.0];
});
it(@"should be sending data", ^{
expect(testManager.isPlaying).toEventually(beTrue());
expect(mockAudioManager.dataSinceClear.length).toEventually(equal(34380));
- // Fails when it shouldn't, `weakself` goes to nil in `sdl_playNextWhenReady`
+ // 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());
});
});
@@ -116,12 +112,10 @@ describe(@"the audio stream manager", ^{
beforeEach(^{
mockAudioManager.audioConnected = YES;
[testManager pushWithData:testAudioFileData];
-
- [NSThread sleepForTimeInterval:0.5];
});
it(@"should have a file in the queue", ^{
- expect(testManager.queue).toNot(beEmpty());
+ expect(testManager.queue).toEventuallyNot(beEmpty());
});
describe(@"after attempting to play the audio buffer", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
index c9ce76b50..47156d1c0 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
@@ -95,7 +95,7 @@ describe(@"choice set manager tests", ^{
testCell3 = [[SDLChoiceCell alloc] initWithText:@"test3"];
enabledWindowCapability = [[SDLWindowCapability alloc] init];
- enabledWindowCapability.textFields = @[[[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetType5 width:500 rows:1]];
+ enabledWindowCapability.textFields = @[[[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1]];
disabledWindowCapability = [[SDLWindowCapability alloc] init];
disabledWindowCapability.textFields = @[];
blankWindowCapability = [[SDLWindowCapability alloc] init];
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m
index 38fb36ec9..73a973975 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m
@@ -79,7 +79,10 @@ describe(@"a configuration", ^{
});
it(@"configurationWithLifecycle:lockScreen:logging:fileManager", ^{
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
testConfig = [SDLConfiguration configurationWithLifecycle:someLifecycleConfig lockScreen:someLockscreenConfig logging:someLogConfig fileManager:someFileManagerConfig];
+ #pragma clang diagnostic pop
expect(testConfig.lifecycleConfig).to(equal(someLifecycleConfig));
expect(testConfig.lockScreenConfig).to(equal(someLockscreenConfig));
@@ -131,7 +134,10 @@ describe(@"a configuration", ^{
});
it(@"configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:", ^{
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
testConfig = [SDLConfiguration configurationWithLifecycle:someLifecycleConfig lockScreen:someLockscreenConfig logging:someLogConfig streamingMedia:someStreamingConfig fileManager:someFileManagerConfig];
+ #pragma clang diagnostic pop
expect(testConfig.lifecycleConfig).to(equal(someLifecycleConfig));
expect(testConfig.lockScreenConfig).to(equal(someLockscreenConfig));
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeSecurityManager.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeSecurityManager.m
index e50dab063..81673c819 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeSecurityManager.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeSecurityManager.m
@@ -31,7 +31,7 @@
}
+ (NSSet<NSString *> *)availableMakes {
- return [NSSet set];
+ return [NSSet setWithObject:@"SDL"];
}
@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h
index e6e9bae11..b0cf5a985 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h
@@ -12,6 +12,4 @@
@interface SDLFakeViewControllerPresenter : NSObject <SDLViewControllerPresentable>
-@property (strong, nonatomic, nullable) UIViewController *lockViewController;
-
@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m
index db28e24b8..c4c7fe101 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m
@@ -12,6 +12,7 @@
@interface SDLFakeViewControllerPresenter ()
@property (assign, nonatomic) BOOL shouldShowLockScreen;
+@property (strong, nonatomic, nullable) UIViewController *lockVC;
@end
@@ -45,5 +46,12 @@
}
}
+- (void)setLockViewController:(UIViewController *)lockViewController {
+ self.lockVC = lockViewController;
+}
+
+- (UIViewController *)lockViewController {
+ return self.lockVC;
+}
@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
index 0c1219cdb..55bc7336f 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
@@ -12,6 +12,7 @@
#import "SDLGlobals.h"
#import "SDLHMILevel.h"
#import "SDLLifecycleConfiguration.h"
+#import "SDLLifecycleProtocolHandler.h"
#import "SDLLockScreenConfiguration.h"
#import "SDLLockScreenManager.h"
#import "SDLLogConfiguration.h"
@@ -23,7 +24,6 @@
#import "SDLOnHMIStatus.h"
#import "SDLPerformAppServiceInteractionResponse.h"
#import "SDLPermissionManager.h"
-#import "SDLProxy.h"
#import "SDLProtocol.h"
#import "SDLRegisterAppInterface.h"
#import "SDLRegisterAppInterfaceResponse.h"
@@ -81,10 +81,15 @@ QuickConfigurationBegin(SendingRPCsConfiguration)
QuickConfigurationEnd
+@interface SDLGlobals ()
+@property (copy, nonatomic, readwrite) SDLVersion *protocolVersion;
+@end
+
@interface SDLLifecycleManager ()
// reach the private property for testing
@property (strong, nonatomic, nullable) SDLSecondaryTransportManager *secondaryTransportManager;
+@property (strong, nonatomic, nullable) SDLLifecycleProtocolHandler *protocolHandler;
@end
@@ -95,13 +100,13 @@ describe(@"a lifecycle manager", ^{
__block SDLConfiguration *testConfig = nil;
__block id protocolMock = OCMClassMock([SDLProtocol class]);
- __block id proxyMock = OCMClassMock([SDLProxy class]);
__block id lockScreenManagerMock = OCMClassMock([SDLLockScreenManager class]);
__block id fileManagerMock = OCMClassMock([SDLFileManager class]);
__block id permissionManagerMock = OCMClassMock([SDLPermissionManager class]);
__block id streamingManagerMock = OCMClassMock([SDLStreamingMediaManager class]);
__block id systemCapabilityMock = OCMClassMock([SDLSystemCapabilityManager class]);
-
+ __block id secondaryTransportManagerMock = OCMClassMock([SDLSecondaryTransportManager class]);
+
void (^transitionToState)(SDLState *) = ^(SDLState *state) {
dispatch_sync(testManager.lifecycleQueue, ^{
[testManager.lifecycleStateMachine transitionToState:state];
@@ -115,9 +120,6 @@ describe(@"a lifecycle manager", ^{
};
beforeEach(^{
- OCMStub([proxyMock iapProxyWithListener:[OCMArg any] secondaryTransportManager:[OCMArg any] encryptionLifecycleManager:[OCMArg any]]).andReturn(proxyMock);
- OCMStub([(SDLProxy*)proxyMock protocol]).andReturn(protocolMock);
-
SDLLifecycleConfiguration *testLifecycleConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:@"Test App" appId:@"Test Id"];
testLifecycleConfig.shortAppName = @"Short Name";
testLifecycleConfig.appType = SDLAppHMITypeNavigation;
@@ -125,12 +127,18 @@ describe(@"a lifecycle manager", ^{
testConfig = [SDLConfiguration configurationWithLifecycle:testLifecycleConfig lockScreen:[SDLLockScreenConfiguration disabledConfiguration] logging:[SDLLogConfiguration defaultConfiguration] streamingMedia:[SDLStreamingMediaConfiguration insecureConfiguration]];
testConfig.lifecycleConfig.languagesSupported = @[SDLLanguageEnUs, SDLLanguageEnGb];
testConfig.lifecycleConfig.language = SDLLanguageEnUs;
+ testConfig.lifecycleConfig.minimumProtocolVersion = [SDLVersion versionWithMajor:2 minor:0 patch:0];
+ testConfig.lifecycleConfig.minimumRPCVersion = [SDLVersion versionWithMajor:2 minor:0 patch:0];
testManager = [[SDLLifecycleManager alloc] initWithConfiguration:testConfig delegate:OCMProtocolMock(@protocol(SDLManagerDelegate))];
testManager.lockScreenManager = lockScreenManagerMock;
testManager.fileManager = fileManagerMock;
testManager.permissionManager = permissionManagerMock;
testManager.streamManager = streamingManagerMock;
testManager.systemCapabilityManager = systemCapabilityMock;
+ testManager.secondaryTransportManager = secondaryTransportManagerMock;
+
+ [SDLGlobals sharedGlobals].protocolVersion = [SDLVersion versionWithMajor:3 minor:0 patch:0];
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:3 minor:0 patch:0];
});
it(@"should initialize properties", ^{
@@ -141,7 +149,6 @@ describe(@"a lifecycle manager", ^{
expect(testManager.fileManager).toNot(beNil());
expect(testManager.permissionManager).toNot(beNil());
expect(testManager.streamManager).toNot(beNil());
- expect(testManager.proxy).to(beNil());
expect(testManager.registerResponse).to(beNil());
expect(testManager.lockScreenManager).toNot(beNil());
expect(testManager.notificationDispatcher).toNot(beNil());
@@ -227,31 +234,27 @@ describe(@"a lifecycle manager", ^{
readyHandlerSuccess = success;
readyHandlerError = error;
}];
+
+ testManager.protocolHandler.protocol = protocolMock;
});
- it(@"should initialize the proxy property", ^{
- expect(testManager.proxy).toNot(beNil());
+ it(@"should initialize enter the started state and start the secondary transport", ^{
expect(testManager.lifecycleState).to(match(SDLLifecycleStateStarted));
- });
- it(@"should initialize secondary transport manager if not in tcpDebugMode", ^{
- if (!testManager.configuration.lifecycleConfig.tcpDebugMode) {
- expect(testManager.secondaryTransportManager).toNot(beNil());
- }
+ expect(testManager.secondaryTransportManager).toNot(beNil());
});
describe(@"after receiving a connect notification", ^{
beforeEach(^{
// When we connect, we should be creating an sending an RAI
- OCMExpect([proxyMock sendRPC:[OCMArg isKindOfClass:[SDLRegisterAppInterface class]]]);
+ OCMExpect([protocolMock sendRPC:[OCMArg isKindOfClass:[SDLRegisterAppInterface class]]]);
- [testManager.notificationDispatcher postNotificationName:SDLTransportDidConnect infoObject:nil];
- [NSThread sleepForTimeInterval:0.1];
+ [testManager.notificationDispatcher postNotificationName:SDLRPCServiceDidConnect infoObject:nil];
});
it(@"should send a register app interface request and be in the connected state", ^{
- OCMVerifyAllWithDelay(proxyMock, 0.5);
- expect(testManager.lifecycleState).to(match(SDLLifecycleStateConnected));
+ OCMVerifyAllWithDelay(protocolMock, 1.0);
+ expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateConnected));
});
itBehavesLike(@"unable to send an RPC", ^{ return @{ @"manager": testManager }; });
@@ -263,7 +266,7 @@ describe(@"a lifecycle manager", ^{
});
it(@"should be in the started state", ^{
- expect(testManager.lifecycleState).to(match(SDLLifecycleStateReconnecting));
+ expect(testManager.lifecycleState).to(equal(SDLLifecycleStateReconnecting));
});
});
@@ -271,16 +274,15 @@ describe(@"a lifecycle manager", ^{
it(@"should simply stop", ^{
[testManager stop];
- expect(testManager.lifecycleState).toEventually(match(SDLLifecycleStateStopped));
+ expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateStopped));
});
});
});
describe(@"in the connected state when the minimum protocol version is in effect", ^{
beforeEach(^{
- SDLVersion *oldVersion = [SDLVersion versionWithMajor:0 minor:0 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock protocolVersion]).andReturn(oldVersion);
+ [SDLGlobals sharedGlobals].protocolVersion = [SDLVersion versionWithMajor:1 minor:0 patch:0];
+
OCMExpect([protocolMock endServiceWithType:SDLServiceTypeRPC]);
[testManager.lifecycleStateMachine setToState:SDLLifecycleStateConnected fromOldState:nil callEnterTransition:YES];
});
@@ -304,7 +306,7 @@ describe(@"a lifecycle manager", ^{
OCMStub([fileManagerMock startWithCompletionHandler:([OCMArg invokeBlockWithArgs:@(YES), fileManagerStartError, nil])]);
OCMStub([permissionManagerMock startWithCompletionHandler:([OCMArg invokeBlockWithArgs:@(YES), permissionManagerStartError, nil])]);
if (testConfig.lifecycleConfig.tcpDebugMode) {
- OCMStub([streamingManagerMock startSecondaryTransportWithProtocol:proxyMock]);
+ OCMStub([streamingManagerMock startSecondaryTransportWithProtocol:protocolMock]);
}
// Send an RAI response & make sure we have an HMI status to move the lifecycle forward
@@ -328,11 +330,14 @@ describe(@"a lifecycle manager", ^{
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(match(SDLLifecycleStateStarted));
+ expect(testManager.lifecycleState).toEventually(equal(SDLLifecycleStateStarted));
});
});
@@ -342,16 +347,14 @@ describe(@"a lifecycle manager", ^{
});
it(@"should enter the stopped state", ^{
- expect(testManager.lifecycleState).to(match(SDLLifecycleStateStopped));
+ expect(testManager.lifecycleState).to(equal(SDLLifecycleStateStopped));
});
});
});
describe(@"transitioning to the registered state when the minimum RPC version is in effect", ^{
beforeEach(^{
- SDLVersion *oldVersion = [SDLVersion versionWithMajor:0 minor:0 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:1 minor:0 patch:0];
[testManager.lifecycleStateMachine setToState:SDLLifecycleStateRegistered fromOldState:nil callEnterTransition:YES];
});
@@ -572,33 +575,30 @@ describe(@"a lifecycle manager", ^{
it(@"can send an RPC of type Request", ^{
SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil alignment:nil];
+ OCMExpect([protocolMock sendRPC:testShow]);
[testManager sendRPC:testShow];
- [NSThread sleepForTimeInterval:0.1];
-
- OCMVerify([proxyMock sendRPC:[OCMArg isKindOfClass:SDLShow.class]]);
+ OCMVerifyAllWithDelay(protocolMock, 0.1);
});
it(@"can send an RPC of type Response", ^{
SDLPerformAppServiceInteractionResponse *testResponse = [[SDLPerformAppServiceInteractionResponse alloc] init];
+ OCMExpect([protocolMock sendRPC:testResponse]);
[testManager sendRPC:testResponse];
testResponse.correlationID = @(2);
testResponse.success = @(true);
testResponse.resultCode = SDLResultSuccess;
testResponse.info = @"testResponse info";
- [NSThread sleepForTimeInterval:0.1];
-
- OCMVerify([proxyMock sendRPC:[OCMArg isKindOfClass:SDLPerformAppServiceInteractionResponse.class]]);
+ OCMVerifyAllWithDelay(protocolMock, 0.1);
});
it(@"can send an RPC of type Notification", ^{
SDLOnAppServiceData *testNotification = [[SDLOnAppServiceData alloc] initWithServiceData:[[SDLAppServiceData alloc] init]];
+ OCMExpect([protocolMock sendRPC:testNotification]);
[testManager sendRPC:testNotification];
- [NSThread sleepForTimeInterval:0.1];
-
- OCMVerify([proxyMock sendRPC:[OCMArg isKindOfClass:SDLOnAppServiceData.class]]);
+ OCMVerifyAllWithDelay(protocolMock, 0.1);
});
it(@"should throw an exception if the RPC is not of type `Request`, `Response` or `Notification`", ^{
@@ -639,7 +639,7 @@ describe(@"a lifecycle manager", ^{
});
it(@"should attempt to unregister", ^{
- OCMVerify([proxyMock sendRPC:[OCMArg isKindOfClass:[SDLUnregisterAppInterface class]]]);
+ OCMVerify([protocolMock sendRPC:[OCMArg isKindOfClass:[SDLUnregisterAppInterface class]]]);
expect(testManager.lifecycleState).toEventually(match(SDLLifecycleStateUnregistering));
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m
new file mode 100644
index 000000000..f2ff80c99
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m
@@ -0,0 +1,88 @@
+//
+// SDLLifecycleMobileHMIStateHandler.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 6/24/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLLifecycleMobileHMIStateHandler.h"
+#import "SDLNotificationConstants.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLRPCResponseNotification.h"
+#import "SDLMsgVersion.h"
+
+#import "TestConnectionManager.h"
+
+QuickSpecBegin(SDLLifecycleMobileHMIStateHandlerSpec)
+
+describe(@"SDLLifecycleMobileHMIStateHandler tests", ^{
+ __block TestConnectionManager *mockConnectionManager = nil;
+ __block SDLLifecycleMobileHMIStateHandler *testManager = nil;
+
+ beforeEach(^{
+ mockConnectionManager = [[TestConnectionManager alloc] init];
+ testManager = [[SDLLifecycleMobileHMIStateHandler alloc] initWithConnectionManager:mockConnectionManager];
+ });
+
+ context(@"before a RAIR", ^{
+ it(@"should do nothing if the app changes foreground states", ^{
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
+
+ expect(mockConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+
+ context(@"after a RAIR", ^{
+ context(@"with msg version < 4", ^{
+ beforeEach(^{
+ SDLRegisterAppInterfaceResponse *rair = [[SDLRegisterAppInterfaceResponse alloc] init];
+ rair.sdlMsgVersion = [[SDLMsgVersion alloc] initWithMajorVersion:3 minorVersion:0 patchVersion:0];
+
+ SDLRPCResponseNotification *responseNotification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:nil rpcResponse:rair];
+ [[NSNotificationCenter defaultCenter] postNotification:responseNotification];
+ });
+
+ it(@"should do nothing if the app changes foreground states", ^{
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
+
+ expect(mockConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+
+ context(@"with msg version >= 4", ^{
+ beforeEach(^{
+ SDLRegisterAppInterfaceResponse *rair = [[SDLRegisterAppInterfaceResponse alloc] init];
+ rair.sdlMsgVersion = [[SDLMsgVersion alloc] initWithMajorVersion:5 minorVersion:0 patchVersion:0];
+
+ SDLRPCResponseNotification *responseNotification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:nil rpcResponse:rair];
+ [[NSNotificationCenter defaultCenter] postNotification:responseNotification];
+ });
+
+ it(@"should send an OnHMIStatus as well as another if the app changes foreground states", ^{
+ expect(mockConnectionManager.receivedRequests).to(haveCount(1));
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
+ expect(mockConnectionManager.receivedRequests).to(haveCount(2));
+ });
+
+ describe(@"after the manager is stopped", ^{
+ beforeEach(^{
+ [mockConnectionManager.receivedRequests removeAllObjects];
+ [testManager stop];
+ });
+
+ it(@"should do nothing if the app changes foreground states", ^{
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
+
+ expect(mockConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m
new file mode 100644
index 000000000..681ec9cc5
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleProtocolHandlerSpec.m
@@ -0,0 +1,233 @@
+//
+// SDLLifecycleProtocolHandler.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 6/25/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLConfiguration.h"
+#import "SDLFunctionID.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLifecycleProtocolHandler.h"
+#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLProtocol.h"
+#import "SDLProtocolDelegate.h"
+#import "SDLProtocolHeader.h"
+#import "SDLProtocolMessage.h"
+#import "SDLRPCPayload.h"
+#import "SDLShow.h"
+#import "SDLTimer.h"
+
+@interface SDLLifecycleProtocolHandler ()
+
+@property (weak, nonatomic) SDLNotificationDispatcher *notificationDispatcher;
+@property (strong, nonatomic) SDLTimer *rpcStartServiceTimeoutTimer;
+@property (copy, nonatomic) NSString *appId;
+
+@end
+
+QuickSpecBegin(SDLLifecycleProtocolHandlerSpec)
+
+describe(@"SDLLifecycleProtocolHandler tests", ^{
+ __block SDLLifecycleProtocolHandler *testHandler = nil;
+ __block id mockProtocol = nil;
+ __block id mockNotificationDispatcher = nil;
+ __block id mockTimer = nil;
+
+ beforeEach(^{
+ mockProtocol = OCMClassMock([SDLProtocol class]);
+ mockNotificationDispatcher = OCMClassMock([SDLNotificationDispatcher class]);
+ mockTimer = OCMClassMock([SDLTimer class]);
+
+ SDLLifecycleConfiguration *testLifecycleConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:@"test" fullAppId:@"appid"];
+ SDLConfiguration *testConfig = [[SDLConfiguration alloc] initWithLifecycle:testLifecycleConfig lockScreen:nil logging:nil fileManager:nil encryption:nil];
+
+ testHandler = [[SDLLifecycleProtocolHandler alloc] initWithProtocol:mockProtocol notificationDispatcher:mockNotificationDispatcher configuration:testConfig];
+ testHandler.rpcStartServiceTimeoutTimer = mockTimer;
+ });
+
+ describe(@"when started", ^{
+ beforeEach(^{
+ OCMExpect([(SDLProtocol *)mockProtocol start]);
+ [testHandler start];
+ });
+
+ it(@"should start the protocol", ^{
+ OCMVerifyAll(mockProtocol);
+ });
+ });
+
+ describe(@"when stopped", ^{
+ beforeEach(^{
+ OCMExpect([(SDLProtocol *)mockProtocol stopWithCompletionHandler:[OCMArg any]]);
+ [testHandler stopWithCompletionHandler:^{}];
+ });
+
+ it(@"should stop the protocol", ^{
+ OCMVerifyAll(mockProtocol);
+ });
+ });
+
+ describe(@"when the protocol notifies us", ^{
+ context(@"of the transport opening", ^{
+ beforeEach(^{
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLTransportDidConnect] infoObject:[OCMArg isNil]]);
+ OCMExpect([mockProtocol startServiceWithType:0 payload:[OCMArg any]]).ignoringNonObjectArgs();
+ OCMExpect([(SDLTimer *)mockTimer start]);
+ [testHandler protocolDidOpen:mockProtocol];
+ });
+
+ it(@"should set everything up", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ OCMVerifyAll(mockProtocol);
+ OCMVerifyAll(mockTimer);
+ });
+ });
+
+ context(@"of the transport closing", ^{
+ beforeEach(^{
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLTransportDidDisconnect] infoObject:[OCMArg isNil]]);
+ [testHandler protocolDidClose:mockProtocol];
+ });
+
+ it(@"should send a notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ });
+ });
+
+ context(@"of the transport erroring", ^{
+ beforeEach(^{
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLTransportConnectError] infoObject:[OCMArg isNotNil]]);
+ [testHandler protocol:mockProtocol transportDidError:[NSError errorWithDomain:@"test" code:1 userInfo:nil]];
+ });
+
+ it(@"should send a notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ });
+ });
+
+ context(@"of an RPC Start Service ACK", ^{
+ beforeEach(^{
+ SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:4];
+ header.serviceType = SDLServiceTypeRPC;
+ header.frameData = SDLFrameInfoStartServiceACK;
+ SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil];
+
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLRPCServiceDidConnect] infoObject:[OCMArg isNil]]);
+ OCMExpect([(SDLTimer *)mockTimer cancel]);
+
+ [testHandler protocol:mockProtocol didReceiveStartServiceACK:message];
+ });
+
+ it(@"should stop the timer and send a notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ OCMVerifyAll(mockTimer);
+ });
+ });
+
+ context(@"of an RPC Start Service NAK", ^{
+ beforeEach(^{
+ SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:4];
+ header.serviceType = SDLServiceTypeRPC;
+ header.frameData = SDLFrameInfoStartServiceNACK;
+ SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil];
+
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLRPCServiceConnectionDidError] infoObject:[OCMArg isNil]]);
+ OCMExpect([(SDLTimer *)mockTimer cancel]);
+
+ [testHandler protocol:mockProtocol didReceiveStartServiceNAK:message];
+ });
+
+ it(@"should stop the timer and send a notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ OCMVerifyAll(mockTimer);
+ });
+ });
+
+ context(@"no response from the module to the RPC Start Service", ^{
+ beforeEach(^{
+ testHandler.rpcStartServiceTimeoutTimer = nil;
+ });
+
+ it(@"should send a transport disconnected notification when the timer elapses", ^{
+ OCMExpect([mockProtocol stopWithCompletionHandler:[OCMArg any]]);
+
+ [testHandler protocolDidOpen:mockProtocol];
+
+ OCMVerifyAllWithDelay(mockProtocol, 11.0);
+ });
+ });
+
+ context(@"of an RPC End Service ACK", ^{
+ beforeEach(^{
+ SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:4];
+ header.serviceType = SDLServiceTypeRPC;
+ header.frameData = SDLFrameInfoEndServiceACK;
+ SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil];
+
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLRPCServiceDidDisconnect] infoObject:[OCMArg isNil]]);
+ OCMExpect([(SDLTimer *)mockTimer cancel]);
+
+ [testHandler protocol:mockProtocol didReceiveEndServiceACK:message];
+ });
+
+ it(@"should stop the timer and send a notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ OCMVerifyAll(mockTimer);
+ });
+ });
+
+ context(@"of an RPC End Service NAK", ^{
+ beforeEach(^{
+ SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:4];
+ header.serviceType = SDLServiceTypeRPC;
+ header.frameData = SDLFrameInfoEndServiceNACK;
+ SDLProtocolMessage *message = [SDLProtocolMessage messageWithHeader:header andPayload:nil];
+
+ OCMExpect([mockNotificationDispatcher postNotificationName:[OCMArg isEqual:SDLRPCServiceConnectionDidError] infoObject:[OCMArg any]]);
+
+ [testHandler protocol:mockProtocol didReceiveEndServiceNAK:message];
+ });
+
+ it(@"should send a RPC service connection error notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ });
+ });
+
+ context(@"of a protocol message", ^{
+ beforeEach(^{
+ SDLShow *showRPC = [[SDLShow alloc] initWithMainField1:@"Test1" mainField2:@"Test2" alignment:SDLTextAlignmentLeft];
+
+ SDLProtocolHeader *header = [SDLProtocolHeader headerForVersion:4];
+ header.serviceType = SDLServiceTypeRPC;
+ header.frameData = SDLFrameInfoSingleFrame;
+
+ NSDictionary *dict = [showRPC serializeAsDictionary:4];
+ NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:nil];
+ SDLRPCPayload *messagePayload = [[SDLRPCPayload alloc] init];
+ messagePayload.jsonData = data;
+ messagePayload.rpcType = SDLRPCMessageTypeRequest;
+ messagePayload.correlationID = 1;
+ messagePayload.functionID = [[SDLFunctionID sharedInstance] functionIdForName:SDLRPCFunctionNameShow].unsignedIntValue;
+
+ SDLProtocolMessage *testMessage = [SDLProtocolMessage messageWithHeader:header andPayload:messagePayload.data];
+
+ OCMExpect([mockNotificationDispatcher postRPCRequestNotification:[OCMArg isEqual:SDLDidReceiveShowRequest] request:[OCMArg isNotNil]]);
+
+ [testHandler protocol:mockProtocol didReceiveMessage:testMessage];
+ });
+
+ it(@"should send the notification", ^{
+ OCMVerifyAll(mockNotificationDispatcher);
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleRPCAdapterSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleRPCAdapterSpec.m
new file mode 100644
index 000000000..e589c2a71
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleRPCAdapterSpec.m
@@ -0,0 +1,306 @@
+//
+// SDLLifecycleRPCAdapterSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 6/23/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLGlobals.h"
+#import "SDLLifecycleRPCAdapter.h"
+#import "SDLOnButtonEvent.h"
+#import "SDLOnButtonPress.h"
+#import "SDLShow.h"
+#import "SDLSubscribeButton.h"
+#import "SDLUnsubscribeButton.h"
+#import "SDLVersion.h"
+
+QuickSpecBegin(SDLLifecycleRPCAdapterSpec)
+
+describe(@"the lifecycle RPC adapter", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:1 minor:0 patch:0];
+ });
+
+ describe(@"adapt subscribe button request", ^{
+ __block SDLSubscribeButton *testRPC = nil;
+ beforeEach(^{
+ testRPC = [[SDLSubscribeButton alloc] init];
+
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:1 minor:0 patch:0];
+ });
+
+ context(@"before RPC v5.0", ^{
+ context(@"if the button name is PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should change it to an OK message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(1));
+ expect(((SDLSubscribeButton *)result[0]).buttonName).to(equal(SDLButtonNameOk));
+ });
+ });
+
+ context(@"if the button name is not PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should not do anything to the message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(1));
+ });
+ });
+ });
+
+ context(@"after or equal to RPC v5.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ });
+
+ context(@"if the button name is OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should create an additional PlayPause message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLSubscribeButton *)result[1]).buttonName).to(equal(SDLButtonNamePlayPause));
+ });
+ });
+
+ context(@"if the button name is not OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should not do anything to the message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(1));
+ });
+ });
+ });
+ });
+
+ describe(@"adapt unsubscribe button request", ^{
+ __block SDLUnsubscribeButton *testRPC = nil;
+ beforeEach(^{
+ testRPC = [[SDLUnsubscribeButton alloc] init];
+ });
+
+ context(@"before RPC v5.0", ^{
+ context(@"if the button name is PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should change it to an OK message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(1));
+ expect(((SDLUnsubscribeButton *)result[0]).buttonName).to(equal(SDLButtonNameOk));
+ });
+ });
+
+ context(@"if the button name is not PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should not do anything to the message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(1));
+ });
+ });
+ });
+
+ context(@"after or equal to RPC v5.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ });
+
+ context(@"if the button name is OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should create an additional PlayPause message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLUnsubscribeButton *)result[1]).buttonName).to(equal(SDLButtonNamePlayPause));
+ });
+ });
+
+ context(@"if the button name is not OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should not do anything to the message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionOutgoing];
+
+ expect(result).to(haveCount(1));
+ });
+ });
+ });
+ });
+
+ describe(@"adapt onButtonPress notification", ^{
+ __block SDLOnButtonPress *testRPC = nil;
+ beforeEach(^{
+ testRPC = [[SDLOnButtonPress alloc] init];
+ });
+
+ context(@"before RPC v5.0", ^{
+ context(@"if the button name is PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should drop the message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(beEmpty());
+ });
+ });
+
+ context(@"if the button name is OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should create an additional play-pause message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLOnButtonPress *)result[1]).buttonName).to(equal(SDLButtonNamePlayPause));
+ });
+ });
+ });
+
+ context(@"after or equal to RPC v5.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ });
+
+ context(@"if the button name is OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should create an additional PlayPause message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLOnButtonPress *)result[1]).buttonName).to(equal(SDLButtonNamePlayPause));
+ });
+ });
+
+ context(@"if the button name is PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should create an additional OK message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLOnButtonPress *)result[1]).buttonName).to(equal(SDLButtonNameOk));
+ });
+ });
+ });
+ });
+
+ describe(@"adapt onButtonEvent notification", ^{
+ __block SDLOnButtonEvent *testRPC = nil;
+ beforeEach(^{
+ testRPC = [[SDLOnButtonEvent alloc] init];
+ });
+
+ context(@"before RPC v5.0", ^{
+ context(@"if the button name is PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should drop the message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(beEmpty());
+ });
+ });
+
+ context(@"if the button name is OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should create an additional play-pause message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLOnButtonEvent *)result[1]).buttonName).to(equal(SDLButtonNamePlayPause));
+ });
+ });
+ });
+
+ context(@"after or equal to RPC v5.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ });
+
+ context(@"if the button name is OK", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNameOk;
+ });
+
+ it(@"should create an additional PlayPause message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLOnButtonEvent *)result[1]).buttonName).to(equal(SDLButtonNamePlayPause));
+ });
+ });
+
+ context(@"if the button name is PlayPause", ^{
+ beforeEach(^{
+ testRPC.buttonName = SDLButtonNamePlayPause;
+ });
+
+ it(@"should create an additional OK message", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(2));
+ expect(((SDLOnButtonEvent *)result[1]).buttonName).to(equal(SDLButtonNameOk));
+ });
+ });
+ });
+ });
+
+ describe(@"an RPC that is not handled", ^{
+ __block SDLShow *testRPC = nil;
+ beforeEach(^{
+ testRPC = [[SDLShow alloc] init];
+ });
+
+ it(@"should not do anything to the RPC", ^{
+ NSArray<SDLRPCMessage *> *result = [SDLLifecycleRPCAdapter adaptRPC:testRPC direction:SDLRPCDirectionIncoming];
+
+ expect(result).to(haveCount(1));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSyncPDataHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSyncPDataHandlerSpec.m
new file mode 100644
index 000000000..9c38944b2
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSyncPDataHandlerSpec.m
@@ -0,0 +1,78 @@
+//
+// SDLLifecycleSyncPDataHandler.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 6/24/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLEncodedSyncPData.h"
+#import "SDLLifecycleSyncPDataHandler.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnEncodedSyncPData.h"
+#import "SDLRPCNotificationNotification.h"
+
+#import "TestConnectionManager.h"
+
+@interface SDLLifecycleSyncPDataHandler ()
+
+@property (strong, nonatomic) NSURLSession *urlSession;
+
+@end
+
+QuickSpecBegin(SDLLifecycleSyncPDataHandlerSpec)
+
+describe(@"Test SDLLifecycleSyncPDataHandler", ^{
+ __block SDLLifecycleSyncPDataHandler *testHandler = nil;
+ __block TestConnectionManager *mockConnectionManager = nil;
+ __block NSURLSession *mockSession = nil;
+
+ beforeEach(^{
+ mockSession = OCMClassMock([NSURLSession class]);
+
+ NSData *receivedData = [NSJSONSerialization dataWithJSONObject:@{@"data": @[@"1234"]} options:kNilOptions error:nil];
+ OCMStub([mockSession uploadTaskWithRequest:[OCMArg any] fromData:[OCMArg any] completionHandler:([OCMArg invokeBlockWithArgs:receivedData, [[NSURLResponse alloc] init], [NSNull null], nil])]);
+
+ mockConnectionManager = [[TestConnectionManager alloc] init];
+ testHandler = [[SDLLifecycleSyncPDataHandler alloc] initWithConnectionManager:mockConnectionManager];
+ testHandler.urlSession = mockSession;
+ });
+
+ describe(@"when a OnEncodedSyncPData request comes in", ^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ __block SDLOnEncodedSyncPData *testRPC = nil;
+#pragma clang diagnostic pop
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testRPC = [[SDLOnEncodedSyncPData alloc] init];
+#pragma clang diagnostic pop
+ testRPC.URL = @"https://www.google.com";
+ testRPC.Timeout = @(30);
+ testRPC.data = @[@"1234/5678"];
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveEncodedDataNotification object:nil rpcNotification:testRPC];
+#pragma clang diagnostic pop
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should send a EncodedSyncPData request", ^{
+ expect(mockConnectionManager.receivedRequests).to(haveCount(1));
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLEncodedSyncPData *sentRequest = mockConnectionManager.receivedRequests[0];
+#pragma clang diagnostic pop
+ expect(sentRequest.data).to(equal(@[@"1234"]));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m
new file mode 100644
index 000000000..01211e324
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleSystemRequestHandlerSpec.m
@@ -0,0 +1,235 @@
+//
+// SDLLifecycleSystemRequestHandlerSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 6/24/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLCacheFileManager.h"
+#import "SDLFileType.h"
+#import "SDLLifecycleSystemRequestHandler.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnSystemRequest.h"
+#import "SDLPutFile.h"
+#import "SDLRequestType.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLSystemRequest.h"
+
+#import "TestConnectionManager.h"
+
+@interface SDLLifecycleSystemRequestHandler ()
+
+@property (strong, nonatomic) SDLCacheFileManager *cacheFileManager;
+@property (strong, nonatomic) NSURLSession *urlSession;
+
+@end
+
+QuickSpecBegin(SDLLifecycleSystemRequestHandlerSpec)
+
+describe(@"SDLLifecycleSystemRequestHandler tests", ^{
+ __block TestConnectionManager *mockConnectionManager = nil;
+ __block SDLLifecycleSystemRequestHandler *testManager = nil;
+ __block id mockSession = nil;
+ __block id mockCacheManager = nil;
+
+ beforeEach(^{
+ mockCacheManager = OCMClassMock([SDLCacheFileManager class]);
+ mockSession = OCMClassMock([NSURLSession class]);
+
+ mockConnectionManager = [[TestConnectionManager alloc] init];
+
+ testManager = [[SDLLifecycleSystemRequestHandler alloc] initWithConnectionManager:mockConnectionManager];
+ testManager.urlSession = mockSession;
+ testManager.cacheFileManager = mockCacheManager;
+ });
+
+ describe(@"when receiving an OnSystemRequest", ^{
+ __block SDLOnSystemRequest *receivedSystemRequest = nil;
+ beforeEach(^{
+ receivedSystemRequest = [[SDLOnSystemRequest alloc] init];
+ });
+
+ context(@"of type PROPRIETARY", ^{
+ __block NSData *urlReceivedData = nil;
+
+ beforeEach(^{
+ receivedSystemRequest.requestType = SDLRequestTypeProprietary;
+ receivedSystemRequest.url = @"https://www.google.com";
+ receivedSystemRequest.fileType = SDLFileTypeJSON;
+
+ urlReceivedData = [@"5678" dataUsingEncoding:NSASCIIStringEncoding];
+ receivedSystemRequest.bulkData = [NSJSONSerialization dataWithJSONObject:@{@"data": @"1234"} options:kNilOptions error:nil];
+
+ OCMStub([mockSession uploadTaskWithRequest:[OCMArg any] fromData:[OCMArg any] completionHandler:([OCMArg invokeBlockWithArgs:urlReceivedData, [[NSURLResponse alloc] init], [NSNull null], nil])]).andReturn(nil);
+ });
+
+ context(@"when the file type is not JSON", ^{
+ beforeEach(^{
+ receivedSystemRequest.fileType = SDLFileTypeBMP;
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should not send a SystemRequest", ^{
+ expect(mockConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+
+ context(@"when the url is nil", ^{
+ beforeEach(^{
+ receivedSystemRequest.url = nil;
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should not send a SystemRequest", ^{
+ expect(mockConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+
+ context(@"when the bulkdata is not JSON", ^{
+ beforeEach(^{
+ receivedSystemRequest.bulkData = [@"1234" dataUsingEncoding:NSASCIIStringEncoding];
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should not send a SystemRequest", ^{
+ expect(mockConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+
+ context(@"when formed correctly", ^{
+ beforeEach(^{
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should send a SystemRequest", ^{
+ expect(mockConnectionManager.receivedRequests).to(haveCount(1));
+ expect(mockConnectionManager.receivedRequests[0]).to(beAnInstanceOf([SDLSystemRequest class]));
+ expect(((SDLSystemRequest *)mockConnectionManager.receivedRequests[0]).requestType).to(equal(SDLRequestTypeProprietary));
+ expect(((SDLSystemRequest *)mockConnectionManager.receivedRequests[0]).bulkData).to(equal([@"5678" dataUsingEncoding:NSASCIIStringEncoding]));
+ });
+ });
+ });
+
+ context(@"of type LOCK_SCREEN_URL", ^{
+ __block id lockScreenIconObserver = nil;
+
+ beforeEach(^{
+ receivedSystemRequest.requestType = SDLRequestTypeLockScreenIconURL;
+
+ 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]];
+
+ 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);
+ });
+
+ afterEach(^{
+ lockScreenIconObserver = nil;
+ });
+ });
+
+ context(@"of type ICON_URL", ^{
+ beforeEach(^{
+ receivedSystemRequest.requestType = SDLRequestTypeIconURL;
+ receivedSystemRequest.url = @"https://www.google.com";
+
+ NSData *data = [@"1234" dataUsingEncoding:NSASCIIStringEncoding];
+ OCMStub([mockSession dataTaskWithURL:[OCMArg any] completionHandler:([OCMArg invokeBlockWithArgs:data, [NSURLResponse new], [NSNull null], nil])]);
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should send a SystemRequest", ^{
+ expect(mockConnectionManager.receivedRequests).to(haveCount(1));
+ expect(mockConnectionManager.receivedRequests[0]).to(beAnInstanceOf([SDLSystemRequest class]));
+ });
+ });
+
+ context(@"of type HTTP", ^{
+ __block NSData *urlReceivedData = nil;
+
+ beforeEach(^{
+ receivedSystemRequest.requestType = SDLRequestTypeHTTP;
+ receivedSystemRequest.url = @"https://www.google.com";
+ receivedSystemRequest.bulkData = [@"1234" dataUsingEncoding:NSASCIIStringEncoding];
+
+ urlReceivedData = [NSJSONSerialization dataWithJSONObject:@{@"data": @[@"1234"]} options:kNilOptions error:nil];
+ OCMStub([mockSession uploadTaskWithRequest:[OCMArg any] fromData:[OCMArg any] completionHandler:([OCMArg invokeBlockWithArgs:urlReceivedData, [[NSURLResponse alloc] init], [NSNull null], nil])]).andReturn(nil);
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should send a PutFile after receiving a response", ^{
+ expect(mockConnectionManager.receivedRequests).to(haveCount(1));
+
+ SDLPutFile *putFile = mockConnectionManager.receivedRequests[0];
+ expect(putFile.fileType).to(equal(SDLFileTypeJSON));
+ expect(putFile.sdlFileName).to(equal(@"response_data"));
+ expect(putFile.bulkData).to(equal(urlReceivedData));
+ });
+ });
+
+ context(@"of type LAUNCH_APP", ^{
+ __block id mockedApplication = nil;
+
+ beforeEach(^{
+ receivedSystemRequest.requestType = SDLRequestTypeLaunchApp;
+ receivedSystemRequest.url = @"myApp://";
+
+ mockedApplication = OCMClassMock([UIApplication class]);
+ OCMStub([mockedApplication sharedApplication]).andReturn(mockedApplication);
+ OCMExpect([mockedApplication openURL:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [((NSURL *)obj).absoluteString isEqualToString:@"myApp://"];
+ }]]);
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should have attempted to open the URL", ^{
+ OCMVerifyAllWithDelay(mockedApplication, 0.5);
+ });
+
+ afterEach(^{
+ [mockedApplication stopMocking];
+ });
+ });
+
+ context(@"of another type", ^{
+ beforeEach(^{
+ receivedSystemRequest.requestType = SDLRequestTypeFOTA;
+
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemRequestNotification object:nil rpcNotification:receivedSystemRequest];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should do nothing", ^{
+ OCMReject([mockSession uploadTaskWithRequest:[OCMArg any] fromData:[OCMArg any] completionHandler:[OCMArg any]]).andReturn(nil);
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m
index 0c5078028..7357b9e9f 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m
@@ -6,6 +6,7 @@
#import "SDLLockScreenConfiguration.h"
#import "SDLLockScreenManager.h"
#import "SDLLockScreenStatus.h"
+#import "SDLLockScreenStatusManager.h"
#import "SDLLockScreenViewController.h"
#import "SDLNotificationConstants.h"
#import "SDLNotificationDispatcher.h"
@@ -18,6 +19,7 @@
@property (assign, nonatomic) BOOL canPresent;
@property (strong, nonatomic, readwrite) SDLLockScreenConfiguration *config;
@property (strong, nonatomic) id<SDLViewControllerPresentable> presenter;
+@property (strong, nonatomic) SDLLockScreenStatusManager *statusManager;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -35,15 +37,16 @@ QuickSpecBegin(SDLLockScreenManagerSpec)
describe(@"a lock screen manager", ^{
__block SDLLockScreenManager *testManager = nil;
__block SDLFakeViewControllerPresenter *fakeViewControllerPresenter = nil;
- __block SDLNotificationDispatcher *testNotificationDispatcher = nil;
+ __block SDLNotificationDispatcher *dispatcherMock = nil;
beforeEach(^{
fakeViewControllerPresenter = [[SDLFakeViewControllerPresenter alloc] init];
+ dispatcherMock = OCMClassMock([SDLNotificationDispatcher class]);
});
context(@"with a disabled configuration", ^{
beforeEach(^{
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration disabledConfiguration] notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration disabledConfiguration] notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
});
it(@"should set properties correctly", ^{
@@ -70,7 +73,7 @@ describe(@"a lock screen manager", ^{
beforeEach(^{
testRequiredStatus = [[SDLOnLockScreenStatus alloc] init];
testRequiredStatus.lockScreenStatus = SDLLockScreenStatusRequired;
- [testNotificationDispatcher postNotificationName:SDLDidChangeLockScreenStatusNotification infoObject:testRequiredStatus];
+ [dispatcherMock postNotificationName:SDLDidChangeLockScreenStatusNotification infoObject:testRequiredStatus];
#pragma clang diagnostic pop
});
@@ -83,7 +86,7 @@ describe(@"a lock screen manager", ^{
context(@"with an enabled configuration", ^{
beforeEach(^{
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfiguration] notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfiguration] notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
});
it(@"should set properties correctly", ^{
@@ -114,7 +117,7 @@ describe(@"a lock screen manager", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testRequiredStatus = [[SDLOnLockScreenStatus alloc] init];
testRequiredStatus.lockScreenStatus = SDLLockScreenStatusRequired;
- SDLRPCNotificationNotification *testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:nil rpcNotification:testRequiredStatus];
+ SDLRPCNotificationNotification *testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:testManager.statusManager rpcNotification:testRequiredStatus];
#pragma clang diagnostic pop
[[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
});
@@ -134,7 +137,7 @@ describe(@"a lock screen manager", ^{
testDriverDistraction = [[SDLOnDriverDistraction alloc] init];
testDriverDistraction.lockScreenDismissalEnabled = @YES;
- testDriverDistractionNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeDriverDistractionStateNotification object:nil rpcNotification:testDriverDistraction];
+ testDriverDistractionNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeDriverDistractionStateNotification object:dispatcherMock rpcNotification:testDriverDistraction];
[[NSNotificationCenter defaultCenter] postNotification:testDriverDistractionNotification];
});
@@ -221,7 +224,7 @@ describe(@"a lock screen manager", ^{
it(@"should should set the vehicle icon on the default lockscreen if showDeviceLogo set to true", ^{
testsConfig.showDeviceLogo = YES;
fakeViewControllerPresenter.lockViewController = [[SDLLockScreenViewController alloc] init];
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testsConfig notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testsConfig notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
[[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveLockScreenIcon object:nil userInfo:@{ SDLNotificationUserInfoObject: testIcon }];
@@ -231,7 +234,7 @@ describe(@"a lock screen manager", ^{
it(@"should should not set the vehicle icon on the default lockscreen if showDeviceLogo set to false", ^{
testsConfig.showDeviceLogo = NO;
fakeViewControllerPresenter.lockViewController = [[SDLLockScreenViewController alloc] init];
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testsConfig notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testsConfig notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
[[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveLockScreenIcon object:nil userInfo:@{ SDLNotificationUserInfoObject: testIcon }];
@@ -242,7 +245,7 @@ describe(@"a lock screen manager", ^{
testsConfig.showDeviceLogo = YES;
UIViewController *customLockScreen = [[UIViewController alloc] init];
fakeViewControllerPresenter.lockViewController = customLockScreen;
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testsConfig notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testsConfig notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
[[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveLockScreenIcon object:nil userInfo:@{ SDLNotificationUserInfoObject: testIcon }];
@@ -258,7 +261,7 @@ describe(@"a lock screen manager", ^{
testColor = [UIColor blueColor];
testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil];
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:testImage backgroundColor:testColor] notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:testImage backgroundColor:testColor] notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
});
it(@"should set properties correctly", ^{
@@ -286,7 +289,7 @@ describe(@"a lock screen manager", ^{
beforeEach(^{
testViewController = [[UIViewController alloc] init];
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfigurationWithViewController:testViewController] notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfigurationWithViewController:testViewController] notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
});
it(@"should set properties correctly", ^{
@@ -313,7 +316,7 @@ describe(@"a lock screen manager", ^{
SDLLockScreenConfiguration *config = [SDLLockScreenConfiguration enabledConfiguration];
config.enableDismissGesture = NO;
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:config notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:config notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
[testManager start];
});
@@ -362,7 +365,7 @@ describe(@"a lock screen manager", ^{
SDLLockScreenConfiguration *config = [SDLLockScreenConfiguration enabledConfiguration];
config.displayMode = SDLLockScreenConfigurationDisplayModeAlways;
- testManager = [[SDLLockScreenManager alloc] initWithConfiguration:config notificationDispatcher:nil presenter:fakeViewControllerPresenter];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:config notificationDispatcher:dispatcherMock presenter:fakeViewControllerPresenter];
[testManager start];
});
@@ -371,7 +374,7 @@ describe(@"a lock screen manager", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testStatus.lockScreenStatus = SDLLockScreenStatusRequired;
- testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:nil rpcNotification:testStatus];
+ testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:testManager.statusManager rpcNotification:testStatus];
#pragma clang diagnostic pop
[[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
@@ -387,7 +390,7 @@ describe(@"a lock screen manager", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testStatus.lockScreenStatus = SDLLockScreenStatusOff;
- testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:nil rpcNotification:testStatus];
+ testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:testManager.statusManager rpcNotification:testStatus];
#pragma clang diagnostic pop
[[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
@@ -400,19 +403,12 @@ describe(@"a lock screen manager", ^{
});
describe(@"A lock screen status of OPTIONAL", ^{
- __block SDLLockScreenManager *testLockScreenManager = nil;
__block SDLLockScreenConfiguration *testLockScreenConfig = nil;
__block id mockViewControllerPresenter = nil;
__block SDLRPCNotificationNotification *testLockStatusNotification = nil;
beforeEach(^{
mockViewControllerPresenter = OCMClassMock([SDLFakeViewControllerPresenter class]);
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLOnLockScreenStatus *testOptionalStatus = [[SDLOnLockScreenStatus alloc] init];
- testOptionalStatus.lockScreenStatus = SDLLockScreenStatusOptional;
- testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:nil rpcNotification:testOptionalStatus];
-#pragma clang diagnostic pop
testLockScreenConfig = [SDLLockScreenConfiguration enabledConfiguration];
});
@@ -423,13 +419,20 @@ describe(@"a lock screen manager", ^{
testLockScreenConfig.showInOptionalState = true;
#pragma clang diagnostic pop
- testLockScreenManager = [[SDLLockScreenManager alloc] initWithConfiguration:testLockScreenConfig notificationDispatcher:nil presenter:mockViewControllerPresenter];
- testLockScreenManager.canPresent = YES;
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testLockScreenConfig notificationDispatcher:dispatcherMock presenter:mockViewControllerPresenter];
+ testManager.canPresent = YES;
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLOnLockScreenStatus *testOptionalStatus = [[SDLOnLockScreenStatus alloc] init];
+ testOptionalStatus.lockScreenStatus = SDLLockScreenStatusOptional;
+ testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:testManager.statusManager rpcNotification:testOptionalStatus];
+#pragma clang diagnostic pop
});
it(@"should present the lock screen if not already presented", ^{
OCMStub([mockViewControllerPresenter lockViewController]).andReturn([OCMArg any]);
- OCMExpect([mockViewControllerPresenter updateLockScreenToShow:YES withCompletionHandler:nil]);
+ OCMExpect([mockViewControllerPresenter updateLockScreenToShow:YES withCompletionHandler:[OCMArg any]]).ignoringNonObjectArgs();
[[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
@@ -444,13 +447,20 @@ describe(@"a lock screen manager", ^{
testLockScreenConfig.showInOptionalState = false;
#pragma clang diagnostic pop
- testLockScreenManager = [[SDLLockScreenManager alloc] initWithConfiguration:testLockScreenConfig notificationDispatcher:nil presenter:mockViewControllerPresenter];
- testLockScreenManager.canPresent = YES;
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:testLockScreenConfig notificationDispatcher:dispatcherMock presenter:mockViewControllerPresenter];
+ testManager.canPresent = YES;
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLOnLockScreenStatus *testOptionalStatus = [[SDLOnLockScreenStatus alloc] init];
+ testOptionalStatus.lockScreenStatus = SDLLockScreenStatusOptional;
+ testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:testManager.statusManager rpcNotification:testOptionalStatus];
+#pragma clang diagnostic pop
});
it(@"should dismiss the lock screen if already presented", ^{
OCMStub([mockViewControllerPresenter lockViewController]).andReturn([OCMArg any]);
- OCMExpect([mockViewControllerPresenter updateLockScreenToShow:NO withCompletionHandler:nil]);
+ OCMExpect([mockViewControllerPresenter updateLockScreenToShow:NO withCompletionHandler:[OCMArg any]]).ignoringNonObjectArgs();
[[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m
index be190c40d..757c6411b 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m
@@ -2,6 +2,7 @@
#import <Nimble/Nimble.h>
#import "SDLPermissionConstants.h"
+#import "SDLPermissionElement.h"
#import "SDLPermissionFilter.h"
QuickSpecBegin(SDLPermissionFilterSpec)
@@ -9,141 +10,148 @@ QuickSpecBegin(SDLPermissionFilterSpec)
describe(@"A filter", ^{
__block NSString *testRPCName1 = nil;
__block NSString *testRPCName2 = nil;
-
+ __block SDLPermissionElement *testPermissionElement1 = nil;
+ __block SDLPermissionElement *testPermissionElement2 = nil;
+
beforeEach(^{
testRPCName1 = @"testRPCName1";
testRPCName2 = @"testRPCName2";
+ testPermissionElement1 = [[SDLPermissionElement alloc] initWithRPCName:testRPCName1 parameterPermissions:nil];
+ testPermissionElement2 = [[SDLPermissionElement alloc] initWithRPCName:testRPCName2 parameterPermissions:nil];
});
-
+
describe(@"should initialize correctly", ^{
- __block NSArray<SDLPermissionRPCName> *testRPCNames = nil;
+ __block NSArray<SDLPermissionElement *> *testPermissionElements = nil;
__block SDLPermissionGroupType testGroupType = SDLPermissionGroupTypeAny;
__block SDLPermissionFilter *testFilter = nil;
-
+
__block NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *testObserverReturnChangedDict = nil;
-
+ __block NSDictionary<SDLPermissionRPCName, SDLRPCPermissionStatus *> *testRPCPermissionStatusReturnChangedDict = nil;
+
beforeEach(^{
- testRPCNames = @[testRPCName1, testRPCName2];
+ testPermissionElements = @[testPermissionElement1, testPermissionElement2];
testGroupType = SDLPermissionGroupTypeAny;
});
-
- context(@"using initWithRPCNames:changeType:observer:", ^{
- beforeEach(^{
- testFilter = [[SDLPermissionFilter alloc] initWithRPCNames:testRPCNames groupType:testGroupType observer:^(NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
- testObserverReturnChangedDict = changedDict;
- }];
- });
-
- it(@"should set the rpcNames array correctly", ^{
- expect(testFilter.rpcNames).to(equal(testRPCNames));
- });
-
- describe(@"it should set up the observer correctly", ^{
- __block NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> *testObserverChangedDict = nil;
- __block NSNumber<SDLBool> *testRPCName1Bool = nil;
- __block NSNumber<SDLBool> *testRPCName2Bool = nil;
- __block SDLPermissionGroupStatus testObserverGroupStatus = SDLPermissionGroupStatusUnknown;
-
+
+ context(@"using initWithRPCNames:changeType:permissionsHandler:rpcPermissionStatusHandler", ^{
+ context(@"using SDLPermissionsChangedHandler init", ^{
beforeEach(^{
- testRPCName1Bool = @YES;
- testRPCName2Bool = @NO;
- testObserverChangedDict = @{testRPCName1: testRPCName1Bool,
- testRPCName2: testRPCName2Bool};
- testObserverGroupStatus = SDLPermissionGroupStatusMixed;
-
- testFilter.handler(testObserverChangedDict, testObserverGroupStatus);
+ testFilter = [[SDLPermissionFilter alloc] initWithPermissions:testPermissionElements groupType:testGroupType permissionsHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ testObserverReturnChangedDict = change;
+ }];
});
-
- it(@"should call the changedDict correctly", ^{
- expect(testObserverReturnChangedDict).to(equal(testObserverChangedDict));
+
+ it(@"should set the rpcNames array correctly", ^{
+ expect([testFilter rpcNamesFromPermissionElements:testPermissionElements]).to(equal([testFilter rpcNamesFromPermissionElements:testPermissionElements]));
});
-
- it(@"should call the status correctly", ^{
- expect(@(testObserverGroupStatus)).to(equal(@(testObserverGroupStatus)));
+
+ describe(@"it should set up the observer correctly", ^{
+ __block NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> *testObserverChangedDict = nil;
+ __block NSNumber<SDLBool> *testRPCName1Bool = nil;
+ __block NSNumber<SDLBool> *testRPCName2Bool = nil;
+ __block SDLPermissionGroupStatus testObserverGroupStatus = SDLPermissionGroupStatusUnknown;
+
+ beforeEach(^{
+ testRPCName1Bool = @YES;
+ testRPCName2Bool = @NO;
+ testObserverChangedDict = @{testRPCName1: testRPCName1Bool,
+ testRPCName2: testRPCName2Bool};
+ testObserverGroupStatus = SDLPermissionGroupStatusMixed;
+
+ testFilter.handler(testObserverChangedDict, testObserverGroupStatus);
+ });
+
+ it(@"should call the changedDict correctly", ^{
+ expect(testObserverReturnChangedDict).to(equal(testObserverChangedDict));
+ });
+
+ it(@"should call the status correctly", ^{
+ expect(@(testObserverGroupStatus)).to(equal(@(testObserverGroupStatus)));
+ });
});
});
- });
-
- context(@"using filterWithRPCNames:changeType:observer:", ^{
- beforeEach(^{
- testFilter = [SDLPermissionFilter filterWithRPCNames:testRPCNames groupType:testGroupType observer:^(NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
- testObserverReturnChangedDict = changedDict;
- }];
- });
-
- it(@"should set the rpcNames array correctly", ^{
- expect(testFilter.rpcNames).to(equal(testRPCNames));
- });
-
- describe(@"it should set up the observer correctly", ^{
- __block NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> *testObserverChangedDict = nil;
- __block NSNumber<SDLBool> *testRPCName1Bool = nil;
- __block NSNumber<SDLBool> *testRPCName2Bool = nil;
- __block SDLPermissionGroupStatus testObserverGroupStatus = SDLPermissionGroupStatusUnknown;
-
+
+ context(@"using the SDLRPCPermissionStatusChangedHandler init", ^{
beforeEach(^{
- testRPCName1Bool = @YES;
- testRPCName2Bool = @NO;
- testObserverChangedDict = @{testRPCName1: testRPCName1Bool,
- testRPCName2: testRPCName2Bool};
- testObserverGroupStatus = SDLPermissionGroupStatusMixed;
-
- testFilter.handler(testObserverChangedDict, testObserverGroupStatus);
+ testFilter = [[SDLPermissionFilter alloc] initWithPermissions:testPermissionElements groupType:testGroupType permissionStatusHandler:^(NSDictionary<SDLRPCFunctionName,SDLRPCPermissionStatus *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ testRPCPermissionStatusReturnChangedDict = change;
+ }];
});
-
- it(@"should call the changedDict correctly", ^{
- expect(testObserverReturnChangedDict).to(equal(testObserverChangedDict));
+
+ it(@"should set the permission elements array correctly", ^{
+ expect(testFilter.permissionElements).to(equal(testPermissionElements));
});
-
- it(@"should call the status correctly", ^{
- expect(@(testObserverGroupStatus)).to(equal(@(testObserverGroupStatus)));
+
+ describe(@"it should set up the observer correctly", ^{
+ __block NSDictionary<SDLPermissionRPCName, SDLRPCPermissionStatus *> *testObserverChangedDict = nil;
+ __block SDLRPCPermissionStatus *rpcPermissionStatus1 = nil;
+ __block SDLRPCPermissionStatus *rpcPermissionStatus2 = nil;
+ __block SDLPermissionGroupStatus testObserverGroupStatus = SDLPermissionGroupStatusUnknown;
+
+ beforeEach(^{
+ rpcPermissionStatus1 = [[SDLRPCPermissionStatus alloc] initWithRPCName:testRPCName1 isRPCAllowed:YES rpcParameters:nil];
+ rpcPermissionStatus2 = [[SDLRPCPermissionStatus alloc] initWithRPCName:testRPCName2 isRPCAllowed:NO rpcParameters:nil];
+ testObserverChangedDict = @{testRPCName1: rpcPermissionStatus1,
+ testRPCName2: rpcPermissionStatus2};
+ testObserverGroupStatus = SDLPermissionGroupStatusMixed;
+
+ testFilter.rpcPermissionStatusHandler(testObserverChangedDict, testObserverGroupStatus);
+ });
+
+ it(@"should call the changedDict correctly", ^{
+ expect(testRPCPermissionStatusReturnChangedDict).to(equal(testObserverChangedDict));
+ });
+
+ it(@"should call the status correctly", ^{
+ expect(@(testObserverGroupStatus)).to(equal(@(testObserverGroupStatus)));
+ });
});
});
});
});
-
+
describe(@"copying a filter", ^{
__block SDLPermissionFilter *testFilter = nil;
__block SDLPermissionFilter *testCopiedFilter = nil;
-
+
beforeEach(^{
- testFilter = [SDLPermissionFilter filterWithRPCNames:@[testRPCName1] groupType:SDLPermissionGroupTypeAny observer:^(NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {}];
+ testFilter = [[SDLPermissionFilter alloc] initWithPermissions:@[testPermissionElement1] groupType:SDLPermissionGroupTypeAny permissionsHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {}];
testCopiedFilter = [testFilter copy];
});
-
+
it(@"should say copied filters are not the same instance", ^{
expect(testCopiedFilter).toNot(beIdenticalTo(testFilter));
});
-
+
it(@"should copy the identifier correctly", ^{
expect(testCopiedFilter.identifier).to(equal(testFilter.identifier));
});
-
+
it(@"should copy the filter array correctly", ^{
- expect(testCopiedFilter.rpcNames).to(equal(testFilter.rpcNames));
+ expect(testCopiedFilter.permissionElements).to(equal(testFilter.permissionElements));
});
-
+
it(@"should copy the change type correctly", ^{
expect(@(testCopiedFilter.groupType)).to(equal(@(testFilter.groupType)));
});
});
-
+
describe(@"testing equality", ^{
__block SDLPermissionFilter *testSameFilter1 = nil;
__block SDLPermissionFilter *testSameFilter2 = nil;
__block SDLPermissionFilter *testDifferentFilter = nil;
-
+
beforeEach(^{
- testSameFilter1 = [SDLPermissionFilter filterWithRPCNames:@[testRPCName1] groupType:SDLPermissionGroupTypeAny observer:^(NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {}];
+ testSameFilter1 = [[SDLPermissionFilter alloc] initWithPermissions:@[testPermissionElement1] groupType:(SDLPermissionGroupType)SDLPermissionGroupTypeAny permissionsHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {}];
testSameFilter2 = [testSameFilter1 copy];
-
- testDifferentFilter = [SDLPermissionFilter filterWithRPCNames:@[testRPCName1] groupType:SDLPermissionGroupTypeAny observer:^(NSDictionary<SDLPermissionRPCName,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {}];
+
+ testDifferentFilter = [[SDLPermissionFilter alloc] initWithPermissions:@[testPermissionElement1] groupType:(SDLPermissionGroupType)SDLPermissionGroupTypeAny permissionsHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {}];
});
-
+
it(@"should say copied filters are the same", ^{
expect(testSameFilter1).to(equal(testSameFilter2));
});
-
+
it(@"should say new filters are different", ^{
expect(testSameFilter1).toNot(equal(testDifferentFilter));
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m
index bee6548c2..05020ef37 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m
@@ -28,12 +28,20 @@ QuickSpecBegin(SDLPermissionsManagerSpec)
describe(@"SDLPermissionsManager", ^{
__block SDLPermissionManager *testPermissionsManager = nil;
-
+
__block NSString *testRPCNameAllAllowed = nil;
__block NSString *testRPCNameAllDisallowed = nil;
__block NSString *testRPCNameFullLimitedAllowed = nil;
__block NSString *testRPCNameFullLimitedBackgroundAllowed = nil;
-
+
+ __block NSString *testRPCParameterNameAllAllowed = nil;
+ __block NSString *testRPCParameterNameAllDisallowed = nil;
+ __block NSString *testRPCParameterNameFullLimitedAllowed = nil;
+
+ __block SDLParameterPermissions *testParameterPermissionAllowed = nil;
+ __block SDLParameterPermissions *testParameterPermissionUserDisallowed = nil;
+ __block SDLParameterPermissions *testParameterPermissionFullLimitedAllowed = nil;
+
__block SDLPermissionItem *testPermissionAllAllowed = nil;
__block SDLHMIPermissions *testHMIPermissionsAllAllowed = nil;
__block SDLPermissionItem *testPermissionAllDisallowed = nil;
@@ -42,85 +50,109 @@ describe(@"SDLPermissionsManager", ^{
__block SDLHMIPermissions *testHMIPermissionsFullLimitedAllowed = nil;
__block SDLPermissionItem *testPermissionFullLimitedBackgroundAllowed = nil;
__block SDLHMIPermissions *testHMIPermissionsFullLimitedBackgroundAllowed = nil;
-
+
__block SDLOnPermissionsChange *testPermissionsChange = nil;
-
+
__block SDLOnHMIStatus *testLimitedHMIStatus = nil;
__block SDLOnHMIStatus *testBackgroundHMIStatus = nil;
__block SDLOnHMIStatus *testNoneHMIStatus = nil;
-
+
__block SDLRPCNotificationNotification *testPermissionsNotification = nil;
__block SDLRPCNotificationNotification *limitedHMINotification = nil;
__block SDLRPCNotificationNotification *backgroundHMINotification = nil;
__block SDLRPCNotificationNotification *noneHMINotification = nil;
-
+
+ __block SDLPermissionElement *testPermissionElementAllAllowed = nil;
+ __block SDLPermissionElement *testPermissionElementFullLimitedAllowed = nil;
+ __block SDLPermissionElement *testPermissionElementDisallowed = nil;
+
beforeEach(^{
// Permission Names
testRPCNameAllAllowed = @"AllAllowed";
testRPCNameAllDisallowed = @"AllDisallowed";
testRPCNameFullLimitedAllowed = @"FullAndLimitedAllowed";
testRPCNameFullLimitedBackgroundAllowed = @"FullAndLimitedAndBackgroundAllowed";
-
+
+ // Parameter Permission Names
+ testRPCParameterNameAllAllowed = @"AllAllowed";
+ testRPCParameterNameAllDisallowed = @"AllDisallowed";
+ testRPCParameterNameFullLimitedAllowed = @"FullAndLimitedAllowed";
+
// Create a manager
testPermissionsManager = [[SDLPermissionManager alloc] init];
-
+
// Permission states
testHMIPermissionsAllAllowed = [[SDLHMIPermissions alloc] init];
testHMIPermissionsAllAllowed.allowed = @[SDLHMILevelBackground, SDLHMILevelFull, SDLHMILevelLimited, SDLHMILevelNone];
-
+
testHMIPermissionsAllDisallowed = [[SDLHMIPermissions alloc] init];
testHMIPermissionsAllDisallowed.userDisallowed = @[SDLHMILevelBackground, SDLHMILevelFull, SDLHMILevelLimited, SDLHMILevelNone];
-
+
testHMIPermissionsFullLimitedAllowed = [[SDLHMIPermissions alloc] init];
testHMIPermissionsFullLimitedAllowed.allowed = @[SDLHMILevelFull, SDLHMILevelLimited];
testHMIPermissionsFullLimitedAllowed.userDisallowed = @[SDLHMILevelBackground, SDLHMILevelNone];
-
+
testHMIPermissionsFullLimitedBackgroundAllowed = [[SDLHMIPermissions alloc] init];
testHMIPermissionsFullLimitedBackgroundAllowed.allowed = @[SDLHMILevelFull, SDLHMILevelLimited, SDLHMILevelBackground];
testHMIPermissionsFullLimitedBackgroundAllowed.userDisallowed = @[SDLHMILevelNone];
-
+
+ // Assemble Parameter Permissions
+ testParameterPermissionAllowed = [[SDLParameterPermissions alloc] init];
+ testParameterPermissionAllowed.allowed = @[testRPCParameterNameAllAllowed];
+
+ testParameterPermissionUserDisallowed = [[SDLParameterPermissions alloc] init];
+ testParameterPermissionUserDisallowed.userDisallowed = @[testRPCParameterNameAllDisallowed];
+
+ testParameterPermissionFullLimitedAllowed = [[SDLParameterPermissions alloc] init];
+ testParameterPermissionFullLimitedAllowed.allowed = @[testRPCParameterNameAllAllowed, testRPCParameterNameFullLimitedAllowed];
+
// Assemble Permissions
SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
-
+
testPermissionAllAllowed = [[SDLPermissionItem alloc] init];
testPermissionAllAllowed.rpcName = testRPCNameAllAllowed;
testPermissionAllAllowed.hmiPermissions = testHMIPermissionsAllAllowed;
- testPermissionAllAllowed.parameterPermissions = testParameterPermissions;
-
+ testPermissionAllAllowed.parameterPermissions = testParameterPermissionAllowed;
+
testPermissionAllDisallowed = [[SDLPermissionItem alloc] init];
testPermissionAllDisallowed.rpcName = testRPCNameAllDisallowed;
testPermissionAllDisallowed.hmiPermissions = testHMIPermissionsAllDisallowed;
- testPermissionAllDisallowed.parameterPermissions = testParameterPermissions;
-
+ testPermissionAllDisallowed.parameterPermissions = testParameterPermissionUserDisallowed;
+
testPermissionFullLimitedAllowed = [[SDLPermissionItem alloc] init];
testPermissionFullLimitedAllowed.rpcName = testRPCNameFullLimitedAllowed;
testPermissionFullLimitedAllowed.hmiPermissions = testHMIPermissionsFullLimitedAllowed;
- testPermissionFullLimitedAllowed.parameterPermissions = testParameterPermissions;
-
+ testPermissionFullLimitedAllowed.parameterPermissions = testParameterPermissionFullLimitedAllowed;
+
testPermissionFullLimitedBackgroundAllowed = [[SDLPermissionItem alloc] init];
testPermissionFullLimitedBackgroundAllowed.rpcName = testRPCNameFullLimitedBackgroundAllowed;
testPermissionFullLimitedBackgroundAllowed.hmiPermissions = testHMIPermissionsFullLimitedBackgroundAllowed;
testPermissionFullLimitedBackgroundAllowed.parameterPermissions = testParameterPermissions;
-
+
// Create OnHMIStatus objects
testLimitedHMIStatus = [[SDLOnHMIStatus alloc] init];
testLimitedHMIStatus.hmiLevel = SDLHMILevelLimited;
-
+
testBackgroundHMIStatus = [[SDLOnHMIStatus alloc] init];
testBackgroundHMIStatus.hmiLevel = SDLHMILevelBackground;
-
+
testNoneHMIStatus = [[SDLOnHMIStatus alloc] init];
testNoneHMIStatus.hmiLevel = SDLHMILevelNone;
-
+
// Create OnPermissionsChange object
testPermissionsChange = [[SDLOnPermissionsChange alloc] init];
testPermissionsChange.permissionItem = @[testPermissionAllAllowed, testPermissionAllDisallowed, testPermissionFullLimitedAllowed, testPermissionFullLimitedBackgroundAllowed];
-
+
// Permission Notifications
testPermissionsNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangePermissionsNotification object:nil rpcNotification:testPermissionsChange];
limitedHMINotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testLimitedHMIStatus];
backgroundHMINotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testBackgroundHMIStatus];
noneHMINotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testNoneHMIStatus];
+
+ // Permission Elements
+ testPermissionElementAllAllowed = [[SDLPermissionElement alloc] initWithRPCName:testRPCNameAllAllowed parameterPermissions:@[testRPCParameterNameAllAllowed]];
+ testPermissionElementFullLimitedAllowed = [[SDLPermissionElement alloc] initWithRPCName:testRPCNameFullLimitedAllowed parameterPermissions:@[testRPCParameterNameFullLimitedAllowed]];
+ testPermissionElementDisallowed = [[SDLPermissionElement alloc] initWithRPCName:testRPCNameAllDisallowed parameterPermissions:@[testRPCParameterNameAllDisallowed]];
});
it(@"should clear when stopped", ^{
@@ -131,7 +163,7 @@ describe(@"SDLPermissionsManager", ^{
expect(testPermissionsManager.currentHMILevel).to(beNil());
expect(testPermissionsManager.requiresEncryption).to(beFalse());
});
-
+
describe(@"checking if a permission is allowed", ^{
__block NSString *someRPCName = nil;
__block SDLRPCFunctionName someRPCFunctionName = nil;
@@ -164,7 +196,7 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
context(@"when permissions exist but no HMI level", ^{
context(@"deprecated isRPCAllowed: method", ^{
beforeEach(^{
@@ -191,7 +223,7 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
context(@"when permissions exist", ^{
context(@"deprecated isRPCAllowed: method", ^{
context(@"and the permission is allowed", ^{
@@ -254,10 +286,10 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
describe(@"checking the group status of RPCs", ^{
__block SDLPermissionGroupStatus testResultStatus = SDLPermissionGroupStatusUnknown;
-
+
context(@"with no permissions data", ^{
context(@"deprecated groupStatusOfRPCs: method", ^{
beforeEach(^{
@@ -272,9 +304,9 @@ describe(@"SDLPermissionsManager", ^{
});
});
- context(@"groupStatusOfRPCNames: method", ^{
+ context(@"groupStatusOfRPCPermissions: method", ^{
beforeEach(^{
- testResultStatus = [testPermissionsManager groupStatusOfRPCNames:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ testResultStatus = [testPermissionsManager groupStatusOfRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementFullLimitedAllowed]];
});
it(@"should return unknown", ^{
@@ -282,7 +314,7 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
context(@"for an all allowed group", ^{
context(@"deprecated groupStatusOfRPCs: method", ^{
beforeEach(^{
@@ -299,12 +331,12 @@ describe(@"SDLPermissionsManager", ^{
});
});
- context(@"groupStatusOfRPCNames: method", ^{
+ context(@"groupStatusOfRPCPermissions: method", ^{
beforeEach(^{
[[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
[[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
- testResultStatus = [testPermissionsManager groupStatusOfRPCNames:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed]];
+ testResultStatus = [testPermissionsManager groupStatusOfRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementFullLimitedAllowed]];
});
it(@"should return allowed", ^{
@@ -312,7 +344,7 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
context(@"for an all disallowed group", ^{
context(@"deprecated groupStatusOfRPCs: method", ^{
beforeEach(^{
@@ -329,12 +361,12 @@ describe(@"SDLPermissionsManager", ^{
});
});
- context(@"groupStatusOfRPCNames: method", ^{
+ context(@"groupStatusOfRPCPermissions: method", ^{
beforeEach(^{
[[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
[[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
- testResultStatus = [testPermissionsManager groupStatusOfRPCNames:@[testRPCNameFullLimitedAllowed, testRPCNameAllDisallowed]];
+ testResultStatus = [testPermissionsManager groupStatusOfRPCPermissions:@[testPermissionElementFullLimitedAllowed, testPermissionElementDisallowed]];
});
it(@"should return disallowed", ^{
@@ -342,7 +374,7 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
context(@"for a mixed group", ^{
context(@"deprecated groupStatusOfRPCs: method", ^{
beforeEach(^{
@@ -359,12 +391,12 @@ describe(@"SDLPermissionsManager", ^{
});
});
- context(@"groupStatusOfRPCNames: method", ^{
+ context(@"groupStatusOfRPCPermissions: method", ^{
beforeEach(^{
[[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
[[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
- testResultStatus = [testPermissionsManager groupStatusOfRPCNames:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ testResultStatus = [testPermissionsManager groupStatusOfRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementDisallowed]];
});
it(@"should return mixed", ^{
@@ -373,9 +405,18 @@ describe(@"SDLPermissionsManager", ^{
});
});
});
-
+
describe(@"checking the status of RPCs", ^{
__block NSDictionary<SDLPermissionRPCName, NSNumber *> *testResultPermissionStatusDict = nil;
+ __block NSDictionary<SDLRPCFunctionName, SDLRPCPermissionStatus *> *testResultRPCPermissionStatusDict = nil;
+ __block SDLRPCPermissionStatus *allowedResultStatus = nil;
+ __block SDLRPCPermissionStatus *disallowedResultStatus = nil;
+
+ __block NSDictionary *testAllowedDict = nil;
+ __block SDLRPCPermissionStatus *testAllowedStatus = nil;
+ __block NSDictionary *testDisallowedDict = nil;
+ __block SDLRPCPermissionStatus *testDisallowedStatus = nil;
+
context(@"with no permissions data", ^{
context(@"deprecated statusOfRPCs: method", ^{
beforeEach(^{
@@ -391,18 +432,30 @@ describe(@"SDLPermissionsManager", ^{
});
});
- context(@"statusesOfRPCNames: method", ^{
+ context(@"statusesOfRPCPermissions: method", ^{
beforeEach(^{
- testResultPermissionStatusDict = [testPermissionsManager statusesOfRPCNames:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ testResultRPCPermissionStatusDict = [testPermissionsManager statusesOfRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementDisallowed]];
+ allowedResultStatus = testResultRPCPermissionStatusDict[testPermissionElementAllAllowed.rpcName];
+ disallowedResultStatus = testResultRPCPermissionStatusDict[testPermissionElementDisallowed.rpcName];
+
+ testAllowedDict = [[NSDictionary alloc] initWithObjectsAndKeys:@(0), testRPCParameterNameAllAllowed, nil];
+ testAllowedStatus = [[SDLRPCPermissionStatus alloc] initWithRPCName:testPermissionElementAllAllowed.rpcName isRPCAllowed:YES rpcParameters:testAllowedDict];
+ testDisallowedDict = [[NSDictionary alloc] initWithObjectsAndKeys:@(0), testRPCParameterNameAllDisallowed, nil];
+ testDisallowedStatus = [[SDLRPCPermissionStatus alloc] initWithRPCName:testPermissionElementDisallowed.rpcName isRPCAllowed:YES rpcParameters:testDisallowedDict];
});
- it(@"should return correct permission statuses", ^{
- expect(testResultPermissionStatusDict[testRPCNameAllAllowed]).to(equal(@NO));
- expect(testResultPermissionStatusDict[testRPCNameAllDisallowed]).to(equal(@NO));
+ it(@"should return the correct permission statuses", ^{
+ expect(allowedResultStatus.rpcName).to(equal(testAllowedStatus.rpcName));
+ expect(allowedResultStatus.rpcParameters).to(equal(testAllowedStatus.rpcParameters));
+ expect(allowedResultStatus.rpcAllowed).to(equal(@NO));
+
+ expect(disallowedResultStatus.rpcName).to(equal(testDisallowedStatus.rpcName));
+ expect(disallowedResultStatus.rpcParameters).to(equal(testDisallowedStatus.rpcParameters));
+ expect(disallowedResultStatus.rpcAllowed).to(equal(@NO));
});
});
});
-
+
context(@"with permissions data", ^{
context(@"deprecated statusOfRPCs: method", ^{
beforeEach(^{
@@ -420,17 +473,31 @@ describe(@"SDLPermissionsManager", ^{
});
});
- context(@"statusesOfRPCNames: method", ^{
+ context(@"statusesOfRPCPermissions: method", ^{
beforeEach(^{
[[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
[[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
- testResultPermissionStatusDict = [testPermissionsManager statusesOfRPCNames:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ testResultRPCPermissionStatusDict = [testPermissionsManager statusesOfRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementDisallowed]];
+
+ allowedResultStatus = testResultRPCPermissionStatusDict[testPermissionElementAllAllowed.rpcName];
+ disallowedResultStatus = testResultRPCPermissionStatusDict[testPermissionElementDisallowed.rpcName];
+
+ testAllowedDict = [[NSDictionary alloc] initWithObjectsAndKeys:@(1), testRPCParameterNameAllAllowed, nil];
+ testAllowedStatus = [[SDLRPCPermissionStatus alloc] initWithRPCName:testPermissionElementAllAllowed.rpcName isRPCAllowed:YES rpcParameters:testAllowedDict];
+
+ testDisallowedDict = [[NSDictionary alloc] initWithObjectsAndKeys:@(0), testRPCParameterNameAllDisallowed, nil];
+ testDisallowedStatus = [[SDLRPCPermissionStatus alloc] initWithRPCName:testPermissionElementDisallowed.rpcName isRPCAllowed:NO rpcParameters:testDisallowedDict];
});
- it(@"should return correct permission statuses", ^{
- expect(testResultPermissionStatusDict[testRPCNameAllAllowed]).to(equal(@YES));
- expect(testResultPermissionStatusDict[testRPCNameAllDisallowed]).to(equal(@NO));
+ it(@"should return the correct permission statuses", ^{
+ expect(allowedResultStatus.rpcName).to(equal(testAllowedStatus.rpcName));
+ expect(allowedResultStatus.rpcParameters).to(equal(testAllowedStatus.rpcParameters));
+ expect(allowedResultStatus.rpcAllowed).to(equal(testAllowedStatus.rpcAllowed));
+
+ expect(disallowedResultStatus.rpcName).to(equal(testDisallowedStatus.rpcName));
+ expect(disallowedResultStatus.rpcParameters).to(equal(testDisallowedStatus.rpcParameters));
+ expect(disallowedResultStatus.rpcAllowed).to(equal(testDisallowedStatus.rpcAllowed));
});
});
});
@@ -558,13 +625,13 @@ describe(@"SDLPermissionsManager", ^{
});
});
- describe(@"adding a new observer with subscribeToRPCNames:groupType:Handler", ^{
+ describe(@"adding a new observer with subscribeToRPCPermissions:groupType:Handler", ^{
context(@"when no data is present", ^{
__block BOOL testObserverCalled = NO;
beforeEach(^{
testObserverCalled = NO;
- [testPermissionsManager subscribeToRPCNames:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ [testPermissionsManager subscribeToRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {
testObserverCalled = YES;
}];
});
@@ -586,7 +653,7 @@ describe(@"SDLPermissionsManager", ^{
[[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
// This should not be called even with data currently present, the handler will only be called when an permissions update occurs after the RPC is subscribed to
- [testPermissionsManager subscribeToRPCNames:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ [testPermissionsManager subscribeToRPCPermissions:@[testPermissionElementAllAllowed, testPermissionElementDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName,NSNumber *> * _Nonnull change, SDLPermissionGroupStatus status) {
testObserverCalled = YES;
}];
});
@@ -1094,6 +1161,91 @@ describe(@"SDLPermissionsManager", ^{
});
});
+ describe(@"checking parameter permissions", ^{
+ __block SDLRPCFunctionName someRPCFunctionName = nil;
+ __block NSString *someRPCParameterName = nil;
+ __block BOOL testResultBOOL = NO;
+
+ context(@"when no permissions exist", ^{
+ beforeEach(^{
+ someRPCFunctionName = @"SomeRPCFunctionName";
+ someRPCParameterName = @"SomeRPCParameterName";
+ testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:someRPCFunctionName parameter:someRPCParameterName];
+ });
+
+ it(@"should not be allowed", ^{
+ expect(testResultBOOL).to(beFalse());
+ });
+ });
+
+ context(@"when permissions exist but no HMI level", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllAllowed parameter:testRPCParameterNameAllAllowed];
+ });
+
+ it(@"should not be allowed", ^{
+ expect(testResultBOOL).to(beFalse());
+ });
+ });
+
+ context(@"when permissions exist and HMI level exists", ^{
+ context(@"and the parameter permission is allowed", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllAllowed parameter:testRPCParameterNameAllAllowed];
+ });
+
+ it(@"should be allowed", ^{
+ expect(testResultBOOL).to(beTrue());
+ });
+ });
+
+ context(@"and the parameter permission is denied", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameAllDisallowed parameter:testRPCParameterNameAllDisallowed];
+ });
+
+ it(@"should not be allowed", ^{
+ expect(testResultBOOL).to(beFalse());
+ });
+ });
+
+ context(@"when user disallowed parameter permissions is not nil", ^{
+ context(@"and the parameter is disallowed", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameFullLimitedAllowed parameter:testRPCParameterNameAllDisallowed];
+ });
+
+ it(@"should not be allowed", ^{
+ expect(testResultBOOL).to(beFalse());
+ });
+ });
+
+ context(@"and the parameter is allowed", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isPermissionParameterAllowed:testRPCNameFullLimitedAllowed parameter:testRPCParameterNameAllAllowed];
+ });
+
+ it(@"should be allowed", ^{
+ expect(testResultBOOL).to(beTrue());
+ });
+ });
+ });
+ });
+ });
+
describe(@"removing observers", ^{
context(@"removing the only observer", ^{
__block NSInteger numberOfTimesObserverCalled = 0;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonStateSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonStateSpec.m
index e62a9256f..0d89b53b0 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonStateSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonStateSpec.m
@@ -51,7 +51,7 @@ describe(@"soft button state", ^{
SDLSoftButton *testSoftButton = testState.softButton;
expect(testSoftButton.type).to(equal(SDLSoftButtonTypeBoth));
-// expect(testSoftButton.handler).to(beNil());
+ expect((id)testSoftButton.handler).to(beNil());
expect(testSoftButton.softButtonID).to(equal(0));
expect(testSoftButton.isHighlighted).to(beFalsy());
expect(testSoftButton.systemAction).to(equal(SDLSystemActionDefaultAction));
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
index 4770f44f1..93d5e5829 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingAudioLifecycleManagerSpec.m
@@ -46,8 +46,6 @@ describe(@"the streaming audio manager", ^{
hmiStatus.hmiLevel = hmiLevel;
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:self rpcNotification:hmiStatus];
[[NSNotificationCenter defaultCenter] postNotification:notification];
-
- [NSThread sleepForTimeInterval:0.3];
};
beforeEach(^{
@@ -113,11 +111,10 @@ describe(@"the streaming audio manager", ^{
SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
[[NSNotificationCenter defaultCenter] postNotification:notification];
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should should save the connected vehicle make", ^{
- expect(streamingLifecycleManager.connectedVehicleMake).to(equal(testVehicleType.make));
+ expect(streamingLifecycleManager.connectedVehicleMake).toEventually(equal(testVehicleType.make));
});
});
@@ -149,7 +146,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should close the streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateShuttingDown));
});
});
@@ -159,7 +156,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateShuttingDown));
});
});
@@ -169,7 +166,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateReady));
});
});
@@ -179,7 +176,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateReady));
});
});
});
@@ -208,7 +205,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should close the streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateShuttingDown));
});
});
@@ -218,7 +215,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateShuttingDown));
});
});
@@ -228,7 +225,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateReady));
});
});
@@ -238,7 +235,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateReady));
});
});
});
@@ -260,7 +257,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should not start the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateStopped));
});
});
@@ -270,7 +267,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should not start the stream", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStopped));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateStopped));
});
});
@@ -280,7 +277,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should start the streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStarting));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateStarting));
});
});
@@ -290,7 +287,7 @@ describe(@"the streaming audio manager", ^{
});
it(@"should start the streams", ^{
- expect(streamingLifecycleManager.currentAudioStreamState).to(equal(SDLAudioStreamManagerStateStarting));
+ expect(streamingLifecycleManager.currentAudioStreamState).toEventually(equal(SDLAudioStreamManagerStateStarting));
});
});
});
@@ -314,7 +311,7 @@ describe(@"the streaming audio manager", ^{
testAudioStartServicePayload = [[SDLControlFramePayloadAudioStartServiceAck alloc] initWithMTU:testMTU];
testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:testAudioStartServicePayload.data];
- [streamingLifecycleManager handleProtocolStartServiceACKMessage:testAudioMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testAudioMessage];
});
it(@"should have set all the right properties", ^{
@@ -338,7 +335,7 @@ describe(@"the streaming audio manager", ^{
testAudioHeader.serviceType = SDLServiceTypeAudio;
testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testAudioMessage];
});
it(@"should have set all the right properties", ^{
@@ -360,7 +357,7 @@ describe(@"the streaming audio manager", ^{
testAudioHeader.serviceType = SDLServiceTypeAudio;
testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testAudioMessage];
});
it(@"should have set all the right properties", ^{
@@ -382,7 +379,7 @@ describe(@"the streaming audio manager", ^{
testAudioHeader.serviceType = SDLServiceTypeAudio;
testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceNAKMessage:testAudioMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testAudioMessage];
});
it(@"should have set all the right properties", ^{
@@ -392,7 +389,7 @@ describe(@"the streaming audio manager", ^{
});
describe(@"attempting to stop the manager", ^{
- __block BOOL handlerCalled = nil;
+ __block BOOL handlerCalled = NO;
beforeEach(^{
handlerCalled = NO;
@@ -467,7 +464,7 @@ describe(@"the streaming audio manager", ^{
testAudioHeader.serviceType = SDLServiceTypeAudio;
testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testAudioMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testAudioMessage];
});
it(@"should transistion to the stopped state", ^{
@@ -487,7 +484,7 @@ describe(@"the streaming audio manager", ^{
testAudioHeader.serviceType = SDLServiceTypeAudio;
testAudioMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testAudioHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceNAKMessage:testAudioMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testAudioMessage];
});
it(@"should transistion to the stopped state", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
index 4dfae005b..f138e873d 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStreamingVideoLifecycleManagerSpec.m
@@ -72,8 +72,6 @@ describe(@"the streaming video manager", ^{
hmiStatus.videoStreamingState = streamState;
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:self rpcNotification:hmiStatus];
[[NSNotificationCenter defaultCenter] postNotification:notification];
-
- [NSThread sleepForTimeInterval:0.3];
};
beforeEach(^{
@@ -86,7 +84,7 @@ describe(@"the streaming video manager", ^{
testLifecycleConfiguration.appType = SDLAppHMITypeNavigation;
- testConfig = [SDLConfiguration configurationWithLifecycle:testLifecycleConfiguration lockScreen:SDLLockScreenConfiguration.enabledConfiguration logging:SDLLogConfiguration.debugConfiguration streamingMedia:testConfiguration fileManager:SDLFileManagerConfiguration.defaultConfiguration];
+ 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];
@@ -183,12 +181,11 @@ describe(@"the streaming video manager", ^{
SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
[[NSNotificationCenter defaultCenter] postNotification:notification];
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should save the connected vehicle make but not the screen size", ^{
- expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeZero))).to(equal(@YES));
- expect(streamingLifecycleManager.connectedVehicleMake).to(equal(testVehicleType.make));
+ expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeZero))).toEventually(equal(@YES));
+ expect(streamingLifecycleManager.connectedVehicleMake).toEventually(equal(testVehicleType.make));
});
});
@@ -213,11 +210,10 @@ describe(@"the streaming video manager", ^{
SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:someRegisterAppInterfaceResponse];
[[NSNotificationCenter defaultCenter] postNotification:notification];
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should save the connected vehicle make and the screen size", ^{
- expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeMake(600, 100)))).to(equal(@YES));
+ expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeMake(600, 100)))).toEventually(equal(@YES));
expect(streamingLifecycleManager.connectedVehicleMake).toEventually(equal(testVehicleType.make));
});
});
@@ -250,7 +246,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
@@ -260,7 +256,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
@@ -270,7 +266,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateReady));
});
});
@@ -280,7 +276,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateReady));
});
});
@@ -290,7 +286,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
});
@@ -319,7 +315,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the streams", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
@@ -329,7 +325,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
@@ -339,7 +335,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateReady));
});
});
@@ -349,7 +345,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateReady));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateReady));
});
});
@@ -359,7 +355,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
@@ -370,7 +366,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
@@ -381,7 +377,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should close the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateShuttingDown));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateShuttingDown));
});
});
});
@@ -403,7 +399,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not start the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateStopped));
});
});
@@ -413,7 +409,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not start the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateStopped));
});
});
@@ -423,7 +419,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should start the streams", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStarting));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateStarting));
});
});
@@ -433,7 +429,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should start the streams", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStarting));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateStarting));
});
});
@@ -443,7 +439,7 @@ describe(@"the streaming video manager", ^{
});
it(@"should not start the stream", ^{
- expect(streamingLifecycleManager.currentVideoStreamState).to(equal(SDLVideoStreamManagerStateStopped));
+ expect(streamingLifecycleManager.currentVideoStreamState).toEventually(equal(SDLVideoStreamManagerStateStopped));
});
});
});
@@ -556,7 +552,7 @@ describe(@"the streaming video manager", ^{
beforeEach(^{
testVideoStartServicePayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:testVideoHeight width:testVideoWidth protocol:testVideoProtocol codec:testVideoCodec];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartServicePayload.data];
- [streamingLifecycleManager handleProtocolStartServiceACKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testVideoMessage];
});
it(@"should have set all the right properties", ^{
@@ -572,7 +568,7 @@ describe(@"the streaming video manager", ^{
beforeEach(^{
testVideoStartServicePayload = [[SDLControlFramePayloadVideoStartServiceAck alloc] initWithMTU:testMTU height:testVideoHeight width:testVideoWidth protocol:nil codec:nil];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartServicePayload.data];
- [streamingLifecycleManager handleProtocolStartServiceACKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testVideoMessage];
});
it(@"should fall back correctly", ^{
@@ -593,7 +589,7 @@ describe(@"the streaming video manager", ^{
context(@"If no preferred resolutions were set in the data source", ^{
beforeEach(^{
streamingLifecycleManager.dataSource = nil;
- [streamingLifecycleManager handleProtocolStartServiceACKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testVideoMessage];
});
it(@"should not replace the existing screen resolution", ^{
expect(@(CGSizeEqualToSize(streamingLifecycleManager.videoScaleManager.displayViewportResolution, CGSizeZero))).to(beTrue());
@@ -610,7 +606,7 @@ describe(@"the streaming video manager", ^{
streamingLifecycleManager.dataSource = testDataSource;
streamingLifecycleManager.preferredResolutions = @[preferredResolutionLow, preferredResolutionHigh];
- [streamingLifecycleManager handleProtocolStartServiceACKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testVideoMessage];
});
it(@"should set the screen size using the first provided preferred resolution", ^{
CGSize preferredFormat = CGSizeMake(preferredResolutionLow.resolutionWidth.floatValue, preferredResolutionLow.resolutionHeight.floatValue);
@@ -652,7 +648,7 @@ describe(@"the streaming video manager", ^{
testVideoStartNakPayload = [[SDLControlFramePayloadNak alloc] initWithRejectedParams:@[[NSString stringWithUTF8String:SDLControlFrameHeightKey], [NSString stringWithUTF8String:SDLControlFrameVideoCodecKey]]];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartNakPayload.data];
- [streamingLifecycleManager handleProtocolStartServiceNAKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceNAK:testVideoMessage];
});
it(@"should have retried with new properties", ^{
@@ -674,7 +670,7 @@ describe(@"the streaming video manager", ^{
testVideoStartNakPayload = [[SDLControlFramePayloadNak alloc] initWithRejectedParams:@[[NSString stringWithUTF8String:SDLControlFrameVideoCodecKey]]];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartNakPayload.data];
- [streamingLifecycleManager handleProtocolStartServiceNAKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceNAK:testVideoMessage];
});
it(@"should have retried with new properties", ^{
@@ -695,7 +691,7 @@ describe(@"the streaming video manager", ^{
testVideoStartNakPayload = [[SDLControlFramePayloadNak alloc] initWithRejectedParams:@[[NSString stringWithUTF8String:SDLControlFrameVideoCodecKey]]];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartNakPayload.data];
- [streamingLifecycleManager handleProtocolStartServiceNAKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceNAK:testVideoMessage];
});
it(@"should end the service", ^{
@@ -710,7 +706,7 @@ describe(@"the streaming video manager", ^{
testVideoStartNakPayload = [[SDLControlFramePayloadNak alloc] initWithRejectedParams:nil];
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:testVideoStartNakPayload.data];
- [streamingLifecycleManager handleProtocolStartServiceNAKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveStartServiceNAK:testVideoMessage];
});
it(@"should end the service", ^{
@@ -733,7 +729,7 @@ describe(@"the streaming video manager", ^{
testVideoHeader.serviceType = SDLServiceTypeVideo;
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testVideoMessage];
});
it(@"should have set all the right properties", ^{
@@ -755,7 +751,7 @@ describe(@"the streaming video manager", ^{
testVideoHeader.serviceType = SDLServiceTypeVideo;
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceNAKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testVideoMessage];
});
it(@"should have set all the right properties", ^{
@@ -766,7 +762,7 @@ describe(@"the streaming video manager", ^{
});
describe(@"stopping the manager", ^{
- __block BOOL handlerCalled = nil;
+ __block BOOL handlerCalled = NO;
beforeEach(^{
handlerCalled = NO;
@@ -841,7 +837,7 @@ describe(@"the streaming video manager", ^{
testVideoHeader.serviceType = SDLServiceTypeVideo;
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceACKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testVideoMessage];
});
it(@"should transistion to the stopped state", ^{
@@ -861,7 +857,7 @@ describe(@"the streaming video manager", ^{
testVideoHeader.serviceType = SDLServiceTypeVideo;
testVideoMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testVideoHeader andPayload:nil];
- [streamingLifecycleManager handleProtocolEndServiceNAKMessage:testVideoMessage];
+ [streamingLifecycleManager protocol:protocolMock didReceiveEndServiceNAK:testVideoMessage];
});
it(@"should transistion to the stopped state", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
index 93254ca78..570d2bd9e 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
@@ -31,7 +31,7 @@
expect(putFile.offset).to(equal(@(index * mtuSize)));
expect(putFile.persistentFile).to(equal(@NO));
- expect(putFile.syncFileName).to(equal(testFile.name));
+ expect(putFile.sdlFileName).to(equal(testFile.name));
expect(putFile.bulkData).to(equal(testBulkFileData));
expect(putFile.crc).to(equal([NSNumber numberWithUnsignedLong:testBulkFileDataCrc]));
diff --git a/SmartDeviceLinkTests/Notifications/SDLNotificationDispatcherSpec.m b/SmartDeviceLinkTests/Notifications/SDLNotificationDispatcherSpec.m
index cfa34340d..435cea569 100644
--- a/SmartDeviceLinkTests/Notifications/SDLNotificationDispatcherSpec.m
+++ b/SmartDeviceLinkTests/Notifications/SDLNotificationDispatcherSpec.m
@@ -18,146 +18,6 @@ describe(@"a notification dispatcher", ^{
beforeEach(^{
testDispatcher = [[SDLNotificationDispatcher alloc] init];
});
-
- it(@"should conform to SDLProxyListener", ^{
- expect(@([testDispatcher conformsToProtocol:@protocol(SDLProxyListener)])).to(beTruthy());
-
- // Responses
- expect(@([testDispatcher respondsToSelector:@selector(onOnDriverDistraction:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnHMIStatus:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onProxyClosed)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onProxyOpened)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAddCommandResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAddSubMenuResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAlertManeuverResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAlertResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onButtonPressResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onChangeRegistrationResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onCreateInteractionChoiceSetResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteCommandResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteInteractionChoiceSetResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteSubMenuResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDiagnosticMessageResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDialNumberResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onEncodedSyncPDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onEndAudioPassThruResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onError:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGenericResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetAppServiceDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetDTCsResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetFileResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetInteriorVehicleDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetSystemCapabilityResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetVehicleDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetWayPointsResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onReceivedLockScreenIcon:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPerformAppServiceInteractionResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPerformAudioPassThruResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPerformInteractionResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPublishAppServiceResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPutFileResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onReadDIDResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onRegisterAppInterfaceResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onResetGlobalPropertiesResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onScrollableMessageResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSendHapticDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSendLocationResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetAppIconResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetDisplayLayoutResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetGlobalPropertiesResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetInteriorVehicleDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetMediaClockTimerResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onShowConstantTBTResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onShowResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onShowAppMenuResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSliderResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSpeakResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSubscribeButtonResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSubscribeVehicleDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSubscribeWayPointsResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSyncPDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUpdateTurnListResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnregisterAppInterfaceResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeButtonResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeVehicleDataResponse:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeWayPointsResponse:)])).to(beTruthy());
-
- // Requests
- expect(@([testDispatcher respondsToSelector:@selector(onAddCommand:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAddSubMenu:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAlert:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onAlertManeuver:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onButtonPress:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onChangeRegistration:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onCreateInteractionChoiceSet:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteCommand:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteFile:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteInteractionChoiceSet:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDeleteSubMenu:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDiagnosticMessage:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onDialNumber:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onEncodedSyncPData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onEndAudioPassThru:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetAppServiceData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetDTCs:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetFile:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetInteriorVehicleData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetSystemCapability:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetVehicleData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onGetWayPoints:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onListFiles:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPerformAppServiceInteraction:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPerformAudioPassThru:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPerformInteraction:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPublishAppService:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onPutFile:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onReadDID:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onRegisterAppInterface:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onResetGlobalProperties:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onScrollableMessage:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSendHapticData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSendLocation:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetAppIcon:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetDisplayLayout:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetGlobalProperties:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetInteriorVehicleData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSetMediaClockTimer:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onShow:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onShowAppMenu:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onShowConstantTBT:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSlider:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSpeak:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSubscribeButton:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSubscribeVehicleData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSubscribeWayPoints:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSyncPData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onSystemRequest:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnregisterAppInterface:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeButton:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeVehicleData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeWayPoints:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onUpdateTurnList:)])).to(beTruthy());
-
- // Notifications
- expect(@([testDispatcher respondsToSelector:@selector(onOnAppInterfaceUnregistered:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnAppServiceData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnAudioPassThru:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnButtonEvent:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnButtonPress:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnCommand:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnEncodedSyncPData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnHashChange:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnLanguageChange:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnLockScreenNotification:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnRCStatus:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnSyncPData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnSystemCapabilityUpdated:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnSystemRequest:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnTBTClientState:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnTouchEvent:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnVehicleData:)])).to(beTruthy());
- expect(@([testDispatcher respondsToSelector:@selector(onOnWayPointChange:)])).to(beTruthy());
- });
describe(@"when told to post a notification", ^{
__block NSString *testNotificationName = nil;
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
index a8901a2a0..b4e542012 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
@@ -36,13 +36,11 @@ NSDictionary* dictionaryV1 = @{SDLRPCParameterNameRequest:
NSDictionary* dictionaryV2 = @{SDLRPCParameterNameCommandId:@55};
describe(@"Send StartService Tests", ^ {
- context(@"Unsecure", ^{
+ context(@"Insecure", ^{
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"];
-
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
@@ -57,11 +55,11 @@ describe(@"Send StartService Tests", ^ {
const char testHeader[8] = {0x10 | SDLFrameTypeControl, SDLServiceTypeBulkData, SDLFrameInfoStartService, 0x00, 0x00, 0x00, 0x00, 0x00};
expect(dataSent).to(equal([NSData dataWithBytes:testHeader length:8]));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
[testProtocol startServiceWithType:SDLServiceTypeBulkData payload:nil];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
it(@"Should reuse stored header of RPC service when starting other service", ^{
@@ -82,8 +80,6 @@ describe(@"Send StartService Tests", ^ {
header.frameData = SDLFrameInfoStartService;
NSData *headerData = [header data];
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -94,12 +90,12 @@ describe(@"Send StartService Tests", ^ {
NSData* dataSent = [data copy];
expect(dataSent).to(equal(headerData));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
[testProtocol storeHeader:header forServiceType:SDLServiceTypeRPC];
[testProtocol startServiceWithType:serviceTypeToStart payload:nil];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
@@ -115,12 +111,6 @@ describe(@"Send StartService Tests", ^ {
describe(@"Send EndSession Tests", ^ {
context(@"During V1 session", ^ {
it(@"Should send the correct data", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
- SDLV1ProtocolHeader *testHeader = [[SDLV1ProtocolHeader alloc] init];
- testHeader.serviceType = SDLServiceTypeRPC;
- testHeader.sessionID = 0x03;
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
-
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -134,22 +124,21 @@ describe(@"Send EndSession Tests", ^ {
const char testHeader[8] = {0x10 | SDLFrameTypeControl, SDLServiceTypeRPC, SDLFrameInfoEndService, 0x03, 0x00, 0x00, 0x00, 0x00};
expect(dataSent).to(equal([NSData dataWithBytes:testHeader length:8]));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ SDLV1ProtocolHeader *testHeader = [[SDLV1ProtocolHeader alloc] init];
+ testHeader.serviceType = SDLServiceTypeRPC;
+ testHeader.sessionID = 0x03;
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
[testProtocol endServiceWithType:SDLServiceTypeRPC];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
context(@"During V2 session", ^ {
it(@"Should send the correct data", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
- SDLV2ProtocolHeader *testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:2];
- testHeader.serviceType = SDLServiceTypeRPC;
- testHeader.sessionID = 0x61;
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
-
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -163,30 +152,22 @@ describe(@"Send EndSession Tests", ^ {
const char testHeader[12] = {0x20 | SDLFrameTypeControl, SDLServiceTypeRPC, SDLFrameInfoEndService, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
expect(dataSent).to(equal([NSData dataWithBytes:testHeader length:12]));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ SDLV2ProtocolHeader *testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:2];
+ testHeader.serviceType = SDLServiceTypeRPC;
+ testHeader.sessionID = 0x61;
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
[testProtocol endServiceWithType:SDLServiceTypeRPC];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
});
describe(@"Send Register Secondary Transport Tests", ^ {
it(@"Should send the correct data", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
- // receive a Start Service ACK frame of RPC to configure protocol version
- SDLV2ProtocolHeader *refHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
- refHeader.frameType = SDLFrameTypeControl;
- refHeader.serviceType = SDLServiceTypeRPC;
- refHeader.frameData = SDLFrameInfoStartServiceACK;
- refHeader.sessionID = 0x11;
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:refHeader andPayload:nil]];
-
- // store the header to apply Session ID value to Register Secondary Transport frame
- [testProtocol storeHeader:refHeader forServiceType:SDLServiceTypeControl];
-
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -199,11 +180,22 @@ describe(@"Send Register Secondary Transport Tests", ^ {
const char testHeader[12] = {0x50 | SDLFrameTypeControl, SDLServiceTypeControl, SDLFrameInfoRegisterSecondaryTransport, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
expect(dataSent).to(equal([NSData dataWithBytes:testHeader length:12]));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ // receive a Start Service ACK frame of RPC to configure protocol version
+ SDLV2ProtocolHeader *refHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:5];
+ refHeader.frameType = SDLFrameTypeControl;
+ refHeader.serviceType = SDLServiceTypeRPC;
+ refHeader.frameData = SDLFrameInfoStartServiceACK;
+ refHeader.sessionID = 0x11;
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:[SDLProtocolMessage messageWithHeader:refHeader andPayload:nil]];
+
+ // store the header to apply Session ID value to Register Secondary Transport frame
+ [testProtocol storeHeader:refHeader forServiceType:SDLServiceTypeControl];
[testProtocol registerSecondaryTransport];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
@@ -217,12 +209,6 @@ describe(@"SendRPCRequest Tests", ^ {
it(@"Should send the correct data", ^ {
[[[[mockRequest stub] andReturn:dictionaryV1] ignoringNonObjectArgs] serializeAsDictionary:1];
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
- SDLV1ProtocolHeader *testHeader = [[SDLV1ProtocolHeader alloc] init];
- testHeader.serviceType = SDLServiceTypeRPC;
- testHeader.sessionID = 0xFF;
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
-
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -242,11 +228,16 @@ describe(@"SendRPCRequest Tests", ^ {
expect(dataSent).to(equal([testData copy]));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ SDLV1ProtocolHeader *testHeader = [[SDLV1ProtocolHeader alloc] init];
+ testHeader.serviceType = SDLServiceTypeRPC;
+ testHeader.sessionID = 0xFF;
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
[testProtocol sendRPC:mockRequest];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
@@ -257,12 +248,6 @@ describe(@"SendRPCRequest Tests", ^ {
[[[mockRequest stub] andReturn:@"DeleteCommand"] name];
[[[mockRequest stub] andReturn:[NSData dataWithBytes:"COMMAND" length:strlen("COMMAND")]] bulkData];
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
- SDLV2ProtocolHeader *testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:2];
- testHeader.serviceType = SDLServiceTypeRPC;
- testHeader.sessionID = 0x01;
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
-
__block BOOL verified = NO;
id transportMock = OCMProtocolMock(@protocol(SDLTransportType));
[[[transportMock stub] andDo:^(NSInvocation* invocation) {
@@ -289,11 +274,16 @@ describe(@"SendRPCRequest Tests", ^ {
expect(dataSent).to(equal([testData copy]));
}] sendData:[OCMArg any]];
- testProtocol.transport = transportMock;
+ SDLProtocol *testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ SDLV2ProtocolHeader *testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:2];
+ testHeader.serviceType = SDLServiceTypeRPC;
+ testHeader.sessionID = 0x01;
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
[testProtocol sendRPC:mockRequest];
- expect(@(verified)).toEventually(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
});
@@ -406,12 +396,14 @@ describe(@"HandleBytesFromTransport Tests", ^ {
});
describe(@"HandleProtocolSessionStarted tests", ^ {
+ __block id transportMock = nil;
__block SDLProtocol *testProtocol = nil;
__block id delegateMock = nil;
beforeEach(^{
- testProtocol = [[SDLProtocol alloc] init];
- delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
+ transportMock = OCMProtocolMock(@protocol(SDLTransportType));
+ testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+ delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-value"
[[SDLGlobals sharedGlobals] init]; // Make sure to reset between tests
@@ -437,10 +429,13 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = (UInt32)testData.length;
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:testData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveStartServiceACK:ackMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]];
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:ackMessage];
- OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
expect(testProtocol.authToken).to(equal(testAuthToken));
expect([SDLGlobals sharedGlobals].protocolVersion.stringVersion).to(equal(@"5.2.0"));
@@ -458,10 +453,13 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = (UInt32)testData.length;
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:testData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveStartServiceACK:ackMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]];
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:ackMessage];
- OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
expect(testProtocol.authToken).to(beNil());
expect([SDLGlobals sharedGlobals].protocolVersion.stringVersion).to(equal(@"5.1.0"));
@@ -479,10 +477,13 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = (UInt32)testData.length;
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:testData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveStartServiceACK:ackMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]];
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:ackMessage];
- OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
expect(testProtocol.authToken).to(beNil());
expect([SDLGlobals sharedGlobals].protocolVersion.stringVersion).to(equal(@"5.0.0"));
@@ -502,10 +503,13 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = (UInt32)testData.length;
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:testData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveStartServiceACK:ackMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]];
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:ackMessage];
- OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
// Should keep their default values
expect(testProtocol.authToken).to(beNil());
@@ -528,10 +532,13 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = (UInt32)testData.length;
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:testData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveStartServiceACK:ackMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]];
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:ackMessage];
- OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
expect([SDLGlobals sharedGlobals].protocolVersion.stringVersion).to(equal(@"3.1.0"));
expect([SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion.stringVersion).to(equal(@"3.1.0"));
@@ -550,24 +557,32 @@ describe(@"HandleProtocolSessionStarted tests", ^ {
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = (UInt32)testData.length;
- [testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:testData]];
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:testData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveStartServiceACK:ackMessage]);
- OCMExpect([delegateMock handleProtocolStartServiceACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ [testProtocol.protocolDelegateTable addObject:delegateMock];
+ [testProtocol protocol:testProtocol didReceiveStartServiceACK:ackMessage];
// Should keep their default values
expect([SDLGlobals sharedGlobals].protocolVersion.stringVersion).to(equal(@"1.0.0"));
expect([SDLGlobals sharedGlobals].maxHeadUnitProtocolVersion.stringVersion).to(equal(@"0.0.0"));
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
});
});
-xdescribe(@"HandleProtocolRegisterSecondaryTransport Tests", ^ {
- it(@"Should pass information along to delegate when ACKed", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
+describe(@"HandleProtocolRegisterSecondaryTransport Tests", ^{
+ __block id transportMock = nil;
+ __block SDLProtocol *testProtocol = nil;
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
+ beforeEach(^{
+ transportMock = OCMProtocolMock(@protocol(SDLTransportType));
+ testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+ });
+
+ it(@"Should pass information along to delegate when ACKed", ^ {
+ id delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
testHeader.frameType = SDLFrameTypeControl;
@@ -577,16 +592,17 @@ xdescribe(@"HandleProtocolRegisterSecondaryTransport Tests", ^ {
testHeader.messageID = 2;
testHeader.bytesInPayload = 0;
+ SDLProtocolMessage *ackMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:nil];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveRegisterSecondaryTransportACK:ackMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolRegisterSecondaryTransportACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]];
+ [testProtocol protocol:testProtocol didReceiveRegisterSecondaryTransportACK:ackMessage];
- OCMExpect([delegateMock handleProtocolRegisterSecondaryTransportACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:nil]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
});
it(@"Should pass information along to delegate when NAKed", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
+ id delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
testHeader.frameType = SDLFrameTypeControl;
@@ -598,83 +614,102 @@ xdescribe(@"HandleProtocolRegisterSecondaryTransport Tests", ^ {
SDLControlFramePayloadRegisterSecondaryTransportNak *payload = [[SDLControlFramePayloadRegisterSecondaryTransportNak alloc] initWithReason:@"Sample reason"];
NSData *payloadData = payload.data;
+ SDLProtocolMessage *nakMessage = [SDLProtocolMessage messageWithHeader:testHeader andPayload:payloadData];
+ OCMExpect([delegateMock protocol:testProtocol didReceiveRegisterSecondaryTransportNAK:nakMessage]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol handleProtocolRegisterSecondaryTransportACKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:payloadData]];
+ [testProtocol protocol:testProtocol didReceiveRegisterSecondaryTransportNAK:nakMessage];
- OCMExpect([delegateMock handleProtocolRegisterSecondaryTransportNAKMessage:[SDLProtocolMessage messageWithHeader:testHeader andPayload:payloadData]]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
-xdescribe(@"HandleHeartbeatForSession Tests", ^{
- // TODO: Test automatically sending data to head unit (dependency injection?)
- it(@"Should pass information along to delegate", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
+describe(@"HandleHeartbeatForSession Tests", ^{
+ __block id transportMock = nil;
+ __block SDLProtocol *testProtocol = nil;
+ __block id delegateMock = nil;
+
+ beforeEach(^{
+ transportMock = OCMProtocolMock(@protocol(SDLTransportType));
+ testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
+ OCMExpect([delegateMock handleHeartbeatForSession:0x44]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
[testProtocol handleHeartbeatForSession:0x44];
-
- OCMExpect([delegateMock handleHeartbeatForSession:0]);
});
-});
-xdescribe(@"OnProtocolMessageReceived Tests", ^ {
it(@"Should pass information along to delegate", ^ {
- SDLProtocol *testProtocol = [[SDLProtocol alloc] init];
-
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
+ });
+});
+
+describe(@"OnProtocolMessageReceived Tests", ^ {
+ __block id transportMock = nil;
+ __block SDLProtocol *testProtocol = nil;
+ __block id delegateMock = nil;
+
+ beforeEach(^{
+ transportMock = OCMProtocolMock(@protocol(SDLTransportType));
+ testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
SDLProtocolMessage *testMessage = [[SDLProtocolMessage alloc] init];
SDLV2ProtocolHeader *testHeader = [[SDLV2ProtocolHeader alloc] initWithVersion:3];
testHeader.serviceType = SDLServiceTypeRPC;
testMessage.header = testHeader;
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
+
+ id delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
+ OCMExpect([delegateMock protocol:testProtocol didReceiveMessage:[OCMArg any]]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol onProtocolMessageReceived:testMessage];
-
- OCMExpect([delegateMock onProtocolMessageReceived:[OCMArg any]]);
+ [testProtocol protocol:testProtocol didReceiveMessage:testMessage];
});
-});
-xdescribe(@"OnProtocolOpened Tests", ^ {
it(@"Should pass information along to delegate", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
- [testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol onProtocolOpened];
-
- OCMExpect([delegateMock onProtocolOpened]);
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
-xdescribe(@"OnProtocolClosed Tests", ^ {
- it(@"Should pass information along to delegate", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
+describe(@"OnProtocolOpened Tests", ^ {
+ __block id transportMock = nil;
+ __block SDLProtocol *testProtocol = nil;
+ __block id delegateMock = nil;
+
+ beforeEach(^{
+ transportMock = OCMProtocolMock(@protocol(SDLTransportType));
+ testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ id delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
+ OCMExpect([delegateMock protocolDidOpen:testProtocol]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol onProtocolClosed];
-
- OCMExpect([delegateMock onProtocolClosed]);
+ [testProtocol onTransportConnected];
});
-});
-xdescribe(@"OnError Tests", ^ {
it(@"Should pass information along to delegate", ^ {
- SDLProtocol* testProtocol = [[SDLProtocol alloc] init];
-
- NSException* testException = [[NSException alloc] initWithName:@"Name" reason:@"No Reason" userInfo:@{}];
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
+ });
+});
+
+describe(@"OnProtocolClosed Tests", ^ {
+ __block id transportMock = nil;
+ __block SDLProtocol *testProtocol = nil;
+ __block id delegateMock = nil;
+
+ beforeEach(^{
+ transportMock = OCMProtocolMock(@protocol(SDLTransportType));
+ testProtocol = [[SDLProtocol alloc] initWithTransport:transportMock encryptionManager:nil];
+
+ delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
+ OCMExpect([delegateMock protocolDidClose:testProtocol]);
+
[testProtocol.protocolDelegateTable addObject:delegateMock];
- [testProtocol onError:@"Nothing actually happened" exception:testException];
-
- OCMExpect([delegateMock onError:[OCMArg any] exception:[OCMArg any]]);
+ [testProtocol onTransportDisconnected];
+ });
+
+ it(@"Should pass information along to delegate", ^ {
+ OCMVerifyAllWithDelay(delegateMock, 0.1);
});
});
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m
index ab91a5de2..c1e9f6f1e 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m
@@ -9,107 +9,187 @@
#import <Nimble/Nimble.h>
#import <OCMock/OCMock.h>
+#import "SDLProtocol.h"
#import "SDLProtocolReceivedMessageRouter.h"
+#import "SDLRPCParameterNames.h"
#import "SDLV2ProtocolHeader.h"
#import "SDLV2ProtocolMessage.h"
-#import "SDLRPCParameterNames.h"
QuickSpecBegin(SDLProtocolReceivedMessageRouterSpec)
-// TODO: This should be rewritten using an actual mock (i.e. SDLProtocolListenerDelegateMock class to avoid OCMock)
-describe(@"HandleReceivedMessage Tests", ^ {
- xcontext(@"When handling control message", ^ {
- it(@"Should route message correctly", ^ {
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
- SDLV2ProtocolMessage* testMessage = [[SDLV2ProtocolMessage alloc] init];
- SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
-
+describe(@"Handle received message tests", ^{
+ __block SDLProtocolReceivedMessageRouter *router = nil;
+ __block id delegateMock = nil;
+ __block SDLProtocol *mockProtocol = nil;
+
+ beforeEach(^{
+ router = [[SDLProtocolReceivedMessageRouter alloc] init];
+ delegateMock = OCMProtocolMock(@protocol(SDLProtocolDelegate));
+ router.delegate = delegateMock;
+ mockProtocol = OCMStrictClassMock([SDLProtocol class]);
+ });
+
+ context(@"When handling a control message", ^{
+ __block SDLV2ProtocolMessage *testMessage = nil;
+ __block SDLV2ProtocolHeader *testHeader = nil;
+
+ beforeEach(^{
+ testHeader = [[SDLV2ProtocolHeader alloc] init];
testHeader.frameType = SDLFrameTypeControl;
testHeader.serviceType = SDLServiceTypeRPC;
- testHeader.frameData = SDLFrameInfoStartServiceACK;
testHeader.sessionID = 0x93;
testHeader.bytesInPayload = 0;
+
+ testMessage = [[SDLV2ProtocolMessage alloc] init];
+ testMessage.payload = [NSData data];
+ testMessage.header = testHeader;
+ });
+
+ it(@"Should route a start service ACK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoStartServiceACK;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveStartServiceACK:testMessage]);
+ });
+
+ it(@"Should route a start service NAK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoStartServiceNACK;
testMessage.header = testHeader;
- testMessage.payload = [NSData data];
- SDLProtocolReceivedMessageRouter* router = [[SDLProtocolReceivedMessageRouter alloc] init];
- router.delegate = delegateMock;
- [router handleReceivedMessage:testMessage];
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
- OCMVerify([delegateMock handleProtocolStartServiceACKMessage:testMessage]);
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveStartServiceNAK:testMessage]);
});
- });
-
- xcontext(@"When handling single frame message", ^ {
- it(@"Should route message correctly", ^ {
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
+
+ it(@"Should route an end service ACK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoEndServiceACK;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveEndServiceACK:testMessage]);
+ });
+
+ it(@"Should route an end service NAK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoEndServiceNACK;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveEndServiceNAK:testMessage]);
+ });
+
+ it(@"Should route register secondary transport ACK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoRegisterSecondaryTransportACK;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveRegisterSecondaryTransportACK:testMessage]);
+ });
+
+ it(@"Should route register secondary transport NAK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoRegisterSecondaryTransportNACK;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveRegisterSecondaryTransportNAK:testMessage]);
+ });
+
+ it(@"Should route a transport event update message correctly", ^{
+ testHeader.frameData = SDLFrameInfoTransportEventUpdate;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+
+ OCMVerify([delegateMock protocol:mockProtocol didReceiveTransportEventUpdate:testMessage]);
+ });
+
+ it(@"Should route a heartbeat message correctly", ^{
+ testHeader.frameData = SDLFrameInfoHeartbeat;
+ testMessage.header = testHeader;
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+
+ OCMVerify([delegateMock handleHeartbeatForSession:testHeader.sessionID]);
+ });
+
+ it(@"Should route a heartbeat ACK message correctly", ^{
+ testHeader.frameData = SDLFrameInfoHeartbeatACK;
+ testMessage.header = testHeader;
- SDLV2ProtocolMessage* testMessage = [[SDLV2ProtocolMessage alloc] init];
- SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
+ OCMVerify([delegateMock handleHeartbeatACK]);
+ });
+ });
+
+ context(@"When handling a single frame message", ^{
+ __block SDLV2ProtocolMessage *testMessage = nil;
+ __block SDLV2ProtocolHeader *testHeader = nil;
+
+ beforeEach(^{
+ testHeader = [[SDLV2ProtocolHeader alloc] init];
testHeader.frameType = SDLFrameTypeSingle;
testHeader.serviceType = SDLServiceTypeRPC;
- testHeader.frameData = SDLFrameInfoSingleFrame;
testHeader.sessionID = 0x07;
testHeader.bytesInPayload = 0;
-
- testMessage.header = testHeader;
-
+
+ testMessage = [[SDLV2ProtocolMessage alloc] init];
testMessage.payload = [NSData data];
-
+ testMessage.header = testHeader;
+ });
+
+ it(@"Should route the message correctly", ^{
__block BOOL verified = NO;
- [[[[delegateMock stub] andDo: ^(NSInvocation* invocation) {
+ [OCMStub([delegateMock protocol:mockProtocol didReceiveMessage:testMessage]) andDo:^(NSInvocation *invocation) {
verified = YES;
-
- __unsafe_unretained SDLProtocolMessage* message;
-
- [invocation getArgument:&message atIndex:2];
-
- SDLV2ProtocolMessage* messageReceived = (SDLV2ProtocolMessage *)message;
-
+ __unsafe_unretained SDLProtocolMessage *message;
+ [invocation getArgument:&message atIndex:3];
+ SDLV2ProtocolMessage *messageReceived = (SDLV2ProtocolMessage *)message;
+
expect(messageReceived).to(beIdenticalTo(testMessage));
- }] ignoringNonObjectArgs] onProtocolMessageReceived:[OCMArg any]];
-
- SDLProtocolReceivedMessageRouter* router = [[SDLProtocolReceivedMessageRouter alloc] init];
- router.delegate = delegateMock;
-
- [router handleReceivedMessage:testMessage];
+ }];
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
- expect(@(verified)).to(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
- xcontext(@"When handling multi-frame message", ^ {
- it(@"Should route message correctly", ^ {
- //Allocate 2000 bytes and use it as test data
+ context(@"When handling a multi-frame message", ^{
+ __block SDLV2ProtocolMessage *testMessage = nil;
+ __block SDLV2ProtocolHeader *testHeader = nil;
+
+ beforeEach(^{
+ testMessage = [[SDLV2ProtocolMessage alloc] init];
+ testHeader = [[SDLV2ProtocolHeader alloc] init];
+ });
+
+ it(@"Should route the message correctly", ^{
+ // Allocate 2000 bytes and use it as test data
const NSUInteger dataLength = 2000;
char dummyBytes[dataLength];
const char testPayloadHeader[12] = {0x20, 0x55, 0x64, 0x73, 0x12, 0x34, 0x43, 0x21, (dataLength >> 24) & 0xFF, (dataLength >> 16) & 0xFF, (dataLength >> 8) & 0xFF, dataLength & 0xFF};
-
- NSMutableData* payloadData = [NSMutableData dataWithBytes:testPayloadHeader length:12];
+ NSMutableData *payloadData = [NSMutableData dataWithBytes:testPayloadHeader length:12];
[payloadData appendBytes:dummyBytes length:dataLength];
-
- SDLV2ProtocolMessage* testMessage = [[SDLV2ProtocolMessage alloc] init];
- SDLV2ProtocolHeader* testHeader = [[SDLV2ProtocolHeader alloc] init];
-
- //First frame
+
+ // First frame
testHeader.frameType = SDLFrameTypeFirst;
testHeader.serviceType = SDLServiceTypeBulkData;
testHeader.frameData = 1;
testHeader.sessionID = 0x33;
testHeader.bytesInPayload = 8;
-
testMessage.header = testHeader;
const char firstPayload[8] = {(payloadData.length >> 24) & 0xFF, (payloadData.length >> 16) & 0xFF, (payloadData.length >> 8) & 0xFF, payloadData.length & 0xFF, 0x00, 0x00, 0x00, ceil(payloadData.length / 500.0)};
testMessage.payload = [NSData dataWithBytes:firstPayload length:8];
- SDLProtocolReceivedMessageRouter* router = [[SDLProtocolReceivedMessageRouter alloc] init];
-
- [router handleReceivedMessage:testMessage];
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
testMessage.header.frameType = SDLFrameTypeConsecutive;
testMessage.header.bytesInPayload = 500;
@@ -117,29 +197,27 @@ describe(@"HandleReceivedMessage Tests", ^ {
NSUInteger frameNumber = 1;
NSUInteger offset = 0;
while ((offset + 500) < payloadData.length) {
- //Consectutive frames
+ // Consectutive frames
testMessage.header.frameData = frameNumber;
testMessage.payload = [payloadData subdataWithRange:NSMakeRange(offset, 500)];
- [router handleReceivedMessage:testMessage];
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
frameNumber++;
offset += 500;
}
- //Final frame
+ // Final frame
testMessage.header.frameData = 0;
testMessage.payload = [payloadData subdataWithRange:NSMakeRange(offset, payloadData.length - offset)];
-
- id delegateMock = OCMProtocolMock(@protocol(SDLProtocolListener));
-
+
__block BOOL verified = NO;
- [[[delegateMock stub] andDo:^(NSInvocation* invocation) {
+ [OCMStub([delegateMock protocol:mockProtocol didReceiveMessage:[OCMArg any]]) andDo:^(NSInvocation *invocation) {
verified = YES;
- //Without the __unsafe_unretained, a double release will occur. More information: https://github.com/erikdoe/ocmock/issues/123
- __unsafe_unretained SDLProtocolMessage* message;
- [invocation getArgument:&message atIndex:2];
- SDLProtocolMessage* assembledMessage = message;
+ // Without the __unsafe_unretained, a double release will occur. More information: https://github.com/erikdoe/ocmock/issues/123
+ __unsafe_unretained SDLProtocolMessage *message;
+ [invocation getArgument:&message atIndex:3];
+ SDLProtocolMessage *assembledMessage = message;
expect(assembledMessage.payload).to(equal(payloadData));
expect(@(assembledMessage.header.frameType)).to(equal(@(SDLFrameTypeSingle)));
@@ -147,12 +225,11 @@ describe(@"HandleReceivedMessage Tests", ^ {
expect(@(assembledMessage.header.frameData)).to(equal(@(SDLFrameInfoSingleFrame)));
expect(@(assembledMessage.header.sessionID)).to(equal(@0x33));
expect(@(assembledMessage.header.bytesInPayload)).to(equal(@(payloadData.length)));
- }] onProtocolMessageReceived:[OCMArg any]];
-
- router.delegate = delegateMock;
- [router handleReceivedMessage:testMessage];
+ }];
+
+ [router handleReceivedMessage:testMessage protocol:mockProtocol];
- expect(@(verified)).to(beTruthy());
+ expect(verified).toEventually(beTrue());
});
});
});
diff --git a/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m b/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m
index d877d3d39..758da74d9 100644
--- a/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m
+++ b/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m
@@ -4,90 +4,99 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+#import "SDLOnDriverDistraction.h"
#import "SDLHMILevel.h"
-#import "SDLOnLockScreenStatus.h"
#import "SDLLockScreenStatusManager.h"
#import "SDLLockScreenStatus.h"
+#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLOnLockScreenStatus.h"
+#import "SDLRPCNotificationNotification.h"
QuickSpecBegin(SDLLockScreenStatusManagerSpec)
describe(@"the lockscreen status manager", ^{
- __block SDLLockScreenStatusManager *lockScreenManager;
+ __block SDLLockScreenStatusManager *testManager;
+ __block SDLNotificationDispatcher *mockDispatcher;
+
beforeEach(^{
- lockScreenManager = [[SDLLockScreenStatusManager alloc] init];
+ mockDispatcher = OCMClassMock([SDLNotificationDispatcher class]);
+ testManager = [[SDLLockScreenStatusManager alloc] initWithNotificationDispatcher:mockDispatcher];
});
it(@"should properly initialize user selected app boolean to false", ^{
- expect(@(lockScreenManager.userSelected)).to(beFalse());
+ expect(@(testManager.userSelected)).to(beFalse());
});
it(@"should properly initialize driver is distracted boolean to false", ^{
- expect(@(lockScreenManager.driverDistracted)).to(beFalse());
+ expect(@(testManager.driverDistracted)).to(beFalse());
});
it(@"should properly initialize hmi level object to nil", ^{
- expect(lockScreenManager.hmiLevel).to(beNil());
+ expect(testManager.hmiLevel).to(beNil());
});
describe(@"when setting HMI level", ^{
context(@"to FULL", ^{
beforeEach(^{
- lockScreenManager.userSelected = NO;
- lockScreenManager.hmiLevel = SDLHMILevelFull;
+ testManager.userSelected = NO;
+ testManager.hmiLevel = SDLHMILevelFull;
});
it(@"should set user selected to true", ^{
- expect(@(lockScreenManager.userSelected)).to(beTrue());
+ expect(@(testManager.userSelected)).to(beTrue());
});
});
context(@"to LIMITED", ^{
beforeEach(^{
- lockScreenManager.userSelected = NO;
- lockScreenManager.hmiLevel = SDLHMILevelLimited;
+ testManager.userSelected = NO;
+ testManager.hmiLevel = SDLHMILevelLimited;
});
it(@"should set user selected to true", ^{
- expect(@(lockScreenManager.userSelected)).to(beTrue());
+ expect(@(testManager.userSelected)).to(beTrue());
});
});
context(@"to BACKGROUND", ^{
beforeEach(^{
- lockScreenManager.hmiLevel = SDLHMILevelBackground;
+ testManager.hmiLevel = SDLHMILevelBackground;
});
context(@"when user selected is false", ^{
beforeEach(^{
- lockScreenManager.userSelected = NO;
+ testManager.userSelected = NO;
});
it(@"should not alter the value", ^{
- expect(@(lockScreenManager.userSelected)).to(beFalse());
+ expect(@(testManager.userSelected)).to(beFalse());
});
});
context(@"when user selected is true", ^{
beforeEach(^{
- lockScreenManager.userSelected = YES;
+ testManager.userSelected = YES;
});
it(@"should not alter the value", ^{
- expect(@(lockScreenManager.userSelected)).to(beTrue());
+ expect(@(testManager.userSelected)).to(beTrue());
});
});
});
context(@"to NONE", ^{
beforeEach(^{
- lockScreenManager.userSelected = YES;
- lockScreenManager.hmiLevel = SDLHMILevelNone;
+ testManager.userSelected = YES;
+ testManager.hmiLevel = SDLHMILevelNone;
});
it(@"should set user selected to false", ^{
- expect(@(lockScreenManager.userSelected)).to(beFalse());
+ expect(@(testManager.userSelected)).to(beFalse());
});
});
});
@@ -95,71 +104,71 @@ describe(@"the lockscreen status manager", ^{
describe(@"when getting lock screen status", ^{
context(@"when HMI level is nil", ^{
beforeEach(^{
- lockScreenManager.hmiLevel = nil;
+ testManager.hmiLevel = nil;
});
it(@"should return lock screen off", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusOff));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusOff));
#pragma clang diagnostic pop
});
});
context(@"when HMI level is NONE", ^{
beforeEach(^{
- lockScreenManager.hmiLevel = SDLHMILevelNone;
+ testManager.hmiLevel = SDLHMILevelNone;
});
it(@"should return lock screen off", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusOff));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusOff));
#pragma clang diagnostic pop
});
});
context(@"when HMI level is BACKGROUND", ^{
beforeEach(^{
- lockScreenManager.hmiLevel = SDLHMILevelBackground;
+ testManager.hmiLevel = SDLHMILevelBackground;
});
context(@"when user selected is true", ^{
beforeEach(^{
- lockScreenManager.userSelected = YES;
+ testManager.userSelected = YES;
});
context(@"if we do not set the driver distraction state", ^{
it(@"should return lock screen required", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
#pragma clang diagnostic pop
});
});
context(@"if we set the driver distraction state to false", ^{
beforeEach(^{
- lockScreenManager.driverDistracted = NO;
+ testManager.driverDistracted = NO;
});
it(@"should return lock screen optional", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusOptional));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusOptional));
#pragma clang diagnostic pop
});
});
context(@"if we set the driver distraction state to true", ^{
beforeEach(^{
- lockScreenManager.driverDistracted = YES;
+ testManager.driverDistracted = YES;
});
it(@"should return lock screen required", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
#pragma clang diagnostic pop
});
});
@@ -167,13 +176,13 @@ describe(@"the lockscreen status manager", ^{
context(@"when user selected is false", ^{
beforeEach(^{
- lockScreenManager.userSelected = NO;
+ testManager.userSelected = NO;
});
it(@"should return lock screen off", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusOff));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusOff));
#pragma clang diagnostic pop
});
});
@@ -181,40 +190,40 @@ describe(@"the lockscreen status manager", ^{
context(@"when HMI level is LIMITED", ^{
beforeEach(^{
- lockScreenManager.hmiLevel = SDLHMILevelLimited;
+ testManager.hmiLevel = SDLHMILevelLimited;
});
context(@"if we do not set the driver distraction state", ^{
it(@"should return lock screen required", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
#pragma clang diagnostic pop
});
});
context(@"if we set the driver distraction state to false", ^{
beforeEach(^{
- lockScreenManager.driverDistracted = NO;
+ testManager.driverDistracted = NO;
});
it(@"should return lock screen optional", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusOptional));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusOptional));
#pragma clang diagnostic pop
});
});
context(@"if we set the driver distraction state to true", ^{
beforeEach(^{
- lockScreenManager.driverDistracted = YES;
+ testManager.driverDistracted = YES;
});
it(@"should return lock screen required", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
#pragma clang diagnostic pop
});
});
@@ -222,58 +231,58 @@ describe(@"the lockscreen status manager", ^{
context(@"when HMI level is FULL", ^{
beforeEach(^{
- lockScreenManager.hmiLevel = SDLHMILevelFull;
+ testManager.hmiLevel = SDLHMILevelFull;
});
context(@"if we do not set the driver distraction state", ^{
it(@"should return lock screen required", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
#pragma clang diagnostic pop
});
});
context(@"if we set the driver distraction state to false", ^{
beforeEach(^{
- lockScreenManager.driverDistracted = NO;
+ testManager.driverDistracted = NO;
});
it(@"should return lock screen optional", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusOptional));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusOptional));
#pragma clang diagnostic pop
});
});
context(@"if we set the driver distraction state to true", ^{
beforeEach(^{
- lockScreenManager.driverDistracted = YES;
+ testManager.driverDistracted = YES;
});
it(@"should return lock screen required", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(lockScreenManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
+ expect(testManager.lockScreenStatus).to(equal(SDLLockScreenStatusRequired));
#pragma clang diagnostic pop
});
});
});
});
- describe(@"when getting lock screen status notification", ^{
+ describe(@"when sending a lock screen status notification", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
__block SDLOnLockScreenStatus *onLockScreenStatusNotification = nil;
#pragma clang diagnostic pop
beforeEach(^{
- lockScreenManager.userSelected = YES;
- lockScreenManager.driverDistracted = NO;
- lockScreenManager.hmiLevel = SDLHMILevelLimited;
+ testManager.userSelected = YES;
+ testManager.driverDistracted = NO;
+ testManager.hmiLevel = SDLHMILevelLimited;
- onLockScreenStatusNotification = lockScreenManager.lockScreenStatusNotification;
+ onLockScreenStatusNotification = testManager.lockScreenStatusNotification;
});
it(@"should properly return user selected", ^{
@@ -295,6 +304,51 @@ describe(@"the lockscreen status manager", ^{
#pragma clang diagnostic pop
});
});
+
+ describe(@"when receiving an HMI status", ^{
+ __block id lockScreenIconObserver = nil;
+ beforeEach(^{
+ SDLOnHMIStatus *hmiStatus = [[SDLOnHMIStatus alloc] initWithHMILevel:SDLHMILevelFull systemContext:SDLSystemContextMain audioStreamingState:SDLAudioStreamingStateAudible videoStreamingState:nil windowID:nil];
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:mockDispatcher rpcNotification:hmiStatus];
+
+ lockScreenIconObserver = OCMObserverMock();
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ [[NSNotificationCenter defaultCenter] addMockObserver:lockScreenIconObserver name:SDLDidChangeLockScreenStatusNotification object:testManager];
+ [[lockScreenIconObserver expect] notificationWithName:SDLDidChangeLockScreenStatusNotification object:[OCMArg any] userInfo:[OCMArg any]];
+#pragma clang diagnostic pop
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should update the driver distraction status and send a notification", ^{
+ expect(testManager.hmiLevel).to(equal(SDLHMILevelFull));
+ OCMVerifyAll(lockScreenIconObserver);
+ });
+ });
+
+ describe(@"when receiving a driver distraction status", ^{
+ __block id lockScreenIconObserver = nil;
+ beforeEach(^{
+ SDLOnDriverDistraction *driverDistraction = [[SDLOnDriverDistraction alloc] init];
+ driverDistraction.state = SDLDriverDistractionStateOn;
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeDriverDistractionStateNotification object:mockDispatcher rpcNotification:driverDistraction];
+
+ lockScreenIconObserver = OCMObserverMock();
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ [[NSNotificationCenter defaultCenter] addMockObserver:lockScreenIconObserver name:SDLDidChangeLockScreenStatusNotification object:testManager];
+ [[lockScreenIconObserver expect] notificationWithName:SDLDidChangeLockScreenStatusNotification object:[OCMArg any] userInfo:[OCMArg any]];
+#pragma clang diagnostic pop
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+
+ it(@"should update the driver distraction status and send a notification", ^{
+ expect(testManager.driverDistracted).to(beTrue());
+ OCMVerifyAll(lockScreenIconObserver);
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m b/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m
index b110af0f6..b7279a352 100644
--- a/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m
+++ b/SmartDeviceLinkTests/ProxySpecs/SDLSecondaryTransportManagerSpec.m
@@ -14,18 +14,18 @@
#import "SDLControlFramePayloadRegisterSecondaryTransportNak.h"
#import "SDLControlFramePayloadRPCStartServiceAck.h"
#import "SDLControlFramePayloadTransportEventUpdate.h"
+#import "SDLFakeSecurityManager.h"
#import "SDLHMILevel.h"
#import "SDLIAPTransport.h"
#import "SDLNotificationConstants.h"
-#import "SDLRPCNotificationNotification.h"
+#import "SDLOnHMIStatus.h"
#import "SDLProtocol.h"
+#import "SDLRPCNotificationNotification.h"
#import "SDLSecondaryTransportManager.h"
#import "SDLStateMachine.h"
#import "SDLTCPTransport.h"
+#import "SDLTimer.h"
#import "SDLV2ProtocolMessage.h"
-#import "SDLFakeSecurityManager.h"
-#import "SDLHMILevel.h"
-#import "SDLOnHMIStatus.h"
/* copied from SDLSecondaryTransportManager.m */
typedef NSNumber SDLServiceTypeBox;
@@ -44,7 +44,8 @@ typedef NS_ENUM(NSInteger, SDLSecondaryTransportType) {
};
// should be in sync with SDLSecondaryTransportManager.m
-static const float RetryConnectionDelay = 5.0;
+static const float RetryConnectionDelay = 5.25;
+static const float RegisterTransportTime = 10.25;
static const int TCPPortUnspecified = -1;
@@ -62,46 +63,14 @@ static const int TCPPortUnspecified = -1;
@property (strong, nonatomic, nullable) NSString *ipAddress;
@property (assign, nonatomic) int tcpPort;
@property (strong, nonatomic, nullable) SDLHMILevel currentHMILevel;
+@property (assign, nonatomic) UIApplicationState currentApplicationState;
@property (strong, nonatomic) SDLBackgroundTaskManager *backgroundTaskManager;
+@property (strong, nonatomic, nullable) SDLTimer *registerTransportTimer;
- (nullable BOOL (^)(void))sdl_backgroundTaskEndedHandler;
@end
-@interface SDLSecondaryTransportManager (ForTest)
-// Swap sdl_getAppState method to dummy implementation.
-// Since the test runs on the main thread, dispatch_sync()-ing to the main thread freezes the tests.
-+ (void)swapGetActiveAppStateMethod;
-+ (void)swapGetInactiveAppStateMethod;
-@end
-
-@implementation SDLSecondaryTransportManager (ForTest)
-
-- (UIApplicationState)dummyGetActiveAppState {
- NSLog(@"Testing: app state for secondary transport manager is ACTIVE");
- return UIApplicationStateActive;
-}
-
-+ (void)swapGetActiveAppStateMethod {
- SEL selector = NSSelectorFromString(@"sdl_getAppState");
- Method from = class_getInstanceMethod(self, selector);
- Method to = class_getInstanceMethod(self, @selector(dummyGetActiveAppState));
- method_exchangeImplementations(from, to);
-}
-
-- (UIApplicationState)dummyGetInactiveAppState {
- NSLog(@"Testing: app state for secondary transport manager is INACTIVE");
- return UIApplicationStateBackground;
-}
-
-+ (void)swapGetInactiveAppStateMethod {
- SEL selector = NSSelectorFromString(@"sdl_getAppState");
- Method from = class_getInstanceMethod(self, selector);
- Method to = class_getInstanceMethod(self, @selector(dummyGetInactiveAppState));
- method_exchangeImplementations(from, to);
-}
-
-@end
@interface SDLTCPTransport (ConnectionDisabled)
// Disable connect and disconnect methods
@@ -121,12 +90,13 @@ static const int TCPPortUnspecified = -1;
Method to = class_getInstanceMethod(self, @selector(dummyConnect));
method_exchangeImplementations(from, to);
- from = class_getInstanceMethod(self, @selector(disconnect));
+ from = class_getInstanceMethod(self, @selector(disconnectWithCompletionHandler:));
to = class_getInstanceMethod(self, @selector(dummyDisconnect));
method_exchangeImplementations(from, to);
}
@end
+
@interface SDLIAPTransport (ConnectionDisabled)
// Disable connect and disconnect methods
+ (void)swapConnectionMethods;
@@ -145,7 +115,7 @@ static const int TCPPortUnspecified = -1;
Method to = class_getInstanceMethod(self, @selector(dummyConnect));
method_exchangeImplementations(from, to);
- from = class_getInstanceMethod(self, @selector(disconnect));
+ from = class_getInstanceMethod(self, @selector(disconnectWithCompletionHandler:));
to = class_getInstanceMethod(self, @selector(dummyDisconnect));
method_exchangeImplementations(from, to);
}
@@ -166,12 +136,9 @@ describe(@"the secondary transport manager ", ^{
hmiStatus.hmiLevel = hmiLevel;
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:self rpcNotification:hmiStatus];
[[NSNotificationCenter defaultCenter] postNotification:notification];
-
- [NSThread sleepForTimeInterval:0.3];
};
beforeEach(^{
- [SDLSecondaryTransportManager swapGetActiveAppStateMethod];
[SDLTCPTransport swapConnectionMethods];
[SDLIAPTransport swapConnectionMethods];
@@ -179,6 +146,8 @@ describe(@"the secondary transport manager ", ^{
testStreamingProtocolDelegate = OCMStrictProtocolMock(@protocol(SDLStreamingProtocolDelegate));
testStateMachineQueue = dispatch_queue_create("com.sdl.testsecondarytransportmanager", DISPATCH_QUEUE_SERIAL);
manager = [[SDLSecondaryTransportManager alloc] initWithStreamingProtocolDelegate:testStreamingProtocolDelegate serialQueue:testStateMachineQueue];
+
+ manager.currentApplicationState = UIApplicationStateActive;
});
afterEach(^{
@@ -186,14 +155,10 @@ describe(@"the secondary transport manager ", ^{
// (Don't put OCMVerifyAll() after calling stop.)
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:OCMOCK_ANY toNewVideoProtocol:nil fromOldAudioProtocol:OCMOCK_ANY toNewAudioProtocol:nil]);
- dispatch_sync(testStateMachineQueue, ^{
- [manager stop];
- });
manager = nil;
[SDLIAPTransport swapConnectionMethods];
[SDLTCPTransport swapConnectionMethods];
- [SDLSecondaryTransportManager swapGetActiveAppStateMethod];
});
@@ -211,31 +176,50 @@ describe(@"the secondary transport manager ", ^{
describe(@"when started", ^{
beforeEach(^{
- testPrimaryProtocol = [[SDLProtocol alloc] init];
+ testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
});
- it(@"should transition to Started state", ^{
+ it(@"if in the stopped state, it should transition to state started", ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateStopped fromOldState:nil callEnterTransition:YES];
+
dispatch_sync(testStateMachineQueue, ^{
[manager startWithPrimaryProtocol:testPrimaryProtocol];
});
expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStarted));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ });
+
+ it(@"if not in the stopped state, it should stay in the same state", ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateConfigured fromOldState:nil callEnterTransition:YES];
+
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager startWithPrimaryProtocol:testPrimaryProtocol];
+ });
+
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
});
});
describe(@"In Started state", ^{
beforeEach(^{
// In the tests, we assume primary transport is iAP
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
- testPrimaryProtocol.transport = testPrimaryTransport;
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
dispatch_sync(testStateMachineQueue, ^{
[manager startWithPrimaryProtocol:testPrimaryProtocol];
});
});
+ it(@"should ignore the primary transport being opened before the secondary transport is established", ^{
+ manager.secondaryProtocol = nil;
+
+ [testPrimaryProtocol onTransportConnected];
+
+ expect(manager.registerTransportTimer).to(beNil());
+ });
+
describe(@"when received Start Service ACK on primary transport", ^{
__block SDLProtocolHeader *testStartServiceACKHeader = nil;
__block SDLProtocolMessage *testStartServiceACKMessage = nil;
@@ -272,18 +256,16 @@ describe(@"the secondary transport manager ", ^{
// in this configuration, only audio service is allowed on primary transport
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:nil fromOldAudioProtocol:nil toNewAudioProtocol:testPrimaryProtocol]);
- [testPrimaryProtocol handleBytesFromTransport:testStartServiceACKMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
+ [testPrimaryProtocol onDataReceived:testStartServiceACKMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionTCP));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionTCP));
NSArray<SDLTransportClassBox *> *expectedTransportsForAudioService = @[@(SDLTransportClassSecondary), @(SDLTransportClassPrimary)];
- expect(manager.transportsForAudioService).to(equal(expectedTransportsForAudioService));
+ expect(manager.transportsForAudioService).toEventually(equal(expectedTransportsForAudioService));
NSArray<SDLTransportClassBox *> *expectedTransportsForVideoService = @[@(SDLTransportClassSecondary)];
- expect(manager.transportsForVideoService).to(equal(expectedTransportsForVideoService));
+ expect(manager.transportsForVideoService).toEventually(equal(expectedTransportsForVideoService));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -300,16 +282,14 @@ describe(@"the secondary transport manager ", ^{
// in this case, audio and video services start on primary transport (for compatibility)
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:testPrimaryProtocol fromOldAudioProtocol:nil toNewAudioProtocol:testPrimaryProtocol]);
- [testPrimaryProtocol handleBytesFromTransport:testStartServiceACKMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ [testPrimaryProtocol onDataReceived:testStartServiceACKMessage.data];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
-
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionTCP));
- expect(manager.transportsForAudioService).to(equal(@[@(SDLTransportClassPrimary)]));
- expect(manager.transportsForVideoService).to(equal(@[@(SDLTransportClassPrimary)]));
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionTCP));
+ expect(manager.transportsForAudioService).toEventually(equal(@[@(SDLTransportClassPrimary)]));
+ expect(manager.transportsForVideoService).toEventually(equal(@[@(SDLTransportClassPrimary)]));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -324,21 +304,17 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Configured state with transport type disabled", ^{
- // Since primary transport is iAP, we cannot use iAP for secondary transport.
- // So both services run on primary transport.
+ // Since primary transport is iAP, we cannot use iAP for secondary transport. This means both services run on primary transport.
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:testPrimaryProtocol fromOldAudioProtocol:nil toNewAudioProtocol:testPrimaryProtocol]);
- [testPrimaryProtocol handleBytesFromTransport:testStartServiceACKMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
+ [testPrimaryProtocol onDataReceived:testStartServiceACKMessage.data];
- // see the comment above
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionDisabled));
- expect(manager.transportsForAudioService).to(equal(@[@(SDLTransportClassPrimary)]));
- expect(manager.transportsForVideoService).to(equal(@[@(SDLTransportClassPrimary)]));
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionDisabled));
+ expect(manager.transportsForAudioService).toEventually(equal(@[@(SDLTransportClassPrimary)]));
+ expect(manager.transportsForVideoService).toEventually(equal(@[@(SDLTransportClassPrimary)]));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -352,16 +328,14 @@ describe(@"the secondary transport manager ", ^{
// both services run on primary transport
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:testPrimaryProtocol fromOldAudioProtocol:nil toNewAudioProtocol:testPrimaryProtocol]);
- [testPrimaryProtocol handleBytesFromTransport:testStartServiceACKMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ [testPrimaryProtocol onDataReceived:testStartServiceACKMessage.data];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
-
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionDisabled));
- expect(manager.transportsForAudioService).to(equal(@[@(SDLTransportClassPrimary)]));
- expect(manager.transportsForVideoService).to(equal(@[@(SDLTransportClassPrimary)]));
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionDisabled));
+ expect(manager.transportsForAudioService).toEventually(equal(@[@(SDLTransportClassPrimary)]));
+ expect(manager.transportsForVideoService).toEventually(equal(@[@(SDLTransportClassPrimary)]));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
});
@@ -386,18 +360,18 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should configure its properties but stay in Started state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ OCMReject([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:[OCMArg any] fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:[OCMArg any]]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStarted));
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionDisabled));
- expect(manager.transportsForAudioService).to(equal(@[]));
- expect(manager.transportsForVideoService).to(equal(@[]));
- expect(manager.ipAddress).to(equal(testTcpIpAddress));
- expect(manager.tcpPort).to(equal(testTcpPort));
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateStarted));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionDisabled));
+ expect(manager.transportsForAudioService).toEventually(equal(@[]));
+ expect(manager.transportsForVideoService).toEventually(equal(@[]));
+ expect(manager.ipAddress).toEventually(equal(testTcpIpAddress));
+ expect(manager.tcpPort).toEventually(equal(testTcpPort));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -440,30 +414,31 @@ describe(@"the secondary transport manager ", ^{
testStartServiceACKPayload = [[SDLControlFramePayloadRPCStartServiceAck alloc] initWithHashId:testHashId mtu:testMtu authToken:nil protocolVersion:testProtocolVersion secondaryTransports:testSecondaryTransports audioServiceTransports:testAudioServiceTransports videoServiceTransports:testVideoServiceTransports];
testStartServiceACKMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testStartServiceACKHeader andPayload:testStartServiceACKPayload.data];
manager.currentHMILevel = SDLHMILevelFull;
+ manager.currentApplicationState = UIApplicationStateActive;
});
it(@"should configure its properties and immediately transition to Connecting state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [testPrimaryProtocol handleBytesFromTransport:testStartServiceACKMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ // audio and video services will not start until secondary transport is established
+ OCMReject([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:[OCMArg any] fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:[OCMArg any]]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ [testPrimaryProtocol onDataReceived:testStartServiceACKMessage.data];
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionTCP));
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionTCP));
NSArray<SDLTransportClassBox *> *expectedTransportsForAudioService = @[@(SDLTransportClassSecondary)];
- expect(manager.transportsForAudioService).to(equal(expectedTransportsForAudioService));
+ expect(manager.transportsForAudioService).toEventually(equal(expectedTransportsForAudioService));
NSArray<SDLTransportClassBox *> *expectedTransportsForVideoService = @[@(SDLTransportClassSecondary)];
- expect(manager.transportsForVideoService).to(equal(expectedTransportsForVideoService));
- expect(manager.ipAddress).to(equal(testTcpIpAddress));
- expect(manager.tcpPort).to(equal(testTcpPort));
+ expect(manager.transportsForVideoService).toEventually(equal(expectedTransportsForVideoService));
+ expect(manager.ipAddress).toEventually(equal(testTcpIpAddress));
+ expect(manager.tcpPort).toEventually(equal(testTcpPort));
SDLTCPTransport *secondaryTransport = (SDLTCPTransport *)manager.secondaryTransport;
- expect(secondaryTransport.hostName).to(equal(testTcpIpAddress));
+ expect(secondaryTransport.hostName).toEventually(equal(testTcpIpAddress));
NSString *portNumberString = [NSString stringWithFormat:@"%d", testTcpPort];
- expect(secondaryTransport.portNumber).to(equal(portNumberString));
+ expect(secondaryTransport.portNumber).toEventually(equal(portNumberString));
- // audio and video services will not start until secondary transport is established
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -480,36 +455,37 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should configure its properties and transition to Configured state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [testPrimaryProtocol handleBytesFromTransport:testStartServiceACKMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ // audio and video services will not start until secondary transport is established
+ OCMReject([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:[OCMArg any] fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:[OCMArg any]]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ [testPrimaryProtocol onDataReceived:testStartServiceACKMessage.data];
- expect((NSInteger)manager.secondaryTransportType).to(equal(SDLTransportSelectionTCP));
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ expect((NSInteger)manager.secondaryTransportType).toEventually(equal(SDLTransportSelectionTCP));
NSArray<SDLTransportClassBox *> *expectedTransportsForAudioService = @[@(SDLTransportClassSecondary)];
- expect(manager.transportsForAudioService).to(equal(expectedTransportsForAudioService));
+ expect(manager.transportsForAudioService).toEventually(equal(expectedTransportsForAudioService));
NSArray<SDLTransportClassBox *> *expectedTransportsForVideoService = @[@(SDLTransportClassSecondary)];
- expect(manager.transportsForVideoService).to(equal(expectedTransportsForVideoService));
- expect(manager.ipAddress).to(equal(testTcpIpAddress));
- expect(manager.tcpPort).to(equal(testTcpPort));
+ expect(manager.transportsForVideoService).toEventually(equal(expectedTransportsForVideoService));
+ expect(manager.ipAddress).toEventually(equal(testTcpIpAddress));
+ expect(manager.tcpPort).toEventually(equal(testTcpPort));
+ expect(manager.secondaryTransport).toEventually(beNil());
- expect(manager.secondaryTransport).to(beNil());
-
- // audio and video services will not start until secondary transport is established
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
});
describe(@"when stopped", ^{
- it(@"should transition to Stopped state", ^{
- dispatch_sync(testStateMachineQueue, ^{
- [manager stop];
+ it(@"should transition to the Stopped state", ^{
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
});
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
});
@@ -518,9 +494,8 @@ describe(@"the secondary transport manager ", ^{
describe(@"if secondary transport is iAP", ^{
beforeEach(^{
// in this case we assume the primary transport is TCP
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLTCPTransport alloc] init];
- testPrimaryProtocol.transport = testPrimaryTransport;
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
testPrimaryProtocol.securityManager = OCMClassMock([SDLFakeSecurityManager class]);
dispatch_sync(testStateMachineQueue, ^{
@@ -539,8 +514,6 @@ describe(@"the secondary transport manager ", ^{
expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
expect(manager.currentHMILevel).to(beNil());
expect(manager.secondaryProtocol.securityManager).to(beNil());
-
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
@@ -553,16 +526,14 @@ describe(@"the secondary transport manager ", ^{
expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
expect(manager.currentHMILevel).to(equal(SDLHMILevelFull));
expect(manager.secondaryProtocol.securityManager).to(equal(testPrimaryProtocol.securityManager));
-
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
});
describe(@"if secondary transport is TCP", ^{
beforeEach(^{
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
testPrimaryProtocol.transport = testPrimaryTransport;
dispatch_sync(testStateMachineQueue, ^{
@@ -581,8 +552,6 @@ describe(@"the secondary transport manager ", ^{
describe(@"and Transport Event Update is not received", ^{
it(@"should stay in Configured state", ^{
expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
-
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
@@ -605,18 +574,14 @@ describe(@"the secondary transport manager ", ^{
testTransportEventUpdateMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testTransportEventUpdateHeader andPayload:testTransportEventUpdatePayload.data];
testPrimaryProtocol.securityManager = OCMClassMock([SDLFakeSecurityManager class]);
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
});
context(@"before the app context is HMI FULL", ^{
it(@"should stay in Configured state", ^{
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
- expect(manager.currentHMILevel).to(beNil());
- expect(manager.secondaryProtocol.securityManager).to(beNil());
-
- OCMVerifyAll(testStreamingProtocolDelegate);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ expect(manager.currentHMILevel).toEventually(beNil());
+ expect(manager.secondaryProtocol.securityManager).toEventually(beNil());
});
});
@@ -626,11 +591,9 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Connecting", ^{
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
- expect(manager.currentHMILevel).to(equal(SDLHMILevelFull));
- expect(manager.secondaryProtocol.securityManager).to(equal(testPrimaryProtocol.securityManager));
-
- OCMVerifyAll(testStreamingProtocolDelegate);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
+ expect(manager.currentHMILevel).toEventually(equal(SDLHMILevelFull));
+ expect(manager.secondaryProtocol.securityManager).toEventually(equal(testPrimaryProtocol.securityManager));
});
});
});
@@ -638,8 +601,8 @@ describe(@"the secondary transport manager ", ^{
describe(@"when stopped", ^{
beforeEach(^{
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
testPrimaryProtocol.transport = testPrimaryTransport;
dispatch_sync(testStateMachineQueue, ^{
@@ -649,12 +612,14 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Stopped state", ^{
- dispatch_sync(testStateMachineQueue, ^{
- [manager stop];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
});
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
});
@@ -664,12 +629,11 @@ describe(@"the secondary transport manager ", ^{
__block id testSecondaryProtocolMock = nil;
beforeEach(^{
- secondaryProtocol = [[SDLProtocol alloc] init];
+ secondaryProtocol = [[SDLProtocol alloc] initWithTransport:[[SDLTCPTransport alloc] init] encryptionManager:nil];
testSecondaryProtocolMock = OCMPartialMock(secondaryProtocol);
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
- testPrimaryProtocol.transport = testPrimaryTransport;
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
dispatch_sync(testStateMachineQueue, ^{
[manager startWithPrimaryProtocol:testPrimaryProtocol];
});
@@ -686,13 +650,11 @@ describe(@"the secondary transport manager ", ^{
it(@"should send out Register Secondary Transport frame", ^{
OCMExpect([testSecondaryProtocolMock registerSecondaryTransport]);
- [testSecondaryProtocolMock onProtocolOpened];
- [NSThread sleepForTimeInterval:0.1];
+ [testSecondaryProtocolMock onTransportConnected];
- OCMVerifyAll(testSecondaryProtocolMock);
- OCMVerifyAll(testStreamingProtocolDelegate);
+ OCMVerifyAllWithDelay(testSecondaryProtocolMock, 0.5);
- // Note: cannot test the timeout scenario since the timer fires on main thread
+ expect(manager.registerTransportTimer).toNot(beNil());
});
describe(@"and Register Secondary Transport ACK is received", ^{
@@ -717,11 +679,10 @@ describe(@"the secondary transport manager ", ^{
it(@"should transition to Registered state", ^{
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:secondaryProtocol fromOldAudioProtocol:nil toNewAudioProtocol:secondaryProtocol]);
- [testSecondaryProtocolMock handleBytesFromTransport:testRegisterSecondaryTransportAckMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ [testSecondaryProtocolMock onDataReceived:testRegisterSecondaryTransportAckMessage.data];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateRegistered));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateRegistered));
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -742,22 +703,64 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Reconnecting state", ^{
- [testSecondaryProtocolMock handleBytesFromTransport:testRegisterSecondaryTransportNakMessage.data];
- [NSThread sleepForTimeInterval:0.1];
+ [testSecondaryProtocolMock onDataReceived:testRegisterSecondaryTransportNakMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ });
+ });
+
+ describe(@"and timeout occurs while waiting for the module to respond to the Register Secondary Transport request", ^{
+ beforeEach(^{
+ // assume audio and video services are allowed only on secondary transport
+ manager.transportsForAudioService = @[@(SDLTransportClassSecondary)];
+ manager.transportsForVideoService = @[@(SDLTransportClassSecondary)];
+ manager.streamingServiceTransportMap[@(SDLServiceTypeAudio)] = @(SDLTransportClassSecondary);
+ manager.streamingServiceTransportMap[@(SDLServiceTypeVideo)] = @(SDLTransportClassSecondary);
+ });
+
+ it(@"if in the Connecting state it should transition to Reconnecting state", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateConnecting fromOldState:nil callEnterTransition:NO];
+ });
+
+ [testSecondaryProtocolMock onTransportConnected];
+
+ 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];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ });
+
+ it(@"if not in the Connecting state it should not try to reconnect", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateReconnecting fromOldState:nil callEnterTransition:NO];
+ });
+
+ [testSecondaryProtocolMock onTransportConnected];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateReconnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ // 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));
});
});
});
describe(@"when transport is closed", ^{
it(@"should transition to Reconnecting state", ^{
- [testSecondaryProtocolMock onProtocolClosed];
- [NSThread sleepForTimeInterval:0.1];
+ OCMExpect([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onTransportDisconnected];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateReconnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -789,11 +792,8 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should ignore the frame and stay in Connecting state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
});
});
@@ -808,11 +808,8 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Configured state, then transition to Connecting state again", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
});
});
@@ -826,11 +823,8 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Configured state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
});
});
@@ -838,27 +832,28 @@ describe(@"the secondary transport manager ", ^{
describe(@"when stopped", ^{
it(@"should transition to Stopped state", ^{
- dispatch_sync(testStateMachineQueue, ^{
- [manager stop];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
});
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
});
-
describe(@"In Registered state", ^{
__block SDLProtocol *secondaryProtocol = nil;
__block id testSecondaryProtocolMock = nil;
beforeEach(^{
- secondaryProtocol = [[SDLProtocol alloc] init];
+ secondaryProtocol = [[SDLProtocol alloc] initWithTransport:[[SDLTCPTransport alloc] init] encryptionManager:nil];
testSecondaryProtocolMock = OCMPartialMock(secondaryProtocol);
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
testPrimaryProtocol.transport = testPrimaryTransport;
dispatch_sync(testStateMachineQueue, ^{
[manager startWithPrimaryProtocol:testPrimaryProtocol];
@@ -907,11 +902,8 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should ignore the frame and stay in Registered state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateRegistered));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateRegistered));
});
});
@@ -927,11 +919,9 @@ describe(@"the secondary transport manager ", ^{
it(@"should transition to Configured state, then transition to Connecting state again", ^{
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:secondaryProtocol toNewVideoProtocol:nil fromOldAudioProtocol:secondaryProtocol toNewAudioProtocol:nil]);
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -947,11 +937,9 @@ describe(@"the secondary transport manager ", ^{
it(@"should transition to Configured state", ^{
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:secondaryProtocol toNewVideoProtocol:nil fromOldAudioProtocol:secondaryProtocol toNewAudioProtocol:nil]);
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
});
@@ -966,13 +954,12 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Reconnecting state", ^{
- OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:secondaryProtocol toNewVideoProtocol:nil fromOldAudioProtocol:secondaryProtocol toNewAudioProtocol:nil]);
+ OCMExpect([testStreamingProtocolDelegate transportClosed]);
- [testSecondaryProtocolMock onProtocolClosed];
- [NSThread sleepForTimeInterval:0.1];
+ [testSecondaryProtocolMock onTransportDisconnected];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateReconnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
});
});
@@ -988,21 +975,22 @@ describe(@"the secondary transport manager ", ^{
it(@"should transition to Stopped state", ^{
OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:secondaryProtocol toNewVideoProtocol:nil fromOldAudioProtocol:secondaryProtocol toNewAudioProtocol:nil]);
- dispatch_sync(testStateMachineQueue, ^{
- [manager stop];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
});
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
});
-
describe(@"In Reconnecting state", ^{
beforeEach(^{
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
testPrimaryProtocol.transport = testPrimaryTransport;
dispatch_sync(testStateMachineQueue, ^{
[manager startWithPrimaryProtocol:testPrimaryProtocol];
@@ -1024,12 +1012,11 @@ describe(@"the secondary transport manager ", ^{
});
// wait for the timer
- float waitTime = RetryConnectionDelay + 5.0;
- NSLog(@"Please wait for reconnection timeout ... (for %f seconds)", waitTime);
+ float waitTime = RetryConnectionDelay;
+ NSLog(@"Please wait for reconnection timeout... (for %.02f seconds)", waitTime);
[NSThread sleepForTimeInterval:waitTime];
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
});
});
@@ -1061,11 +1048,8 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should ignore the frame and stay in Reconnecting state", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateReconnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
});
});
@@ -1080,11 +1064,8 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Configured state before timeout, then transition to Connecting state again", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
});
});
@@ -1098,42 +1079,41 @@ describe(@"the secondary transport manager ", ^{
});
it(@"should transition to Configured state before timeout", ^{
- [testPrimaryProtocol handleBytesFromTransport:testTransportEventUpdateMessage.data];
- [NSThread sleepForTimeInterval:0.1];
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
- OCMVerifyAll(testStreamingProtocolDelegate);
+ [testPrimaryProtocol onDataReceived:testTransportEventUpdateMessage.data];
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
});
});
});
describe(@"when stopped", ^{
it(@"should transition to Stopped state", ^{
- dispatch_sync(testStateMachineQueue, ^{
- [manager stop];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
});
-
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
- OCMVerifyAll(testStreamingProtocolDelegate);
});
});
});
describe(@"app lifecycle state change", ^{
- __block SDLBackgroundTaskManager *mockBackgroundTaskManager = nil;
+ __block id mockBackgroundTaskManager = nil;
beforeEach(^{
// In the tests, we assume primary transport is iAP
- testPrimaryProtocol = [[SDLProtocol alloc] init];
testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
testPrimaryProtocol.transport = testPrimaryTransport;
+ mockBackgroundTaskManager = OCMClassMock([SDLBackgroundTaskManager class]);
+ manager.backgroundTaskManager = mockBackgroundTaskManager;
+
dispatch_sync(testStateMachineQueue, ^{
[manager startWithPrimaryProtocol:testPrimaryProtocol];
});
-
- mockBackgroundTaskManager = OCMPartialMock([[SDLBackgroundTaskManager alloc] initWithBackgroundTaskName:@"com.test.backgroundTask"]);
- manager.backgroundTaskManager = mockBackgroundTaskManager;
});
context(@"app enters the background", ^{
@@ -1144,32 +1124,32 @@ describe(@"the secondary transport manager ", ^{
describe(@"if the secondary transport is connected", ^{
beforeEach(^{
[manager.stateMachine setToState:SDLSecondaryTransportStateRegistered fromOldState:nil callEnterTransition:NO];
+ });
+
+ it(@"should start a background task and stay connected", ^{
+ OCMExpect([mockBackgroundTaskManager startBackgroundTask]);
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillResignActiveNotification object:nil];
- // Wait for the notification to propagate
- [NSThread sleepForTimeInterval:0.1];
- });
+ OCMVerifyAllWithDelay(mockBackgroundTaskManager, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateRegistered));
- it(@"should start a background task and stay connected", ^{
- OCMVerify([mockBackgroundTaskManager startBackgroundTask]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateRegistered));
});
});
describe(@"if the secondary transport has not yet connected", ^{
beforeEach(^{
[manager.stateMachine setToState:SDLSecondaryTransportStateConfigured fromOldState:nil callEnterTransition:NO];
-
- [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillResignActiveNotification object:nil];
-
- // Wait for the notification to propagate
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should ignore the state change notification", ^{
OCMReject([mockBackgroundTaskManager startBackgroundTask]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConfigured));
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillResignActiveNotification object:nil];
+
+ OCMVerifyAllWithDelay(mockBackgroundTaskManager, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+
});
});
});
@@ -1178,16 +1158,16 @@ describe(@"the secondary transport manager ", ^{
describe(@"if the secondary transport is still connected", ^{
beforeEach(^{
[manager.stateMachine setToState:SDLSecondaryTransportStateRegistered fromOldState:nil callEnterTransition:NO];
+ });
+
+ it(@"should end the background task and stay in the connected state", ^{
+ OCMExpect([mockBackgroundTaskManager endBackgroundTask]);
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
- // Wait for the notification to propagate
- [NSThread sleepForTimeInterval:0.1];
- });
+ OCMVerifyAllWithDelay(mockBackgroundTaskManager, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateRegistered));
- it(@"should end the background task and stay in the connected state", ^{
- OCMVerify([mockBackgroundTaskManager endBackgroundTask]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateRegistered));
});
});
@@ -1199,32 +1179,30 @@ describe(@"the secondary transport manager ", ^{
manager.secondaryTransportType = SDLTransportSelectionTCP;
[manager.stateMachine setToState:SDLSecondaryTransportStateConfigured fromOldState:nil callEnterTransition:NO];
-
- [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
-
- // Wait for the notification to propagate
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should end the background task and try to restart the TCP transport", ^{
- OCMVerify([mockBackgroundTaskManager endBackgroundTask]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
+ OCMExpect([mockBackgroundTaskManager endBackgroundTask]);
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
+
+ OCMVerifyAllWithDelay(mockBackgroundTaskManager, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
});
});
describe(@"if the secondary transport not connected and is not configured", ^{
beforeEach(^{
[manager.stateMachine setToState:SDLSecondaryTransportStateConnecting fromOldState:nil callEnterTransition:NO];
-
- [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
-
- // Wait for the notification to propagate
- [NSThread sleepForTimeInterval:0.1];
});
it(@"should ignore the state change notification", ^{
OCMReject([mockBackgroundTaskManager endBackgroundTask]);
- expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateConnecting));
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidBecomeActiveNotification object:nil];
+
+ OCMVerifyAllWithDelay(mockBackgroundTaskManager, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConnecting));
});
});
});
@@ -1232,7 +1210,7 @@ describe(@"the secondary transport manager ", ^{
describe(@"When the background task expires", ^{
context(@"If the app is still in the background", ^{
beforeEach(^{
- [SDLSecondaryTransportManager swapGetInactiveAppStateMethod];
+ manager.currentApplicationState = UIApplicationStateBackground;
});
it(@"should stop the TCP transport if the app is still in the background and perform cleanup before ending the background task", ^{
@@ -1254,7 +1232,7 @@ describe(@"the secondary transport manager ", ^{
});
afterEach(^{
- [SDLSecondaryTransportManager swapGetInactiveAppStateMethod];
+ manager.currentApplicationState = UIApplicationStateActive;
});
});
@@ -1270,6 +1248,223 @@ describe(@"the secondary transport manager ", ^{
});
});
});
+
+ describe(@"when the secondary transport is closed", ^{
+ __block SDLProtocol *secondaryProtocol = nil;
+ __block id testSecondaryProtocolMock = nil;
+
+ beforeEach(^{
+ testPrimaryTransport = [[SDLIAPTransport alloc] init];
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
+ secondaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
+ testSecondaryProtocolMock = OCMPartialMock(secondaryProtocol);
+
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager startWithPrimaryProtocol:testPrimaryProtocol];
+ });
+
+ [secondaryProtocol.protocolDelegateTable addObject:manager];
+ manager.secondaryProtocol = secondaryProtocol;
+ });
+
+ it(@"should transition to Reconnecting state if in state connecting", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateConnecting fromOldState:nil callEnterTransition:NO];
+ });
+
+ OCMExpect([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onTransportDisconnected];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ });
+
+ it(@"should transition to Reconnecting state if in state registered", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateRegistered fromOldState:nil callEnterTransition:NO];
+ });
+
+ OCMExpect([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onTransportDisconnected];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ });
+
+ it(@"should stay in the same state if not in the connecting or registered states", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateConfigured fromOldState:nil callEnterTransition:NO];
+ });
+
+ OCMReject([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onTransportDisconnected];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ });
+ });
+
+ describe(@"when the secondary transport errors (wifi turned off or socket breaks)", ^{
+ __block SDLProtocol *secondaryProtocol = nil;
+ __block id testSecondaryProtocolMock = nil;
+
+ beforeEach(^{
+ secondaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
+ testSecondaryProtocolMock = OCMPartialMock(secondaryProtocol);
+ testPrimaryProtocol = [[SDLProtocol alloc] initWithTransport:testPrimaryTransport encryptionManager:nil];
+ testPrimaryTransport = [[SDLIAPTransport alloc] init];
+
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager startWithPrimaryProtocol:testPrimaryProtocol];
+ });
+
+ [secondaryProtocol.protocolDelegateTable addObject:manager];
+ manager.secondaryProtocol = secondaryProtocol;
+ });
+
+ it(@"should transition to Reconnecting state if in state connecting", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateConnecting fromOldState:nil callEnterTransition:NO];
+ });
+
+ OCMExpect([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onError:[OCMArg any]];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ });
+
+ it(@"should transition to Reconnecting state if in state registered", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateRegistered fromOldState:nil callEnterTransition:NO];
+ });
+
+ OCMExpect([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onError:[OCMArg any]];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateReconnecting));
+ });
+
+ it(@"should stay in the same state if not in the connecting or registered states", ^{
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateConfigured fromOldState:nil callEnterTransition:NO];
+ });
+
+ OCMReject([testStreamingProtocolDelegate transportClosed]);
+
+ [testSecondaryProtocolMock onError:[OCMArg any]];
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ expect(manager.stateMachine.currentState).toEventually(equal(SDLSecondaryTransportStateConfigured));
+ });
+ });
+
+ describe(@"when the secondary transport is disconnected", ^{
+ __block id mockSecondaryTransport = nil;
+ __block id mockBackgroundTaskManager = nil;
+
+ beforeEach(^{
+ mockSecondaryTransport = OCMProtocolMock(@protocol(SDLTransportType));
+ mockBackgroundTaskManager = OCMClassMock([SDLBackgroundTaskManager class]);
+
+ manager.backgroundTaskManager = mockBackgroundTaskManager;
+ manager.transportsForAudioService = @[@(SDLTransportClassSecondary)];
+ manager.transportsForVideoService = @[@(SDLTransportClassSecondary)];
+ manager.streamingServiceTransportMap[@(SDLServiceTypeAudio)] = @(2);
+ manager.streamingServiceTransportMap[@(SDLServiceTypeVideo)] = @(2);
+
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager startWithPrimaryProtocol:testPrimaryProtocol];
+ });
+ });
+
+ it(@"should return early if the secondary transport has not yet been established", ^{
+ manager.secondaryTransport = nil;
+
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager disconnectSecondaryTransportWithCompletionHandler:^{
+ done();
+ }];
+ });
+ });
+ });
+
+ it(@"should shutdown the secondary transport", ^{
+ manager.secondaryTransport = mockSecondaryTransport;
+ OCMExpect([mockSecondaryTransport disconnectWithCompletionHandler:[OCMArg invokeBlock]]);
+
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager disconnectSecondaryTransportWithCompletionHandler:^{\
+ expect(manager.secondaryTransport).to(beNil());
+ expect(manager.secondaryProtocol).to(beNil());
+ expect(manager.streamingServiceTransportMap).to(beEmpty());
+ OCMVerify([manager.backgroundTaskManager endBackgroundTask]);
+ done();
+ }];
+ });
+ });
+
+ OCMVerifyAllWithDelay(mockSecondaryTransport, 0.5);
+ });
+ });
+
+ describe(@"when stopped", ^{
+ __block SDLProtocol *testSecondaryProtocol = nil;
+
+ beforeEach(^{
+ testSecondaryProtocol = OCMClassMock([SDLProtocol class]);
+ manager.secondaryProtocol = testSecondaryProtocol;
+
+ manager.transportsForAudioService = @[@(SDLTransportClassSecondary)];
+ manager.transportsForVideoService = @[@(SDLTransportClassSecondary)];
+ manager.streamingServiceTransportMap[@(SDLServiceTypeAudio)] = @(2);
+ manager.streamingServiceTransportMap[@(SDLServiceTypeVideo)] = @(2);
+
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager startWithPrimaryProtocol:testPrimaryProtocol];
+ });
+ });
+
+ it(@"if not in the stopped state, it should transition to stopped state", ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateRegistered fromOldState:nil callEnterTransition:NO];
+ OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:testSecondaryProtocol toNewVideoProtocol:nil fromOldAudioProtocol:testSecondaryProtocol toNewAudioProtocol:nil]);
+
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
+ });
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ });
+
+ it(@"if already in the stopped state, it should stay in the stopped state", ^{
+ [manager.stateMachine setToState:SDLSecondaryTransportStateStopped fromOldState:nil callEnterTransition:NO];
+ OCMExpect([testStreamingProtocolDelegate didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:nil fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:nil]);
+
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ dispatch_sync(testStateMachineQueue, ^{
+ [manager stopWithCompletionHandler:^{
+ expect(manager.stateMachine.currentState).to(equal(SDLSecondaryTransportStateStopped));
+ done();
+ }];
+ });
+ });
+
+ OCMVerifyAllWithDelay(testStreamingProtocolDelegate, 0.5);
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppHMITypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppHMITypeSpec.m
index f00bfa300..7efc466bb 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppHMITypeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppHMITypeSpec.m
@@ -26,6 +26,7 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLAppHMITypeTesting).to(equal(@"TESTING"));
expect(SDLAppHMITypeSystem).to(equal(@"SYSTEM"));
expect(SDLAppHMITypeRemoteControl).to(equal(@"REMOTE_CONTROL"));
+ expect(SDLAppHMITypeWebView).to(equal(@"WEB_VIEW"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppInterfaceUnregisteredReasonSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppInterfaceUnregisteredReasonSpec.m
index e92d3d81d..4685476b1 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppInterfaceUnregisteredReasonSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLAppInterfaceUnregisteredReasonSpec.m
@@ -29,6 +29,7 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLAppInterfaceUnregisteredReasonAppUnauthorized).to(equal(@"APP_UNAUTHORIZED"));
expect(SDLAppInterfaceUnregisteredReasonProtocolViolation).to(equal(@"PROTOCOL_VIOLATION"));
expect(SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource).to(equal(@"UNSUPPORTED_HMI_RESOURCE"));
+ expect(SDLAppInterfaceUnregisteredReasonResourceConstraint).to(equal(@"RESOURCE_CONSTRAINT"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCapacityUnitSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCapacityUnitSpec.m
new file mode 100644
index 000000000..8dc19f03e
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCapacityUnitSpec.m
@@ -0,0 +1,21 @@
+//
+// SDLCapacityUnitSpec.m
+// SmartDeviceLinkTests
+//
+
+#import <Nimble/Nimble.h>
+#import <Quick/Quick.h>
+
+#import "SDLCapacityUnit.h"
+
+QuickSpecBegin(SDLCapacityUnitSpec)
+
+describe(@"Individual Enum Value Tests", ^ {
+ it(@"Should match internal values", ^ {
+ expect(SDLCapacityUnitKilograms).to(equal(@"KILOGRAMS"));
+ expect(SDLCapacityUnitKilowatthours).to(equal(@"KILOWATTHOURS"));
+ expect(SDLCapacityUnitLiters).to(equal(@"LITERS"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCharacterSetSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCharacterSetSpec.m
index 293b2f3fe..58440e51d 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCharacterSetSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLCharacterSetSpec.m
@@ -14,10 +14,16 @@ QuickSpecBegin(SDLCharacterSetSpec)
describe(@"Individual Enum Value Tests", ^ {
it(@"Should match internal values", ^ {
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(SDLCharacterSetType2).to(equal(@"TYPE2SET"));
expect(SDLCharacterSetType5).to(equal(@"TYPE5SET"));
expect(SDLCharacterSetCID1).to(equal(@"CID1SET"));
expect(SDLCharacterSetCID2).to(equal(@"CID2SET"));
+ #pragma clang diagnostic pop
+ expect(SDLCharacterSetAscii).to(equal(@"ASCII"));
+ expect(SDLCharacterSetIso88591).to(equal(@"ISO_8859_1"));
+ expect(SDLCharacterSetUtf8).to(equal(@"UTF_8"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLPredefinedLayoutSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLPredefinedLayoutSpec.m
index 1635f7741..884f3fa78 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLPredefinedLayoutSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLPredefinedLayoutSpec.m
@@ -34,6 +34,7 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLPredefinedLayoutLargeGraphicWithSoftButtons).to(equal(@"LARGE_GRAPHIC_WITH_SOFTBUTTONS"));
expect(SDLPredefinedLayoutDoubleGraphicWithSoftButtons).to(equal(@"DOUBLE_GRAPHIC_WITH_SOFTBUTTONS"));
expect(SDLPredefinedLayoutLargeGraphicOnly).to(equal(@"LARGE_GRAPHIC_ONLY"));
+ expect(SDLPredefinedLayoutWebView).to(equal(@"WEB_VIEW"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSystemCapabilityTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSystemCapabilityTypeSpec.m
index 58bb889dc..ff6fe1656 100755
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSystemCapabilityTypeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLSystemCapabilityTypeSpec.m
@@ -15,6 +15,9 @@ describe(@"Individual Enum Value Tests", ^ {
expect(SDLSystemCapabilityTypePhoneCall).to(equal(@"PHONE_CALL"));
expect(SDLSystemCapabilityTypeVideoStreaming).to(equal(@"VIDEO_STREAMING"));
expect(SDLSystemCapabilityTypeRemoteControl).to(equal(@"REMOTE_CONTROL"));
+ expect(SDLSystemCapabilityTypeDisplays).to(equal(@"DISPLAYS"));
+ expect(SDLSystemCapabilityTypeSeatLocation).to(equal(@"SEAT_LOCATION"));
+ expect(SDLSystemCapabilityTypeDriverDistraction).to(equal(@"DRIVER_DISTRACTION"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
index ca862ad8c..046429090 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLVehicleDataTypeSpec.m
@@ -28,16 +28,20 @@ describe(@"individual enum value tests", ^{
expect(SDLVehicleDataTypeEngineTorque).to(equal(@"VEHICLEDATA_ENGINETORQUE"));
expect(SDLVehicleDataTypeExternalTemperature).to(equal(@"VEHICLEDATA_EXTERNTEMP"));
expect(SDLVehicleDataTypeFuelConsumption).to(equal(@"VEHICLEDATA_FUELCONSUMPTION"));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(SDLVehicleDataTypeFuelLevel).to(equal(@"VEHICLEDATA_FUELLEVEL"));
expect(SDLVehicleDataTypeFuelLevelState).to(equal(@"VEHICLEDATA_FUELLEVEL_STATE"));
+#pragma clang diagnostic pop
expect(SDLVehicleDataTypeFuelRange).to(equal(@"VEHICLEDATA_FUELRANGE"));
expect(SDLVehicleDataTypeGPS).to(equal(@"VEHICLEDATA_GPS"));
expect(SDLVehicleDataTypeGearStatus).to(equal(@"VEHICLEDATA_GEARSTATUS"));
+ expect(SDLVehicleDataTypeHandsOffSteering).to(equal(@"VEHICLEDATA_HANDSOFFSTEERING"));
expect(SDLVehicleDataTypeHeadlampStatus).to(equal(@"VEHICLEDATA_HEADLAMPSTATUS"));
expect(SDLVehicleDataTypeMyKey).to(equal(@"VEHICLEDATA_MYKEY"));
expect(SDLVehicleDataTypeOdometer).to(equal(@"VEHICLEDATA_ODOMETER"));
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(SDLVehicleDataTypePrndl).to(equal(@"VEHICLEDATA_PRNDL"));
#pragma clang diagnostic pop
expect(SDLVehicleDataTypeRPM).to(equal(@"VEHICLEDATA_RPM"));
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m
index 63b2bbd58..a4a21e7c4 100644
--- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m
@@ -2,18 +2,17 @@
// SDLOnSystemRequestSpec.m
// SmartDeviceLink
-
#import <Foundation/Foundation.h>
-
-#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
+#import <Quick/Quick.h>
#import "SDLFileType.h"
-#import "SDLRPCParameterNames.h"
-#import "SDLRPCFunctionNames.h"
#import "SDLOnSystemRequest.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLRPCParameterNames.h"
#import "SDLRequestType.h"
+static NSString *const SDLTestURL = @"https://www.smartdevicelink.com";
QuickSpecBegin(SDLOnSystemRequestSpec)
@@ -23,7 +22,7 @@ describe(@"Getter/Setter Tests", ^ {
testNotification.requestType = SDLRequestTypeFileResume;
testNotification.requestSubType = @"subtype";
- testNotification.url = @"www.google.com";
+ testNotification.url = SDLTestURL;
testNotification.timeout = @52345;
testNotification.fileType = SDLFileTypePNG;
testNotification.offset = @2532678684;
@@ -31,7 +30,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.requestType).to(equal(SDLRequestTypeFileResume));
expect(testNotification.requestSubType).to(equal(@"subtype"));
- expect(testNotification.url).to(equal(@"www.google.com"));
+ expect(testNotification.url).to(equal(SDLTestURL));
expect(testNotification.timeout).to(equal(@52345));
expect(testNotification.fileType).to(equal(SDLFileTypePNG));
expect(testNotification.offset).to(equal(@2532678684));
@@ -43,7 +42,7 @@ describe(@"Getter/Setter Tests", ^ {
@{SDLRPCParameterNameParameters:
@{SDLRPCParameterNameRequestType:SDLRequestTypeFileResume,
SDLRPCParameterNameRequestSubType: @"subtype",
- SDLRPCParameterNameURL:@"www.google.com",
+ SDLRPCParameterNameURL:SDLTestURL,
SDLRPCParameterNameTimeout:@52345,
SDLRPCParameterNameFileType:SDLFileTypePNG,
SDLRPCParameterNameOffset:@2532678684,
@@ -56,7 +55,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.requestType).to(equal(SDLRequestTypeFileResume));
expect(testNotification.requestSubType).to(equal(@"subtype"));
- expect(testNotification.url).to(equal([@"www.google.com" mutableCopy]));
+ expect(testNotification.url).to(equal(SDLTestURL));
expect(testNotification.timeout).to(equal(@52345));
expect(testNotification.fileType).to(equal(SDLFileTypePNG));
expect(testNotification.offset).to(equal(@2532678684));
@@ -74,6 +73,57 @@ describe(@"Getter/Setter Tests", ^ {
expect(testNotification.offset).to(beNil());
expect(testNotification.length).to(beNil());
});
+
+ it(@"Should set and get url correctly (zero length url)", ^{
+ SDLOnSystemRequest *testRequest = [[SDLOnSystemRequest alloc] init];
+ NSString *testURL = @"";
+ testRequest.url = testURL;
+ expect(testRequest.url).to(equal(testURL));
+
+ NSURL *nsurl = [NSURL URLWithString:testURL];
+ expect(nsurl).notTo(beNil());
+ expect(nsurl.absoluteString).to(equal(testURL));
+ });
+
+ it(@"Should set and get url correctly (1000 sym long url)", ^{
+ const int size = 1000;
+ SDLOnSystemRequest* testRequest = [[SDLOnSystemRequest alloc] init];
+ NSMutableString *testURL = [NSMutableString stringWithCapacity:1024];
+ [testURL setString:SDLTestURL];
+ while(size > testURL.length) {
+ [testURL appendString:@"/testcomponent"];
+ }
+ if (size < testURL.length) {
+ const NSRange range = NSMakeRange(size, testURL.length - size);
+ [testURL deleteCharactersInRange:range];
+ }
+ testRequest.url = testURL;
+ expect(testRequest.url).to(equal(testURL));
+
+ NSURL *nsurl = [NSURL URLWithString:testURL];
+ expect(nsurl).notTo(beNil());
+ expect(nsurl.absoluteString).to(equal(testURL));
+ });
+
+ it(@"Should set and get url correctly (extra long url)", ^{
+ const int size = 1024 * 1024;
+ SDLOnSystemRequest *testRequest = [[SDLOnSystemRequest alloc] init];
+ NSMutableString *testURL = [NSMutableString stringWithCapacity:size + 20];
+ [testURL setString:SDLTestURL];
+ while(size > testURL.length) {
+ [testURL appendString:@"/testcomponent"];
+ }
+ if (size < testURL.length) {
+ const NSRange range = NSMakeRange(size, testURL.length - size);
+ [testURL deleteCharactersInRange:range];
+ }
+ testRequest.url = testURL;
+ expect(testRequest.url).to(equal(testURL));
+
+ NSURL *nsurl = [NSURL URLWithString:testURL];
+ expect(nsurl).notTo(beNil());
+ expect(nsurl.absoluteString).to(equal(testURL));
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
index 5092a55cb..ea3309f38 100644
--- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m
@@ -13,8 +13,7 @@
#import "SDLRPCFunctionNames.h"
QuickSpecBegin(SDLOnVehicleDataSpec)
-
-// set up test constants
+// set up all test constants
SDLGPSData* gps = [[SDLGPSData alloc] init];
SDLTireStatus* tirePressure = [[SDLTireStatus alloc] init];
SDLBeltStatus* beltStatus = [[SDLBeltStatus alloc] init];
@@ -26,27 +25,28 @@ SDLAirbagStatus* airbagStatus = [[SDLAirbagStatus alloc] init];
SDLEmergencyEvent* emergencyEvent = [[SDLEmergencyEvent alloc] init];
SDLClusterModeStatus* clusterModeStatus = [[SDLClusterModeStatus alloc] init];
SDLMyKey* myKey = [[SDLMyKey alloc] init];
-SDLFuelRange* fuelRangeItem = [[SDLFuelRange alloc] init];
-NSArray<SDLFuelRange *>* fuelRangeArray = @[fuelRangeItem, fuelRangeItem];
+SDLFuelRange* fuelRange = [[SDLFuelRange alloc] init];
+NSArray<SDLFuelRange *> *fuelRangeArray = @[fuelRange, fuelRange];
NSString *const vin = @"6574839201a";
-NSString *const cloudAppVehicleID = @"cloudAppVehicleID";
-SDLGearStatus* gearStatus = [[SDLGearStatus alloc] init];
-const float accPedalPosition = 99.01;
-SDLVehicleDataEventStatus driverBraking = SDLVehicleDataEventStatusNoEvent;
-const float engineOilLife = 23.34;
-const float engineTorque = 34.45;
-const float externalTemperature = 45.56;
-const float fuelLevel = 56.67;
-SDLComponentVolumeStatus fuelLevel_State = SDLComponentVolumeStatusFault;
-const float instantFuelConsumption = 67.78;
-const NSUInteger odometer = 100500;
-SDLPRNDL prndl = SDLPRNDLPark;
-const NSInteger rpm = 3501;
-const float speed = 120.01;
-const float steeringWheelAngle = -180.5;
-SDLTurnSignal turnSignal = SDLTurnSignalBoth;
-SDLWiperStatus wiperStatus = SDLWiperStatusAutomaticHigh;
+NSString *const cloudAppVehicleID = @"cloud-6f56054e-d633-11ea-999a-14109fcf4b5b";
+const float speed = 123.45;
+const NSUInteger rpm = 3599;
+const float fuelLevel = 34.45;
+SDLComponentVolumeStatus fuelLevel_State = SDLComponentVolumeStatusLow;
+const float instantFuelConsumption = 45.67;
+const float externalTemperature = 56.67;
+SDLTurnSignal turnSignal = SDLTurnSignalLeft;
+SDLPRNDL prndl = SDLPRNDLReverse;
+const NSUInteger odometer = 100999;
+SDLVehicleDataEventStatus driverBraking = SDLVehicleDataEventStatusYes;
+SDLWiperStatus wiperStatus = SDLWiperStatusWash;
+const float steeringWheelAngle = 359.99;
+const float engineTorque = 999.123;
+const float accPedalPosition = 35.88;
+const float engineOilLife = 98.76;
SDLElectronicParkBrakeStatus electronicParkBrakeStatus = SDLElectronicParkBrakeStatusTransition;
+const BOOL handsOffSteering = YES;
+SDLGearStatus *gearStatus = [[SDLGearStatus alloc] initWithUserSelectedGear:SDLPRNDLDrive actualGear:SDLPRNDLPark transmissionType:SDLTransmissionTypeAutomatic];
describe(@"getter/setter tests", ^{
context(@"init and assign", ^{
@@ -65,10 +65,15 @@ describe(@"getter/setter tests", ^{
testResponse.engineOilLife = @(engineOilLife);
testResponse.engineTorque = @(engineTorque);
testResponse.externalTemperature = @(externalTemperature);
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testResponse.fuelLevel = @(fuelLevel);
testResponse.fuelLevel_State = fuelLevel_State;
+#pragma clang diagnostic pop
testResponse.fuelRange = fuelRangeArray;
+ testResponse.gearStatus = gearStatus;
testResponse.gps = gps;
+ testResponse.handsOffSteering = @(handsOffSteering);
testResponse.headLampStatus = headLampStatus;
testResponse.instantFuelConsumption = @(instantFuelConsumption);
testResponse.myKey = myKey;
@@ -101,10 +106,15 @@ describe(@"getter/setter tests", ^{
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.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
+#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));
@@ -123,44 +133,50 @@ describe(@"getter/setter tests", ^{
expect(testResponse.wiperStatus).to(equal(wiperStatus));
});
});
-
+
context(@"initWithDictionary:", ^{
NSDictionary* dict = @{SDLRPCParameterNameNotification:
- @{SDLRPCParameterNameParameters:
- @{
- SDLRPCParameterNameAccelerationPedalPosition:@(accPedalPosition),
- SDLRPCParameterNameAirbagStatus:airbagStatus,
- SDLRPCParameterNameBeltStatus:beltStatus,
- SDLRPCParameterNameBodyInformation:bodyInformation,
- SDLRPCParameterNameCloudAppVehicleID:cloudAppVehicleID,
- SDLRPCParameterNameClusterModeStatus:clusterModeStatus,
- SDLRPCParameterNameDeviceStatus:deviceStatus,
- SDLRPCParameterNameDriverBraking:driverBraking,
- SDLRPCParameterNameECallInfo:eCallInfo,
- SDLRPCParameterNameElectronicParkBrakeStatus:electronicParkBrakeStatus,
- SDLRPCParameterNameEmergencyEvent:emergencyEvent,
- SDLRPCParameterNameEngineOilLife:@(engineOilLife),
- SDLRPCParameterNameEngineTorque:@(engineTorque),
- SDLRPCParameterNameExternalTemperature:@(externalTemperature),
- SDLRPCParameterNameFuelLevel:@(fuelLevel),
- SDLRPCParameterNameFuelLevelState:fuelLevel_State,
- SDLRPCParameterNameFuelRange:fuelRangeArray,
- SDLRPCParameterNameGPS:gps,
- SDLRPCParameterNameHeadLampStatus:headLampStatus,
- SDLRPCParameterNameInstantFuelConsumption:@(instantFuelConsumption),
- SDLRPCParameterNameMyKey:myKey,
- SDLRPCParameterNameOdometer:@(odometer),
- SDLRPCParameterNamePRNDL:prndl,
- SDLRPCParameterNameRPM:@(rpm),
- SDLRPCParameterNameSpeed:@(speed),
- SDLRPCParameterNameSteeringWheelAngle:@(steeringWheelAngle),
- SDLRPCParameterNameTirePressure:tirePressure,
- SDLRPCParameterNameTurnSignal:turnSignal,
- SDLRPCParameterNameVIN:vin,
- SDLRPCParameterNameWiperStatus:wiperStatus,
- SDLRPCParameterNameGearStatus:gearStatus
- },
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:@(accPedalPosition),
+ SDLRPCParameterNameAirbagStatus:airbagStatus,
+ SDLRPCParameterNameBeltStatus:beltStatus,
+ SDLRPCParameterNameBodyInformation:bodyInformation,
+ SDLRPCParameterNameCloudAppVehicleID:cloudAppVehicleID,
+ SDLRPCParameterNameClusterModeStatus:clusterModeStatus,
+ SDLRPCParameterNameDeviceStatus:deviceStatus,
+ SDLRPCParameterNameDriverBraking:driverBraking,
+ SDLRPCParameterNameECallInfo:eCallInfo,
+ SDLRPCParameterNameElectronicParkBrakeStatus:electronicParkBrakeStatus,
+ SDLRPCParameterNameEmergencyEvent:emergencyEvent,
+ SDLRPCParameterNameEngineOilLife:@(engineOilLife),
+ SDLRPCParameterNameEngineTorque:@(engineTorque),
+ SDLRPCParameterNameExternalTemperature:@(externalTemperature),
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNameFuelLevel:@(fuelLevel),
+ SDLRPCParameterNameFuelLevelState:fuelLevel_State,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameFuelRange:fuelRangeArray,
+ SDLRPCParameterNameGearStatus:gearStatus,
+ SDLRPCParameterNameGPS:gps,
+ SDLRPCParameterNameHandsOffSteering:@(handsOffSteering),
+ SDLRPCParameterNameHeadLampStatus:headLampStatus,
+ SDLRPCParameterNameInstantFuelConsumption:@(instantFuelConsumption),
+ SDLRPCParameterNameMyKey:myKey,
+ SDLRPCParameterNameOdometer:@(odometer),
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNamePRNDL:prndl,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameRPM:@(rpm),
+ SDLRPCParameterNameSpeed:@(speed),
+ SDLRPCParameterNameSteeringWheelAngle:@(steeringWheelAngle),
+ SDLRPCParameterNameTirePressure:tirePressure,
+ SDLRPCParameterNameTurnSignal:turnSignal,
+ SDLRPCParameterNameVIN:vin,
+ SDLRPCParameterNameWiperStatus:wiperStatus,
+ },
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnVehicleData}};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLOnVehicleData* testResponse = [[SDLOnVehicleData alloc] initWithDictionary:dict];
@@ -181,10 +197,15 @@ describe(@"getter/setter tests", ^{
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.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
+#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));
@@ -193,7 +214,6 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testResponse.prndl).to(equal(prndl));
#pragma clang diagnostic pop
- expect(testResponse.gearStatus).to(equal(gearStatus));
expect(testResponse.rpm).to(equal(@(rpm)));
expect(testResponse.speed).to(equal(@(speed)));
expect(testResponse.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
@@ -204,7 +224,6 @@ describe(@"getter/setter tests", ^{
});
});
-
context(@"init", ^{
SDLOnVehicleData* testResponse = [[SDLOnVehicleData alloc] init];
it(@"expect all properties to be nil", ^{
@@ -222,10 +241,15 @@ describe(@"getter/setter tests", ^{
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.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
expect(testResponse.fuelRange).to(beNil());
+ expect(testResponse.gearStatus).to(beNil());
expect(testResponse.gps).to(beNil());
+ expect(testResponse.handsOffSteering).to(beNil());
expect(testResponse.headLampStatus).to(beNil());
expect(testResponse.instantFuelConsumption).to(beNil());
expect(testResponse.myKey).to(beNil());
@@ -234,7 +258,6 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
- expect(testResponse.gearStatus).to(beNil());
expect(testResponse.rpm).to(beNil());
expect(testResponse.speed).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
@@ -245,49 +268,55 @@ describe(@"getter/setter tests", ^{
});
});
- context(@"initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:", ^{
- SDLOnVehicleData* testResponse = [[SDLOnVehicleData alloc] initWithGps:gps speed:speed rpm:@(rpm) fuelLevel:fuelLevel fuelLevel_State:fuelLevel_State 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 eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey];
- 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)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
- expect(testResponse.fuelLevel).to(equal(@(fuelLevel)));
- expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
- expect(testResponse.fuelRange).to(equal(fuelRangeArray));
- expect(testResponse.gps).to(equal(gps));
- expect(testResponse.headLampStatus).to(equal(headLampStatus));
- expect(testResponse.instantFuelConsumption).to(equal(@(instantFuelConsumption)));
- expect(testResponse.myKey).to(equal(myKey));
- expect(testResponse.odometer).to(equal(@(odometer)));
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering", ^{
+ 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 eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey handsOffSteering:@(handsOffSteering)];
+ 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)));
+ expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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());
+ expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
- expect(testResponse.gearStatus).to(equal(gearStatus));
- expect(testResponse.rpm).to(equal(@(rpm)));
- expect(testResponse.speed).to(equal(@(speed)));
- 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.wiperStatus).to(equal(wiperStatus));
+ expect(testResponse.gearStatus).to(equal(gearStatus));
+ expect(testResponse.rpm).to(equal(@(rpm)));
+ expect(testResponse.speed).to(equal(@(speed)));
+ 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.wiperStatus).to(equal(wiperStatus));
});
});
context(@"init and set OEM Custom Vehicle Data", ^{
SDLOnVehicleData *testResponse = [[SDLOnVehicleData alloc] init];
[testResponse setOEMCustomVehicleData:@"customVehicleData" withVehicleDataState:@"oemVehicleData"];
+
it(@"expect OEM Custom Vehicle Data to be set properly", ^{
expect([testResponse getOEMCustomVehicleData:@"customVehicleData"]).to(equal(@"oemVehicleData"));
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
index 5c5e98547..ca0ab6f28 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m
@@ -21,18 +21,33 @@ describe(@"Getter/Setter Tests", ^ {
__block NSString *menuName = @"Welcome to the menu";
__block SDLImage *image = nil;
__block SDLMenuLayout testLayout = SDLMenuLayoutList;
+ __block NSNumber *parentID = @44;
beforeEach(^{
image = [[SDLImage alloc] initWithName:@"Test" isTemplate:false];
});
it(@"should correctly initialize with initWithId:menuName:", ^{
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithId:menuId menuName:menuName];
+ #pragma clang diagnostic pop
expect(testRequest.menuID).to(equal(@(menuId)));
expect(testRequest.position).to(beNil());
expect(testRequest.menuName).to(equal(menuName));
expect(testRequest.menuIcon).to(beNil());
+ expect(testRequest.parentID).to(beNil());
+ });
+
+ it(@"should correctly initialize with initWithMenuID:menuName:", ^{
+ SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithMenuID:menuId menuName:menuName];
+
+ expect(testRequest.menuID).to(equal(@(menuId)));
+ expect(testRequest.position).to(beNil());
+ expect(testRequest.menuName).to(equal(menuName));
+ expect(testRequest.menuIcon).to(beNil());
+ expect(testRequest.parentID).to(beNil());
});
it(@"should correctly initialize with initWithId:menuName:position:", ^{
@@ -44,6 +59,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.position).to(equal(@(position)));
expect(testRequest.menuName).to(equal(menuName));
expect(testRequest.menuIcon).to(beNil());
+ expect(testRequest.parentID).to(beNil());
#pragma clang diagnostic pop
});
@@ -56,17 +72,33 @@ describe(@"Getter/Setter Tests", ^ {
expect(testRequest.position).to(equal(@(position)));
expect(testRequest.menuName).to(equal(menuName));
expect(testRequest.menuIcon).to(equal(image));
+ expect(testRequest.parentID).to(beNil());
#pragma clang diagnostic pop
});
it(@"should correctly initialize with initWithId:menuName:menuLayout:menuIcon:position:", ^{
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithId:menuId menuName:menuName menuLayout:testLayout menuIcon:image position:position];
+ #pragma clang diagnostic pop
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(beNil());
+ });
+
+ it(@"should correctly initialize with initWithMenuID:menuName:menuLayout:menuIcon:position:parentID:", ^{
+ SDLAddSubMenu *testRequest = [[SDLAddSubMenu alloc] initWithMenuID:menuId menuName:menuName position:@(position) menuIcon:image menuLayout:testLayout parentID:parentID];
+
+ 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));
});
it(@"Should set and get correctly", ^ {
@@ -88,13 +120,14 @@ describe(@"Getter/Setter Tests", ^ {
it(@"Should get correctly when initialized", ^ {
NSMutableDictionary<NSString *, id> *dict = [@{SDLRPCParameterNameRequest:
@{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameMenuId:@4345645,
- SDLRPCParameterNamePosition:@27,
- SDLRPCParameterNameMenuName:@"Welcome to the menu",
+ @{SDLRPCParameterNameMenuId: @(menuId),
+ SDLRPCParameterNamePosition: @(position),
+ SDLRPCParameterNameMenuName: menuName,
SDLRPCParameterNameMenuIcon: @{
- SDLRPCParameterNameValue: @"Test"
- },
- SDLRPCParameterNameMenuLayout: testLayout
+ SDLRPCParameterNameValue: image.value
+ },
+ SDLRPCParameterNameMenuLayout: testLayout,
+ SDLRPCParameterNameParentID: parentID
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameAddSubMenu}} mutableCopy];
#pragma clang diagnostic push
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
index 9b349134b..2e875704e 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m
@@ -17,6 +17,7 @@ QuickSpecBegin(SDLGetVehicleDataSpec)
describe(@"getter/setter tests", ^{
context(@"init and assign", ^{
SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] init];
+
testRequest.accPedalPosition = @YES;
testRequest.airbagStatus = @YES;
testRequest.beltStatus = @YES;
@@ -31,10 +32,15 @@ describe(@"getter/setter tests", ^{
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @YES;
testRequest.externalTemperature = @YES;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
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;
@@ -43,13 +49,13 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testRequest.prndl = @YES;
#pragma clang diagnostic pop
- testRequest.gearStatus = @YES;
testRequest.rpm = @YES;
testRequest.speed = @YES;
testRequest.steeringWheelAngle = @YES;
testRequest.tirePressure = @YES;
testRequest.turnSignal = @YES;
testRequest.wiperStatus = @YES;
+
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
expect(testRequest.airbagStatus).to(equal(@YES));
@@ -65,10 +71,15 @@ describe(@"getter/setter tests", ^{
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
expect(testRequest.externalTemperature).to(equal(@YES));
+ expect(testRequest.fuelRange).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
- expect(testRequest.fuelRange).to(equal(@YES));
+#pragma clang diagnostic pop
+ 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));
@@ -77,7 +88,6 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(equal(@YES));
expect(testRequest.rpm).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -86,46 +96,54 @@ describe(@"getter/setter tests", ^{
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
-
+
context(@"initWithDictionary:", ^{
NSDictionary<NSString *, id> *dict = @{SDLRPCParameterNameRequest:
- @{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameAccelerationPedalPosition:@YES,
- SDLRPCParameterNameAirbagStatus:@YES,
- SDLRPCParameterNameBeltStatus:@YES,
- SDLRPCParameterNameBodyInformation:@YES,
- SDLRPCParameterNameCloudAppVehicleID:@YES,
- SDLRPCParameterNameClusterModeStatus:@YES,
- SDLRPCParameterNameDeviceStatus:@YES,
- SDLRPCParameterNameDriverBraking:@YES,
- SDLRPCParameterNameECallInfo:@YES,
- SDLRPCParameterNameElectronicParkBrakeStatus:@YES,
- SDLRPCParameterNameEmergencyEvent:@YES,
- SDLRPCParameterNameEngineOilLife:@YES,
- SDLRPCParameterNameEngineTorque:@YES,
- SDLRPCParameterNameExternalTemperature:@YES,
- SDLRPCParameterNameFuelLevel:@YES,
- SDLRPCParameterNameFuelLevelState:@YES,
- SDLRPCParameterNameFuelRange:@YES,
- SDLRPCParameterNameGPS:@YES,
- SDLRPCParameterNameHeadLampStatus:@YES,
- SDLRPCParameterNameInstantFuelConsumption:@YES,
- SDLRPCParameterNameMyKey:@YES,
- SDLRPCParameterNameOdometer:@YES,
- SDLRPCParameterNamePRNDL:@YES,
- SDLRPCParameterNameRPM:@YES,
- SDLRPCParameterNameSpeed:@YES,
- SDLRPCParameterNameSteeringWheelAngle:@YES,
- SDLRPCParameterNameTirePressure:@YES,
- SDLRPCParameterNameTurnSignal:@YES,
- SDLRPCParameterNameWiperStatus:@YES,
- SDLRPCParameterNameGearStatus:@YES,
- },
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:@YES,
+ SDLRPCParameterNameAirbagStatus:@YES,
+ SDLRPCParameterNameBeltStatus:@YES,
+ SDLRPCParameterNameBodyInformation:@YES,
+ SDLRPCParameterNameCloudAppVehicleID:@YES,
+ SDLRPCParameterNameClusterModeStatus:@YES,
+ SDLRPCParameterNameDeviceStatus:@YES,
+ SDLRPCParameterNameDriverBraking:@YES,
+ SDLRPCParameterNameECallInfo:@YES,
+ SDLRPCParameterNameElectronicParkBrakeStatus:@YES,
+ SDLRPCParameterNameEmergencyEvent:@YES,
+ SDLRPCParameterNameEngineOilLife:@YES,
+ SDLRPCParameterNameEngineTorque:@YES,
+ SDLRPCParameterNameExternalTemperature:@YES,
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNameFuelLevel:@YES,
+ SDLRPCParameterNameFuelLevelState:@YES,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameFuelRange:@YES,
+ SDLRPCParameterNameGearStatus:@YES,
+ SDLRPCParameterNameGPS:@YES,
+ SDLRPCParameterNameHandsOffSteering:@YES,
+ SDLRPCParameterNameHeadLampStatus:@YES,
+ SDLRPCParameterNameInstantFuelConsumption:@YES,
+ SDLRPCParameterNameMyKey:@YES,
+ SDLRPCParameterNameOdometer:@YES,
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNamePRNDL:@YES,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameRPM:@YES,
+ SDLRPCParameterNameSpeed:@YES,
+ SDLRPCParameterNameSteeringWheelAngle:@YES,
+ SDLRPCParameterNameTirePressure:@YES,
+ SDLRPCParameterNameTurnSignal:@YES,
+ SDLRPCParameterNameWiperStatus:@YES,
+ },
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] initWithDictionary:dict];
- #pragma clang diagnostic pop
+#pragma clang diagnostic pop
+
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
expect(testRequest.airbagStatus).to(equal(@YES));
@@ -141,10 +159,15 @@ describe(@"getter/setter tests", ^{
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.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(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));
@@ -153,7 +176,6 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(equal(@YES));
expect(testRequest.rpm).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -182,10 +204,15 @@ describe(@"test initializers", ^{
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.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
expect(testRequest.fuelRange).to(beNil());
+ expect(testRequest.gearStatus).to(beNil());
expect(testRequest.gps).to(beNil());
+ expect(testRequest.handsOffSteering).to(beNil());
expect(testRequest.headLampStatus).to(beNil());
expect(testRequest.instantFuelConsumption).to(beNil());
expect(testRequest.myKey).to(beNil());
@@ -194,7 +221,6 @@ describe(@"test initializers", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.prndl).to(beNil());
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(beNil());
expect(testRequest.rpm).to(beNil());
expect(testRequest.speed).to(beNil());
expect(testRequest.steeringWheelAngle).to(beNil());
@@ -209,6 +235,7 @@ describe(@"test initializers", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES vin: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));
@@ -224,10 +251,15 @@ describe(@"test initializers", ^{
expect(testRequest.engineOilLife).to(beNil());
expect(testRequest.engineTorque).to(equal(@YES));
expect(testRequest.externalTemperature).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic pop
expect(testRequest.fuelRange).to(beNil());
+ 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));
@@ -236,7 +268,6 @@ describe(@"test initializers", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(beNil());
expect(testRequest.rpm).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -251,6 +282,7 @@ describe(@"test initializers", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation: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));
expect(testRequest.airbagStatus).to(equal(@YES));
@@ -266,10 +298,15 @@ describe(@"test initializers", ^{
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.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic push
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));
@@ -278,7 +315,6 @@ describe(@"test initializers", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(beNil());
expect(testRequest.rpm).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -287,6 +323,7 @@ describe(@"test initializers", ^{
expect(testRequest.wiperStatus).to(equal(@YES));
});
});
+
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:", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -308,10 +345,15 @@ describe(@"test initializers", ^{
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.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));
@@ -320,7 +362,6 @@ describe(@"test initializers", ^{
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(beNil());
expect(testRequest.rpm).to(equal(@YES));
expect(testRequest.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -330,8 +371,8 @@ describe(@"test initializers", ^{
});
});
- context(@"initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:", ^{
- SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES fuelLevel:@YES fuelLevel_State:@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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES];
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:", ^{
+ 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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES];
it(@"expect all properties to be set properly", ^{
expect(testRequest.accPedalPosition).to(equal(@YES));
@@ -348,10 +389,15 @@ describe(@"test initializers", ^{
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
expect(testRequest.externalTemperature).to(equal(@YES));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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));
@@ -370,11 +416,11 @@ describe(@"test initializers", ^{
});
});
- context(@"should set and get OEM Custom Vehicle Data", ^{
- SDLGetVehicleData *testRequest = [[SDLGetVehicleData alloc] init];
-
+ context(@"should set OEM Custom Vehicle Data", ^{
+ SDLGetVehicleData* 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));
expect([testRequest getOEMCustomVehicleData:@"OEMCustomVehicleData1"]).to(equal(@YES));
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m
index 4d5a6948d..890cb9ff0 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m
@@ -26,7 +26,7 @@ describe(@"Getter/Setter Tests", ^ {
it(@"Should set and get correctly", ^ {
SDLPutFile* testRequest = [[SDLPutFile alloc] init];
- testRequest.syncFileName = @"fileName";
+ testRequest.sdlFileName = @"fileName";
testRequest.fileType = SDLFileTypeJPEG;
testRequest.persistentFile = @YES;
testRequest.systemFile = @NO;
@@ -34,13 +34,18 @@ describe(@"Getter/Setter Tests", ^ {
testRequest.length = @123456789;
testRequest.crc = @0xffffffff;
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypeJPEG));
expect(testRequest.persistentFile).to(equal(@YES));
expect(testRequest.systemFile).to(equal(@NO));
expect(testRequest.offset).to(equal(@987654321));
expect(testRequest.length).to(equal(@123456789));
expect(testRequest.crc).to(equal(0xffffffff));
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
it(@"Should get and set correctly when initialized", ^ {
@@ -59,13 +64,18 @@ describe(@"Getter/Setter Tests", ^ {
SDLPutFile* testRequest = [[SDLPutFile alloc] initWithDictionary:dict];
#pragma clang diagnostic pop
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypeJPEG));
expect(testRequest.persistentFile).to(equal(@YES));
expect(testRequest.systemFile).to(equal(@NO));
expect(testRequest.offset).to(equal(@987654321));
expect(testRequest.length).to(equal(@123456789));
expect(testRequest.crc).to(equal(@0xffffffff));
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
});
@@ -96,7 +106,7 @@ describe(@"initializers", ^{
context(@"init", ^{
SDLPutFile *testRequest = [[SDLPutFile alloc] init];
- expect(testRequest.syncFileName).to(beNil());
+ expect(testRequest.sdlFileName).to(beNil());
expect(testRequest.fileType).to(beNil());
expect(testRequest.persistentFile).to(beNil());
expect(testRequest.systemFile).to(beNil());
@@ -104,12 +114,17 @@ describe(@"initializers", ^{
expect(testRequest.length).to(beNil());
expect(testRequest.crc).to(beNil());
expect(testRequest.bulkData).to(beNil());
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(beNil());
+#pragma clang diagnostic pop
});
context(@"initWithFileName:fileType:", ^{
SDLPutFile *testRequest = [[SDLPutFile alloc] initWithFileName:@"fileName" fileType:SDLFileTypeWAV];
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypeWAV));
expect(testRequest.persistentFile).to(beNil());
expect(testRequest.systemFile).to(beNil());
@@ -117,12 +132,17 @@ describe(@"initializers", ^{
expect(testRequest.length).to(beNil());
expect(testRequest.crc).to(beNil());
expect(testRequest.bulkData).to(beNil());
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
context(@"initWithFileName:fileType:persistentFile:", ^{
SDLPutFile* testRequest = [[SDLPutFile alloc] initWithFileName:@"fileName" fileType:SDLFileTypePNG persistentFile:false];
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypePNG));
expect(testRequest.persistentFile).to(beFalse());
expect(testRequest.systemFile).to(beNil());
@@ -130,14 +150,20 @@ describe(@"initializers", ^{
expect(testRequest.length).to(beNil());
expect(testRequest.crc).to(beNil());
expect(testRequest.bulkData).to(beNil());
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
context(@"initWithFileName:fileType:persistentFile:systemFile:offset:length:", ^{
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLPutFile *testRequest = [[SDLPutFile alloc] initWithFileName:@"fileName" fileType:SDLFileTypeMP3 persistentFile:true systemFile:true offset:45 length:34];
+#pragma clang diagnostic pop
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypeMP3));
expect(testRequest.persistentFile).to(beTrue());
expect(testRequest.systemFile).to(beTrue());
@@ -145,13 +171,17 @@ describe(@"initializers", ^{
expect(testRequest.length).to(equal(34));
expect(testRequest.crc).to(beNil());
expect(testRequest.bulkData).to(beNil());
- #pragma clang diagnostic pop
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
context(@"initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:", ^{
SDLPutFile* testRequest = [[SDLPutFile alloc] initWithFileName:@"fileName" fileType:SDLFileTypeMP3 persistentFile:true systemFile:true offset:45 length:34 crc:0xffffffff];
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypeMP3));
expect(testRequest.persistentFile).to(beTrue());
expect(testRequest.systemFile).to(beTrue());
@@ -159,6 +189,11 @@ describe(@"initializers", ^{
expect(testRequest.length).to(equal(@34));
expect(testRequest.crc).to(equal(0xffffffff));
expect(testRequest.bulkData).to(beNil());
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
context(@"initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:", ^{
@@ -167,7 +202,7 @@ describe(@"initializers", ^{
SDLPutFile* testRequest = [[SDLPutFile alloc] initWithFileName:@"fileName" fileType:SDLFileTypeAAC persistentFile:true systemFile:true offset:5 length:4 bulkData:testFileData];
- expect(testRequest.syncFileName).to(equal(@"fileName"));
+ expect(testRequest.sdlFileName).to(equal(@"fileName"));
expect(testRequest.fileType).to(equal(SDLFileTypeAAC));
expect(testRequest.persistentFile).to(beTrue());
expect(testRequest.systemFile).to(beTrue());
@@ -175,6 +210,11 @@ describe(@"initializers", ^{
expect(testRequest.length).to(equal(@4));
expect(testRequest.bulkData).to(equal(testFileData));
expect(testRequest.crc).to(equal(testFileCRC32Checksum));
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testRequest.syncFileName).to(equal(@"fileName"));
+#pragma clang diagnostic pop
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m
index a867ecef6..9905b9ebf 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m
@@ -49,9 +49,9 @@ describe(@"RegisterAppInterface Tests", ^{
__block SDLTemplateColorScheme *colorScheme = nil;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- __block SDLSyncMsgVersion *currentSyncMsgVersion = [[SDLSyncMsgVersion alloc] initWithMajorVersion:6 minorVersion:0 patchVersion:0];
+ __block SDLSyncMsgVersion *currentSyncMsgVersion = [[SDLSyncMsgVersion alloc] initWithMajorVersion:7 minorVersion:0 patchVersion:0];
#pragma clang diagnostic pop
- __block SDLMsgVersion * currentSDLMsgVersion = [[SDLMsgVersion alloc] initWithMajorVersion:6 minorVersion:0 patchVersion:0];
+ __block SDLMsgVersion * currentSDLMsgVersion = [[SDLMsgVersion alloc] initWithMajorVersion:7 minorVersion:0 patchVersion:0];
beforeEach(^{
testRegisterAppInterface = nil;
@@ -116,7 +116,7 @@ describe(@"RegisterAppInterface Tests", ^{
dict = @{SDLRPCParameterNameRequest:
@{SDLRPCParameterNameParameters:
@{SDLRPCParameterNameSyncMessageVersion:@{
- SDLRPCParameterNameMajorVersion: @6,
+ SDLRPCParameterNameMajorVersion: @7,
SDLRPCParameterNameMinorVersion: @0,
SDLRPCParameterNamePatchVersion: @0
},
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
index 7bd03c261..3f122ccbe 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m
@@ -15,30 +15,34 @@
QuickSpecBegin(SDLSubscribeVehicleDataSpec)
describe(@"getter/setter tests", ^{
- it(@"should set and get correctly", ^{
+ context(@"init and assign", ^{
SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] init];
testRequest.accPedalPosition = @YES;
- testRequest.airbagStatus = @NO;
- testRequest.beltStatus = @NO;
+ testRequest.airbagStatus = @YES;
+ testRequest.beltStatus = @YES;
testRequest.bodyInformation = @YES;
testRequest.cloudAppVehicleID = @YES;
- testRequest.clusterModeStatus = @NO;
- testRequest.deviceStatus = @NO;
+ testRequest.clusterModeStatus = @YES;
+ testRequest.deviceStatus = @YES;
testRequest.driverBraking = @YES;
testRequest.eCallInfo = @YES;
testRequest.electronicParkBrakeStatus = @YES;
testRequest.emergencyEvent = @YES;
testRequest.engineOilLife = @YES;
- testRequest.engineTorque = @NO;
+ testRequest.engineTorque = @YES;
testRequest.externalTemperature = @YES;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
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 = @NO;
+ testRequest.instantFuelConsumption = @YES;
testRequest.myKey = @YES;
testRequest.odometer = @YES;
#pragma clang diagnostic push
@@ -47,84 +51,94 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic pop
testRequest.gearStatus = @YES;
testRequest.rpm = @YES;
- testRequest.speed = @NO;
- testRequest.steeringWheelAngle = @NO;
- testRequest.tirePressure = @NO;
+ testRequest.speed = @YES;
+ testRequest.steeringWheelAngle = @YES;
+ testRequest.tirePressure = @YES;
testRequest.turnSignal = @YES;
- testRequest.wiperStatus = @NO;
+ testRequest.wiperStatus = @YES;
- expect(testRequest.accPedalPosition).to(equal(@YES));
- expect(testRequest.airbagStatus).to(equal(@NO));
- expect(testRequest.beltStatus).to(equal(@NO));
- expect(testRequest.bodyInformation).to(equal(@YES));
- expect(testRequest.cloudAppVehicleID).to(equal(@YES));
- expect(testRequest.clusterModeStatus).to(equal(@NO));
- expect(testRequest.deviceStatus).to(equal(@NO));
- 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(@NO));
- expect(testRequest.externalTemperature).to(equal(@YES));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
- expect(testRequest.fuelRange).to(equal(@YES));
- expect(testRequest.gearStatus).to(equal(@YES));
- expect(testRequest.gps).to(equal(@YES));
- expect(testRequest.headLampStatus).to(equal(@YES));
- expect(testRequest.instantFuelConsumption).to(equal(@NO));
- expect(testRequest.myKey).to(equal(@YES));
- expect(testRequest.odometer).to(equal(@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));
+ expect(testRequest.externalTemperature).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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(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(equal(@YES));
+ expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.gearStatus).to(equal(@YES));
- expect(testRequest.rpm).to(equal(@YES));
- expect(testRequest.speed).to(equal(@NO));
- expect(testRequest.steeringWheelAngle).to(equal(@NO));
- expect(testRequest.tirePressure).to(equal(@NO));
- expect(testRequest.turnSignal).to(equal(@YES));
- expect(testRequest.wiperStatus).to(equal(@NO));
+ expect(testRequest.gearStatus).to(equal(@YES));
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.speed).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));
+ });
});
- it(@"should get correctly when initialized with a dictionary", ^ {
+ context(@"initWithDictionary:", ^{
NSDictionary<NSString *, id> *dict = @{SDLRPCParameterNameRequest:
- @{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameAccelerationPedalPosition:@YES,
- SDLRPCParameterNameAirbagStatus:@YES,
- SDLRPCParameterNameBeltStatus:@YES,
- SDLRPCParameterNameBodyInformation:@YES,
- SDLRPCParameterNameCloudAppVehicleID:@YES,
- SDLRPCParameterNameClusterModeStatus:@YES,
- SDLRPCParameterNameDeviceStatus:@YES,
- SDLRPCParameterNameDriverBraking:@YES,
- SDLRPCParameterNameECallInfo:@YES,
- SDLRPCParameterNameElectronicParkBrakeStatus: @YES,
- SDLRPCParameterNameEmergencyEvent:@NO,
- SDLRPCParameterNameEngineOilLife:@YES,
- SDLRPCParameterNameEngineTorque:@YES,
- SDLRPCParameterNameExternalTemperature:@NO,
- SDLRPCParameterNameFuelLevel:@YES,
- SDLRPCParameterNameFuelLevelState:@YES,
- SDLRPCParameterNameFuelRange:@YES,
- SDLRPCParameterNameGearStatus:@YES,
- SDLRPCParameterNameGPS:@YES,
- SDLRPCParameterNameHeadLampStatus:@YES,
- SDLRPCParameterNameInstantFuelConsumption:@YES,
- SDLRPCParameterNameMyKey:@YES,
- SDLRPCParameterNameOdometer:@YES,
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:@YES,
+ SDLRPCParameterNameAirbagStatus:@YES,
+ SDLRPCParameterNameBeltStatus:@YES,
+ SDLRPCParameterNameBodyInformation:@YES,
+ SDLRPCParameterNameCloudAppVehicleID:@YES,
+ SDLRPCParameterNameClusterModeStatus:@YES,
+ SDLRPCParameterNameDeviceStatus:@YES,
+ SDLRPCParameterNameDriverBraking:@YES,
+ SDLRPCParameterNameECallInfo:@YES,
+ SDLRPCParameterNameElectronicParkBrakeStatus: @YES,
+ SDLRPCParameterNameEmergencyEvent:@YES,
+ SDLRPCParameterNameEngineOilLife:@YES,
+ SDLRPCParameterNameEngineTorque:@YES,
+ SDLRPCParameterNameExternalTemperature:@YES,
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLRPCParameterNamePRNDL:@YES,
+ SDLRPCParameterNameFuelLevel:@YES,
+ SDLRPCParameterNameFuelLevelState:@YES,
#pragma clang diagnostic pop
- SDLRPCParameterNameRPM:@YES,
- SDLRPCParameterNameSpeed:@YES,
- SDLRPCParameterNameSteeringWheelAngle:@NO,
- SDLRPCParameterNameTirePressure:@YES,
- SDLRPCParameterNameTurnSignal:@NO,
- SDLRPCParameterNameWiperStatus:@NO,
+ SDLRPCParameterNameFuelRange:@YES,
+ SDLRPCParameterNameGearStatus:@YES,
+ SDLRPCParameterNameGPS:@YES,
+ SDLRPCParameterNameHandsOffSteering:@YES,
+ SDLRPCParameterNameHeadLampStatus:@YES,
+ SDLRPCParameterNameInstantFuelConsumption:@YES,
+ SDLRPCParameterNameMyKey:@YES,
+ SDLRPCParameterNameOdometer:@YES,
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNamePRNDL:@YES,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameRPM:@YES,
+ SDLRPCParameterNameSpeed:@YES,
+ SDLRPCParameterNameSteeringWheelAngle:@YES,
+ SDLRPCParameterNameTirePressure:@YES,
+ SDLRPCParameterNameTurnSignal:@YES,
+ SDLRPCParameterNameWiperStatus:@YES,
},
SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}};
#pragma clang diagnostic push
@@ -132,47 +146,54 @@ describe(@"getter/setter tests", ^{
SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithDictionary:dict];
#pragma clang diagnostic pop
- 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(@NO));
- expect(testRequest.engineOilLife).to(equal(@YES));
- expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@NO));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
- expect(testRequest.fuelRange).to(equal(@YES));
- expect(testRequest.gearStatus).to(equal(@YES));
- expect(testRequest.gps).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));
+ 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));
+ expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testRequest.prndl).to(equal(@YES));
+ expect(testRequest.fuelLevel).to(equal(@YES));
+ expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.rpm).to(equal(@YES));
- expect(testRequest.speed).to(equal(@YES));
- expect(testRequest.steeringWheelAngle).to(equal(@NO));
- expect(testRequest.tirePressure).to(equal(@YES));
- expect(testRequest.turnSignal).to(equal(@NO));
- expect(testRequest.wiperStatus).to(equal(@NO));
+ 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(equal(@YES));
+#pragma clang diagnostic pop
+ expect(testRequest.gearStatus).to(equal(@YES));
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.speed).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));
+ });
});
});
-describe(@"initializers", ^{
+describe(@"test initializers", ^{
context(@"init", ^{
SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] init];
- it(@"expect all properties to be set properly", ^{
+ it(@"expect all properties to be nil", ^{
expect(testRequest.accPedalPosition).to(beNil());
expect(testRequest.airbagStatus).to(beNil());
expect(testRequest.beltStatus).to(beNil());
@@ -187,11 +208,15 @@ describe(@"initializers", ^{
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.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
expect(testRequest.fuelRange).to(beNil());
expect(testRequest.gearStatus).to(beNil());
expect(testRequest.gps).to(beNil());
+ expect(testRequest.handsOffSteering).to(beNil());
expect(testRequest.headLampStatus).to(beNil());
expect(testRequest.instantFuelConsumption).to(beNil());
expect(testRequest.myKey).to(beNil());
@@ -230,11 +255,15 @@ describe(@"initializers", ^{
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.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));
@@ -249,9 +278,9 @@ describe(@"initializers", ^{
expect(testRequest.tirePressure).to(equal(@YES));
expect(testRequest.turnSignal).to(equal(@YES));
expect(testRequest.wiperStatus).to(equal(@YES));
-
});
});
+
context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -268,16 +297,20 @@ describe(@"initializers", ^{
expect(testRequest.deviceStatus).to(equal(@YES));
expect(testRequest.driverBraking).to(equal(@YES));
expect(testRequest.eCallInfo).to(equal(@YES));
- expect(testRequest.electronicParkBrakeStatus).to(beNil());
- expect(testRequest.emergencyEvent).to(equal(@YES));
- expect(testRequest.engineOilLife).to(beNil());
- expect(testRequest.engineTorque).to(equal(@YES));
- expect(testRequest.externalTemperature).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testRequest.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic pop
expect(testRequest.fuelRange).to(beNil());
expect(testRequest.gearStatus).to(beNil());
expect(testRequest.gps).to(equal(@YES));
+ expect(testRequest.handsOffSteering).to(beNil());
+ expect(testRequest.electronicParkBrakeStatus).to(beNil());
+ expect(testRequest.emergencyEvent).to(equal(@YES));
+ expect(testRequest.engineOilLife).to(beNil());
+ expect(testRequest.engineTorque).to(equal(@YES));
+ expect(testRequest.externalTemperature).to(equal(@YES));
expect(testRequest.headLampStatus).to(equal(@YES));
expect(testRequest.instantFuelConsumption).to(equal(@YES));
expect(testRequest.myKey).to(equal(@YES));
@@ -295,10 +328,10 @@ describe(@"initializers", ^{
});
});
- context(@"initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:", ^{
- SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES fuelLevel:@YES fuelLevel_State:@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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES];
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:", ^{
+ 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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES];
- it(@"should set all the parameters properly", ^{
+ 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));
@@ -313,11 +346,15 @@ describe(@"initializers", ^{
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
expect(testRequest.externalTemperature).to(equal(@YES));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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));
@@ -335,7 +372,7 @@ describe(@"initializers", ^{
});
});
- context(@"should set and get OEM Custom Vehicle Data", ^{
+ context(@"should set OEM Custom Vehicle Data", ^{
SDLSubscribeVehicleData *testRequest = [[SDLSubscribeVehicleData alloc] init];
[testRequest setOEMCustomVehicleData:@"customVehicleData" withVehicleDataState:NO];
[testRequest setOEMCustomVehicleData:@"customVehicleData1" withVehicleDataState:YES];
diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
index 179da14cc..d00944ebb 100644
--- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m
@@ -15,7 +15,7 @@
QuickSpecBegin(SDLUnsubscribeVehicleDataSpec)
describe(@"getter/setter tests", ^{
- it(@"should set and get correctly", ^{
+ context(@"init and assign", ^{
SDLUnsubscribeVehicleData* testRequest = [[SDLUnsubscribeVehicleData alloc] init];
testRequest.accPedalPosition = @YES;
@@ -32,11 +32,15 @@ describe(@"getter/setter tests", ^{
testRequest.engineOilLife = @YES;
testRequest.engineTorque = @YES;
testRequest.externalTemperature = @YES;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
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;
@@ -49,128 +53,144 @@ describe(@"getter/setter tests", ^{
testRequest.speed = @YES;
testRequest.steeringWheelAngle = @YES;
testRequest.tirePressure = @YES;
- testRequest.turnSignal = @NO;
+ testRequest.turnSignal = @YES;
testRequest.wiperStatus = @YES;
- 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));
- expect(testRequest.externalTemperature).to(equal(@YES));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
- expect(testRequest.fuelRange).to(equal(@YES));
- expect(testRequest.gearStatus).to(equal(@YES));
- expect(testRequest.gps).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));
+ 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));
+ expect(testRequest.externalTemperature).to(equal(@YES));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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(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(equal(@YES));
+ expect(testRequest.prndl).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.rpm).to(equal(@YES));
- expect(testRequest.speed).to(equal(@YES));
- expect(testRequest.steeringWheelAngle).to(equal(@YES));
- expect(testRequest.tirePressure).to(equal(@YES));
- expect(testRequest.turnSignal).to(equal(@NO));
- expect(testRequest.wiperStatus).to(equal(@YES));
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.speed).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));
+ });
});
- it(@"should get correctly when initialized with a dictionary", ^ {
+ context(@"initWithDictionary:", ^{
NSDictionary<NSString *, id> *dict = @{SDLRPCParameterNameRequest:
- @{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameAccelerationPedalPosition:@YES,
- SDLRPCParameterNameAirbagStatus:@YES,
- SDLRPCParameterNameBeltStatus:@YES,
- SDLRPCParameterNameBodyInformation:@YES,
- SDLRPCParameterNameCloudAppVehicleID:@YES,
- SDLRPCParameterNameClusterModeStatus:@YES,
- SDLRPCParameterNameDeviceStatus:@YES,
- SDLRPCParameterNameDriverBraking:@YES,
- SDLRPCParameterNameECallInfo:@YES,
- SDLRPCParameterNameElectronicParkBrakeStatus: @YES,
- SDLRPCParameterNameEmergencyEvent:@YES,
- SDLRPCParameterNameEngineOilLife:@YES,
- SDLRPCParameterNameEngineTorque:@YES,
- SDLRPCParameterNameExternalTemperature:@YES,
- SDLRPCParameterNameFuelLevel:@YES,
- SDLRPCParameterNameFuelLevelState:@YES,
- SDLRPCParameterNameFuelRange:@YES,
- SDLRPCParameterNameGearStatus:@YES,
- SDLRPCParameterNameGPS:@YES,
- SDLRPCParameterNameHeadLampStatus:@YES,
- SDLRPCParameterNameInstantFuelConsumption:@YES,
- SDLRPCParameterNameMyKey:@YES,
- SDLRPCParameterNameOdometer:@YES,
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:@YES,
+ SDLRPCParameterNameAirbagStatus:@YES,
+ SDLRPCParameterNameBeltStatus:@YES,
+ SDLRPCParameterNameBodyInformation:@YES,
+ SDLRPCParameterNameCloudAppVehicleID:@YES,
+ SDLRPCParameterNameClusterModeStatus:@YES,
+ SDLRPCParameterNameDeviceStatus:@YES,
+ SDLRPCParameterNameDriverBraking:@YES,
+ SDLRPCParameterNameECallInfo:@YES,
+ SDLRPCParameterNameElectronicParkBrakeStatus: @YES,
+ SDLRPCParameterNameEmergencyEvent:@YES,
+ SDLRPCParameterNameEngineOilLife:@YES,
+ SDLRPCParameterNameEngineTorque:@YES,
+ SDLRPCParameterNameExternalTemperature:@YES,
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLRPCParameterNamePRNDL:@YES,
+ SDLRPCParameterNameFuelLevel:@YES,
+ SDLRPCParameterNameFuelLevelState:@YES,
#pragma clang diagnostic pop
- SDLRPCParameterNameRPM:@YES,
- SDLRPCParameterNameSpeed:@YES,
- SDLRPCParameterNameSteeringWheelAngle:@YES,
- SDLRPCParameterNameTirePressure:@YES,
- SDLRPCParameterNameTurnSignal:@YES,
- SDLRPCParameterNameWiperStatus:@YES,
+ SDLRPCParameterNameFuelRange:@YES,
+ SDLRPCParameterNameGearStatus:@YES,
+ SDLRPCParameterNameGPS:@YES,
+ SDLRPCParameterNameHandsOffSteering:@YES,
+ SDLRPCParameterNameHeadLampStatus:@YES,
+ SDLRPCParameterNameInstantFuelConsumption:@YES,
+ SDLRPCParameterNameMyKey:@YES,
+ SDLRPCParameterNameOdometer:@YES,
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNamePRNDL:@YES,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameRPM:@YES,
+ SDLRPCParameterNameSpeed:@YES,
+ SDLRPCParameterNameSteeringWheelAngle:@YES,
+ SDLRPCParameterNameTirePressure:@YES,
+ SDLRPCParameterNameTurnSignal:@YES,
+ SDLRPCParameterNameWiperStatus:@YES,
},
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}};
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLUnsubscribeVehicleData* testRequest = [[SDLUnsubscribeVehicleData alloc] initWithDictionary:dict];
#pragma clang diagnostic pop
-
- 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));
- expect(testRequest.externalTemperature).to(equal(@YES));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
- expect(testRequest.fuelRange).to(equal(@YES));
- expect(testRequest.gearStatus).to(equal(@YES));
- expect(testRequest.gps).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));
+
+ 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));
+ expect(testRequest.externalTemperature).to(equal(@YES));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testRequest.prndl).to(equal(@YES));
+ expect(testRequest.fuelLevel).to(equal(@YES));
+ expect(testRequest.fuelLevel_State).to(equal(@YES));
#pragma clang diagnostic pop
- expect(testRequest.rpm).to(equal(@YES));
- expect(testRequest.speed).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.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(equal(@YES));
+#pragma clang diagnostic pop
+ expect(testRequest.rpm).to(equal(@YES));
+ expect(testRequest.speed).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));
+ });
});
});
-describe(@"initializers", ^{
+describe(@"test initializers", ^{
context(@"init", ^{
SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] init];
- it(@"expect all properties to be set properly", ^{
+ it(@"expect all properties to be nil", ^{
expect(testRequest.accPedalPosition).to(beNil());
expect(testRequest.airbagStatus).to(beNil());
expect(testRequest.beltStatus).to(beNil());
@@ -185,11 +205,15 @@ describe(@"initializers", ^{
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.fuelLevel).to(beNil());
expect(testRequest.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
expect(testRequest.fuelRange).to(beNil());
expect(testRequest.gearStatus).to(beNil());
expect(testRequest.gps).to(beNil());
+ expect(testRequest.handsOffSteering).to(beNil());
expect(testRequest.headLampStatus).to(beNil());
expect(testRequest.instantFuelConsumption).to(beNil());
expect(testRequest.myKey).to(beNil());
@@ -228,11 +252,15 @@ describe(@"initializers", ^{
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.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic push
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));
@@ -250,7 +278,7 @@ describe(@"initializers", ^{
});
});
- context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:", ^{
+context(@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData 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];
@@ -271,11 +299,15 @@ describe(@"initializers", ^{
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.fuelLevel).to(equal(@YES));
expect(testRequest.fuelLevel_State).to(equal(@YES));
+#pragma clang diagnostic push
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));
@@ -296,7 +328,7 @@ describe(@"initializers", ^{
context (@"initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES gps:YES headLampStatus:NO instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES wiperStatus:YES];
+ SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithAccelerationPedalPosition:YES airbagStatus:YES beltStatus:YES bodyInformation:YES clusterModeStatus:YES deviceStatus:YES driverBraking:YES eCallInfo:YES emergencyEvent:YES engineTorque:YES externalTemperature:YES fuelLevel:YES fuelLevelState:YES gps:YES headLampStatus:YES instantFuelConsumption:YES myKey:YES odometer:YES prndl:YES rpm:YES speed:YES steeringWheelAngle:YES tirePressure:YES wiperStatus:YES];
#pragma clang diagnostic pop
it(@"expect all properties to be set properly", ^{
@@ -322,11 +354,15 @@ describe(@"initializers", ^{
expect(testRequest.fuelRange).to(beNil());
expect(testRequest.gearStatus).to(beNil());
expect(testRequest.gps).to(equal(@YES));
- expect(testRequest.headLampStatus).to(equal(@NO));
+ 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));
- expect(testRequest.prndl).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.speed).to(equal(@YES));
expect(testRequest.steeringWheelAngle).to(equal(@YES));
@@ -336,10 +372,10 @@ describe(@"initializers", ^{
});
});
- context (@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:", ^{
+ context (@"initWithGpsspeedrpminstantFuelConsumptionfuelRangeexternalTemperatureturnSignalgearStatustirePressureodometerbeltStatusbodyInformationdeviceStatusdriverBrakingwiperStatusheadLampStatusengineTorqueaccPedalPositionsteeringWheelAngleengineOilLifeelectronicParkBrakeStatuscloudAppVehicleIDeCallInfoairbagStatusemergencyEventclusterModeStatusmyKeyhandsOffSteering:", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] initWithGps:@YES speed:@YES rpm:@YES fuelLevel:@YES fuelLevel_State:@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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@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 eCallInfo:@YES airbagStatus:@YES emergencyEvent:@YES clusterModeStatus:@YES myKey:@YES handsOffSteering:@YES];
#pragma clang diagnostic pop
it(@"expect all properties to be set properly", ^{
@@ -357,11 +393,15 @@ describe(@"initializers", ^{
expect(testRequest.engineOilLife).to(equal(@YES));
expect(testRequest.engineTorque).to(equal(@YES));
expect(testRequest.externalTemperature).to(equal(@YES));
- expect(testRequest.fuelLevel).to(equal(@YES));
- expect(testRequest.fuelLevel_State).to(equal(@YES));
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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));
@@ -379,14 +419,14 @@ describe(@"initializers", ^{
});
});
- context(@"should set and get OEM Custom Vehicle Data", ^{
+ context(@"should set OEM Custom Vehicle Data", ^{
SDLUnsubscribeVehicleData *testRequest = [[SDLUnsubscribeVehicleData alloc] init];
[testRequest setOEMCustomVehicleData:@"customVehicleData" withVehicleDataState:NO];
[testRequest setOEMCustomVehicleData:@"customVehicleData1" withVehicleDataState:YES];
it(@"expect OEM Custom Vehicle Data to be set properly", ^{
- expect([testRequest getOEMCustomVehicleData:@"customVehicleData"]).to(beFalse());
- expect([testRequest getOEMCustomVehicleData:@"customVehicleData1"]).to(beTrue());
+ expect([testRequest getOEMCustomVehicleData:@"customVehicleData"]).to(equal(@NO));
+ expect([testRequest getOEMCustomVehicleData:@"customVehicleData1"]).to(equal(@YES));
});
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
index 52b8b81fa..884256bf8 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m
@@ -14,7 +14,6 @@
QuickSpecBegin(SDLGetVehicleDataResponseSpec)
-
// set up test constants
SDLGPSData* gps = [[SDLGPSData alloc] init];
SDLTireStatus* tirePressure = [[SDLTireStatus alloc] init];
@@ -48,6 +47,7 @@ const float steeringWheelAngle = -180.5;
SDLTurnSignal turnSignal = SDLTurnSignalBoth;
SDLWiperStatus wiperStatus = SDLWiperStatusAutomaticHigh;
SDLElectronicParkBrakeStatus electronicParkBrakeStatus = SDLElectronicParkBrakeStatusTransition;
+const BOOL handsOffSteering = YES;
describe(@"getter/setter tests", ^{
context(@"init and assign", ^{
@@ -66,10 +66,15 @@ describe(@"getter/setter tests", ^{
testResponse.engineOilLife = @(engineOilLife);
testResponse.engineTorque = @(engineTorque);
testResponse.externalTemperature = @(externalTemperature);
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testResponse.fuelLevel = @(fuelLevel);
testResponse.fuelLevel_State = fuelLevel_State;
+#pragma clang diagnostic pop
testResponse.fuelRange = fuelRangeArray;
+ testResponse.gearStatus = gearStatus;
testResponse.gps = gps;
+ testResponse.handsOffSteering = @(handsOffSteering);
testResponse.headLampStatus = headLampStatus;
testResponse.instantFuelConsumption = @(instantFuelConsumption);
testResponse.myKey = myKey;
@@ -102,10 +107,15 @@ describe(@"getter/setter tests", ^{
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.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
+#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));
@@ -124,44 +134,51 @@ describe(@"getter/setter tests", ^{
expect(testResponse.wiperStatus).to(equal(wiperStatus));
});
});
-
+
context(@"initWithDictionary:", ^{
NSDictionary* dict = @{SDLRPCParameterNameNotification:
- @{SDLRPCParameterNameParameters:
- @{
- SDLRPCParameterNameAccelerationPedalPosition:@(accPedalPosition),
- SDLRPCParameterNameAirbagStatus:airbagStatus,
- SDLRPCParameterNameBeltStatus:beltStatus,
- SDLRPCParameterNameBodyInformation:bodyInformation,
- SDLRPCParameterNameCloudAppVehicleID:cloudAppVehicleID,
- SDLRPCParameterNameClusterModeStatus:clusterModeStatus,
- SDLRPCParameterNameDeviceStatus:deviceStatus,
- SDLRPCParameterNameDriverBraking:driverBraking,
- SDLRPCParameterNameECallInfo:eCallInfo,
- SDLRPCParameterNameElectronicParkBrakeStatus:electronicParkBrakeStatus,
- SDLRPCParameterNameEmergencyEvent:emergencyEvent,
- SDLRPCParameterNameEngineOilLife:@(engineOilLife),
- SDLRPCParameterNameEngineTorque:@(engineTorque),
- SDLRPCParameterNameExternalTemperature:@(externalTemperature),
- SDLRPCParameterNameFuelLevel:@(fuelLevel),
- SDLRPCParameterNameFuelLevelState:fuelLevel_State,
- SDLRPCParameterNameFuelRange:fuelRangeArray,
- SDLRPCParameterNameGPS:gps,
- SDLRPCParameterNameHeadLampStatus:headLampStatus,
- SDLRPCParameterNameInstantFuelConsumption:@(instantFuelConsumption),
- SDLRPCParameterNameMyKey:myKey,
- SDLRPCParameterNameOdometer:@(odometer),
- SDLRPCParameterNamePRNDL:prndl,
- SDLRPCParameterNameRPM:@(rpm),
- SDLRPCParameterNameSpeed:@(speed),
- SDLRPCParameterNameSteeringWheelAngle:@(steeringWheelAngle),
- SDLRPCParameterNameTirePressure:tirePressure,
- SDLRPCParameterNameTurnSignal:turnSignal,
- SDLRPCParameterNameVIN:vin,
- SDLRPCParameterNameWiperStatus:wiperStatus,
- SDLRPCParameterNameGearStatus:gearStatus
- },
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:@(accPedalPosition),
+ SDLRPCParameterNameAirbagStatus:airbagStatus,
+ SDLRPCParameterNameBeltStatus:beltStatus,
+ SDLRPCParameterNameBodyInformation:bodyInformation,
+ SDLRPCParameterNameCloudAppVehicleID:cloudAppVehicleID,
+ SDLRPCParameterNameClusterModeStatus:clusterModeStatus,
+ SDLRPCParameterNameDeviceStatus:deviceStatus,
+ SDLRPCParameterNameDriverBraking:driverBraking,
+ SDLRPCParameterNameECallInfo:eCallInfo,
+ SDLRPCParameterNameElectronicParkBrakeStatus:electronicParkBrakeStatus,
+ SDLRPCParameterNameEmergencyEvent:emergencyEvent,
+ SDLRPCParameterNameEngineOilLife:@(engineOilLife),
+ SDLRPCParameterNameEngineTorque:@(engineTorque),
+ SDLRPCParameterNameExternalTemperature:@(externalTemperature),
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNameFuelLevel:@(fuelLevel),
+ SDLRPCParameterNameFuelLevelState:fuelLevel_State,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameFuelRange:fuelRangeArray,
+ SDLRPCParameterNameGearStatus:gearStatus,
+ SDLRPCParameterNameGearStatus:gearStatus,
+ SDLRPCParameterNameGPS:gps,
+ SDLRPCParameterNameHandsOffSteering:@(handsOffSteering),
+ SDLRPCParameterNameHeadLampStatus:headLampStatus,
+ SDLRPCParameterNameInstantFuelConsumption:@(instantFuelConsumption),
+ SDLRPCParameterNameMyKey:myKey,
+ SDLRPCParameterNameOdometer:@(odometer),
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNamePRNDL:prndl,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameRPM:@(rpm),
+ SDLRPCParameterNameSpeed:@(speed),
+ SDLRPCParameterNameSteeringWheelAngle:@(steeringWheelAngle),
+ SDLRPCParameterNameTirePressure:tirePressure,
+ SDLRPCParameterNameTurnSignal:turnSignal,
+ SDLRPCParameterNameVIN:vin,
+ SDLRPCParameterNameWiperStatus:wiperStatus,
+ },
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLGetVehicleDataResponse* testResponse = [[SDLGetVehicleDataResponse alloc] initWithDictionary:dict];
@@ -182,10 +199,15 @@ describe(@"getter/setter tests", ^{
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.fuelLevel).to(equal(@(fuelLevel)));
expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
+#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));
@@ -204,7 +226,6 @@ describe(@"getter/setter tests", ^{
expect(testResponse.wiperStatus).to(equal(wiperStatus));
});
});
-
context(@"init", ^{
SDLGetVehicleDataResponse* testResponse = [[SDLGetVehicleDataResponse alloc] init];
@@ -223,10 +244,15 @@ describe(@"getter/setter tests", ^{
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.fuelLevel).to(beNil());
expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
expect(testResponse.fuelRange).to(beNil());
+ expect(testResponse.gearStatus).to(beNil());
expect(testResponse.gps).to(beNil());
+ expect(testResponse.handsOffSteering).to(beNil());
expect(testResponse.headLampStatus).to(beNil());
expect(testResponse.instantFuelConsumption).to(beNil());
expect(testResponse.myKey).to(beNil());
@@ -234,8 +260,7 @@ describe(@"getter/setter tests", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
expect(testResponse.prndl).to(beNil());
-#pragma clang diagnostic pop
- expect(testResponse.gearStatus).to(beNil());
+#pragma clang diagnostic push
expect(testResponse.rpm).to(beNil());
expect(testResponse.speed).to(beNil());
expect(testResponse.steeringWheelAngle).to(beNil());
@@ -246,45 +271,50 @@ describe(@"getter/setter tests", ^{
});
});
- context(@"initWithGps:speed:rpm:fuelLevel:fuelLevel_State:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:", ^{
- SDLGetVehicleDataResponse* testResponse = [[SDLGetVehicleDataResponse alloc] initWithGps:gps speed:speed rpm:@(rpm) fuelLevel:fuelLevel fuelLevel_State:fuelLevel_State 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 eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey];
- 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)));
- expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
- expect(testResponse.fuelLevel).to(equal(@(fuelLevel)));
- expect(testResponse.fuelLevel_State).to(equal(fuelLevel_State));
- expect(testResponse.fuelRange).to(equal(fuelRangeArray));
- expect(testResponse.gps).to(equal(gps));
- 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.gearStatus).to(equal(gearStatus));
- expect(testResponse.rpm).to(equal(@(rpm)));
- expect(testResponse.speed).to(equal(@(speed)));
- 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.wiperStatus).to(equal(wiperStatus));
- });
- });
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:", ^{
+ SDLGetVehicleDataResponse *testResponse = [[SDLGetVehicleDataResponse 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 eCallInfo:eCallInfo airbagStatus:airbagStatus emergencyEvent:emergencyEvent clusterModeStatus:clusterModeStatus myKey:myKey handsOffSteering:@(handsOffSteering)];
+
+ 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)));
+ expect(testResponse.externalTemperature).to(equal(@(externalTemperature)));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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.steeringWheelAngle).to(equal(@(steeringWheelAngle)));
+ expect(testResponse.tirePressure).to(equal(tirePressure));
+ expect(testResponse.turnSignal).to(equal(turnSignal));
+ expect(testResponse.vin).to(equal(vin));
+ expect(testResponse.wiperStatus).to(equal(wiperStatus));
+ });
+ });
context(@"init and set OEM Custom Vehicle Data", ^{
SDLGetVehicleDataResponse *testResponse = [[SDLGetVehicleDataResponse alloc] init];
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
index 2a8ab154a..bce75c36b 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m
@@ -20,8 +20,8 @@ QuickSpecBegin(SDLSubscribeVehicleDataResponseSpec)
SDLVehicleDataResult* vehicleDataResult = [[SDLVehicleDataResult alloc] init];
SDLVehicleDataResult* customOEMvehicleDataResult = [[SDLVehicleDataResult alloc] initWithCustomOEMDataType:@"customOEMVehicleData" resultCode:SDLVehicleDataResultCodeSuccess];
-describe(@"getter/setter tests", ^ {
- it(@"should set and get correctly", ^ {
+describe(@"getter/setter tests", ^{
+ context(@"init and assign", ^{
SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] init];
testResponse.accPedalPosition = vehicleDataResult;
@@ -38,11 +38,15 @@ describe(@"getter/setter tests", ^ {
testResponse.engineOilLife = vehicleDataResult;
testResponse.engineTorque = vehicleDataResult;
testResponse.externalTemperature = vehicleDataResult;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testResponse.fuelLevel = vehicleDataResult;
testResponse.fuelLevel_State = vehicleDataResult;
+#pragma clang diagnostic pop
testResponse.fuelRange = vehicleDataResult;
testResponse.gearStatus = vehicleDataResult;
testResponse.gps = vehicleDataResult;
+ testResponse.handsOffSteering = vehicleDataResult;
testResponse.headLampStatus = vehicleDataResult;
testResponse.instantFuelConsumption = vehicleDataResult;
testResponse.myKey = vehicleDataResult;
@@ -58,159 +62,181 @@ describe(@"getter/setter tests", ^ {
testResponse.turnSignal = vehicleDataResult;
testResponse.wiperStatus = vehicleDataResult;
- 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));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
- expect(testResponse.fuelRange).to(equal(vehicleDataResult));
- expect(testResponse.gearStatus).to(equal(vehicleDataResult));
- expect(testResponse.gps).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));
+ 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));
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testResponse.prndl).to(equal(vehicleDataResult));
+ expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
+ expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
- expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ 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(equal(vehicleDataResult));
+#pragma clang diagnostic pop
+ expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ });
});
- it(@"should get correctly when initialized", ^ {
+ context(@"initWithDictionary:", ^{
NSDictionary<NSString *, id> *dict = @{SDLRPCParameterNameResponse:
- @{SDLRPCParameterNameParameters:
- @{SDLRPCParameterNameAccelerationPedalPosition:vehicleDataResult,
- SDLRPCParameterNameAirbagStatus:vehicleDataResult,
- SDLRPCParameterNameBeltStatus:vehicleDataResult,
- SDLRPCParameterNameBodyInformation:vehicleDataResult,
- SDLRPCParameterNameCloudAppVehicleID:vehicleDataResult,
- SDLRPCParameterNameClusterModes:vehicleDataResult,
- SDLRPCParameterNameDeviceStatus:vehicleDataResult,
- SDLRPCParameterNameDriverBraking:vehicleDataResult,
- SDLRPCParameterNameECallInfo:vehicleDataResult,
- SDLRPCParameterNameElectronicParkBrakeStatus:vehicleDataResult,
- SDLRPCParameterNameEmergencyEvent:vehicleDataResult,
- SDLRPCParameterNameEngineOilLife:vehicleDataResult,
- SDLRPCParameterNameEngineTorque:vehicleDataResult,
- SDLRPCParameterNameExternalTemperature:vehicleDataResult,
- SDLRPCParameterNameFuelLevel:vehicleDataResult,
- SDLRPCParameterNameFuelLevelState:vehicleDataResult,
- SDLRPCParameterNameFuelRange:vehicleDataResult,
- SDLRPCParameterNameGearStatus:vehicleDataResult,
- SDLRPCParameterNameGPS:vehicleDataResult,
- SDLRPCParameterNameHeadLampStatus:vehicleDataResult,
- SDLRPCParameterNameInstantFuelConsumption:vehicleDataResult,
- SDLRPCParameterNameMyKey:vehicleDataResult,
- SDLRPCParameterNameOdometer:vehicleDataResult,
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:vehicleDataResult,
+ SDLRPCParameterNameAirbagStatus:vehicleDataResult,
+ SDLRPCParameterNameBeltStatus:vehicleDataResult,
+ SDLRPCParameterNameBodyInformation:vehicleDataResult,
+ SDLRPCParameterNameCloudAppVehicleID:vehicleDataResult,
+ SDLRPCParameterNameClusterModes:vehicleDataResult,
+ SDLRPCParameterNameDeviceStatus:vehicleDataResult,
+ SDLRPCParameterNameDriverBraking:vehicleDataResult,
+ SDLRPCParameterNameECallInfo:vehicleDataResult,
+ SDLRPCParameterNameElectronicParkBrakeStatus:vehicleDataResult,
+ SDLRPCParameterNameEmergencyEvent:vehicleDataResult,
+ SDLRPCParameterNameEngineOilLife:vehicleDataResult,
+ SDLRPCParameterNameEngineTorque:vehicleDataResult,
+ SDLRPCParameterNameExternalTemperature:vehicleDataResult,
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLRPCParameterNamePRNDL:vehicleDataResult,
+ SDLRPCParameterNameFuelLevel:vehicleDataResult,
+ SDLRPCParameterNameFuelLevelState:vehicleDataResult,
#pragma clang diagnostic pop
- SDLRPCParameterNameRPM:vehicleDataResult,
- SDLRPCParameterNameSpeed:vehicleDataResult,
- SDLRPCParameterNameSteeringWheelAngle:vehicleDataResult,
- SDLRPCParameterNameTirePressure:vehicleDataResult,
- SDLRPCParameterNameTurnSignal:vehicleDataResult,
- SDLRPCParameterNameWiperStatus:vehicleDataResult,
- },
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}};
+ SDLRPCParameterNameFuelRange:vehicleDataResult,
+ SDLRPCParameterNameGearStatus:vehicleDataResult,
+ SDLRPCParameterNameGPS:vehicleDataResult,
+ SDLRPCParameterNameHeadLampStatus:vehicleDataResult,
+ SDLRPCParameterNameInstantFuelConsumption:vehicleDataResult,
+ SDLRPCParameterNameMyKey:vehicleDataResult,
+ SDLRPCParameterNameOdometer:vehicleDataResult,
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithDictionary:dict];
+ SDLRPCParameterNamePRNDL:vehicleDataResult,
#pragma clang diagnostic pop
-
- 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));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
- expect(testResponse.fuelRange).to(equal(vehicleDataResult));
- expect(testResponse.gearStatus).to(equal(vehicleDataResult));
- expect(testResponse.gps).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));
+ SDLRPCParameterNameRPM:vehicleDataResult,
+ SDLRPCParameterNameSpeed:vehicleDataResult,
+ SDLRPCParameterNameSteeringWheelAngle:vehicleDataResult,
+ SDLRPCParameterNameTirePressure:vehicleDataResult,
+ SDLRPCParameterNameTurnSignal:vehicleDataResult,
+ SDLRPCParameterNameWiperStatus:vehicleDataResult,
+ SDLRPCParameterNameHandsOffSteering:vehicleDataResult
+ },
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testResponse.prndl).to(equal(vehicleDataResult));
+ SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithDictionary:dict];
#pragma clang diagnostic pop
- expect(testResponse.rpm).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.wiperStatus).to(equal(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));
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
+ #pragma clang diagnostic push
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
+ expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
+ #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(equal(vehicleDataResult));
+ #pragma clang diagnostic pop
+ expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ });
});
- it(@"should return nil if not set", ^ {
+ context(@"init", ^{
SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] init];
-
- expect(testResponse.accPedalPosition).to(beNil());
- expect(testResponse.airbagStatus).to(beNil());
- expect(testResponse.beltStatus).to(beNil());
- expect(testResponse.bodyInformation).to(beNil());
- expect(testResponse.cloudAppVehicleID).to(beNil());
- expect(testResponse.clusterModes).to(beNil());
- expect(testResponse.deviceStatus).to(beNil());
- expect(testResponse.driverBraking).to(beNil());
- expect(testResponse.eCallInfo).to(beNil());
- expect(testResponse.electronicParkBrakeStatus).to(beNil());
- expect(testResponse.emergencyEvent).to(beNil());
- expect(testResponse.engineOilLife).to(beNil());
- expect(testResponse.engineTorque).to(beNil());
- expect(testResponse.externalTemperature).to(beNil());
- expect(testResponse.fuelLevel).to(beNil());
- expect(testResponse.fuelLevel_State).to(beNil());
- expect(testResponse.fuelRange).to(beNil());
- expect(testResponse.gearStatus).to(beNil());
- expect(testResponse.gps).to(beNil());
- expect(testResponse.headLampStatus).to(beNil());
- expect(testResponse.instantFuelConsumption).to(beNil());
- expect(testResponse.myKey).to(beNil());
- expect(testResponse.odometer).to(beNil());
+
+ it(@"expect all properties to be nil", ^{
+ expect(testResponse.accPedalPosition).to(beNil());
+ expect(testResponse.airbagStatus).to(beNil());
+ expect(testResponse.beltStatus).to(beNil());
+ expect(testResponse.bodyInformation).to(beNil());
+ expect(testResponse.cloudAppVehicleID).to(beNil());
+ expect(testResponse.clusterModes).to(beNil());
+ expect(testResponse.deviceStatus).to(beNil());
+ expect(testResponse.driverBraking).to(beNil());
+ expect(testResponse.eCallInfo).to(beNil());
+ expect(testResponse.electronicParkBrakeStatus).to(beNil());
+ 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.prndl).to(beNil());
+ expect(testResponse.fuelLevel).to(beNil());
+ expect(testResponse.fuelLevel_State).to(beNil());
#pragma clang diagnostic pop
- expect(testResponse.rpm).to(beNil());
- expect(testResponse.speed).to(beNil());
- expect(testResponse.steeringWheelAngle).to(beNil());
- expect(testResponse.tirePressure).to(beNil());
- expect(testResponse.turnSignal).to(beNil());
- expect(testResponse.wiperStatus).to(beNil());
+ expect(testResponse.fuelRange).to(beNil());
+ expect(testResponse.gearStatus).to(beNil());
+ expect(testResponse.gps).to(beNil());
+ expect(testResponse.handsOffSteering).to(beNil());
+ expect(testResponse.headLampStatus).to(beNil());
+ expect(testResponse.instantFuelConsumption).to(beNil());
+ expect(testResponse.myKey).to(beNil());
+ expect(testResponse.odometer).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.prndl).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.rpm).to(beNil());
+ expect(testResponse.speed).to(beNil());
+ expect(testResponse.steeringWheelAngle).to(beNil());
+ expect(testResponse.tirePressure).to(beNil());
+ expect(testResponse.turnSignal).to(beNil());
+ expect(testResponse.wiperStatus).to(beNil());
+ });
});
- context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:gearStatus:", ^{
- SDLSubscribeVehicleDataResponse *testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult fuelLevel:vehicleDataResult fuelLevel_State: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 eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult];
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:", ^{
+ 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 eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult handsOffSteering:vehicleDataResult];
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
@@ -227,11 +253,15 @@ describe(@"getter/setter tests", ^ {
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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));
@@ -249,11 +279,12 @@ describe(@"getter/setter tests", ^ {
});
});
- context(@"init and assign OEM Custom Vehicle Data", ^{
- SDLSubscribeVehicleDataResponse *testRequest = [[SDLSubscribeVehicleDataResponse alloc] init];
- [testRequest setOEMCustomVehicleData:@"customOEMVehicleData" withVehicleDataState:customOEMvehicleDataResult];
+ context(@"should set OEM Custom Vehicle Data", ^{
+ SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] init];
+ [testResponse setOEMCustomVehicleData:@"customOEMVehicleData" withVehicleDataState:customOEMvehicleDataResult];
+
it(@"expect OEM Custom Vehicle Data to be set properly", ^{
- expect([testRequest getOEMCustomVehicleData:@"customOEMVehicleData"]).to(equal(customOEMvehicleDataResult));
+ expect([testResponse getOEMCustomVehicleData:@"customOEMVehicleData"]).to(equal(customOEMvehicleDataResult));
});
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
index f4151b6c9..2260bc8bd 100644
--- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m
@@ -19,8 +19,8 @@ QuickSpecBegin(SDLUnsubscribeVehicleDataResponseSpec)
SDLVehicleDataResult* vehicleDataResult = [[SDLVehicleDataResult alloc] init];
SDLVehicleDataResult* customOEMvehicleDataResult = [[SDLVehicleDataResult alloc] initWithCustomOEMDataType:@"customOEMVehicleData" resultCode:SDLVehicleDataResultCodeSuccess];
-describe(@"getter/setter tests", ^ {
- it(@"should set and get correctly", ^ {
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] init];
testResponse.accPedalPosition = vehicleDataResult;
@@ -37,11 +37,15 @@ describe(@"getter/setter tests", ^ {
testResponse.engineOilLife = vehicleDataResult;
testResponse.engineTorque = vehicleDataResult;
testResponse.externalTemperature = vehicleDataResult;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
testResponse.fuelLevel = vehicleDataResult;
testResponse.fuelLevel_State = vehicleDataResult;
+#pragma clang diagnostic pop
testResponse.fuelRange = vehicleDataResult;
testResponse.gearStatus = vehicleDataResult;
testResponse.gps = vehicleDataResult;
+ testResponse.handsOffSteering = vehicleDataResult;
testResponse.headLampStatus = vehicleDataResult;
testResponse.instantFuelConsumption = vehicleDataResult;
testResponse.myKey = vehicleDataResult;
@@ -57,159 +61,180 @@ describe(@"getter/setter tests", ^ {
testResponse.turnSignal = vehicleDataResult;
testResponse.wiperStatus = vehicleDataResult;
- 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));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
- expect(testResponse.fuelRange).to(equal(vehicleDataResult));
- expect(testResponse.gearStatus).to(equal(vehicleDataResult));
- expect(testResponse.gps).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));
+ 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));
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
+ expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
+#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(equal(vehicleDataResult));
+ expect(testResponse.prndl).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
- expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ });
});
- it(@"should get correctly when initialized", ^ {
+ context(@"initWithDictionary:", ^{
NSDictionary<NSString *, id> *dict = @{SDLRPCParameterNameResponse:
- @{SDLRPCParameterNameParameters: @{
- SDLRPCParameterNameAccelerationPedalPosition:vehicleDataResult,
- SDLRPCParameterNameAirbagStatus:vehicleDataResult,
- SDLRPCParameterNameBeltStatus:vehicleDataResult,
- SDLRPCParameterNameBodyInformation:vehicleDataResult,
- SDLRPCParameterNameCloudAppVehicleID:vehicleDataResult,
- SDLRPCParameterNameClusterModes:vehicleDataResult,
- SDLRPCParameterNameDeviceStatus:vehicleDataResult,
- SDLRPCParameterNameDriverBraking:vehicleDataResult,
- SDLRPCParameterNameECallInfo:vehicleDataResult,
- SDLRPCParameterNameElectronicParkBrakeStatus:vehicleDataResult,
- SDLRPCParameterNameEmergencyEvent:vehicleDataResult,
- SDLRPCParameterNameEngineOilLife:vehicleDataResult,
- SDLRPCParameterNameEngineTorque:vehicleDataResult,
- SDLRPCParameterNameExternalTemperature:vehicleDataResult,
- SDLRPCParameterNameFuelLevel:vehicleDataResult,
- SDLRPCParameterNameFuelLevelState:vehicleDataResult,
- SDLRPCParameterNameFuelRange:vehicleDataResult,
- SDLRPCParameterNameGPS:vehicleDataResult,
- SDLRPCParameterNameGearStatus:vehicleDataResult,
- SDLRPCParameterNameHeadLampStatus:vehicleDataResult,
- SDLRPCParameterNameInstantFuelConsumption:vehicleDataResult,
- SDLRPCParameterNameMyKey:vehicleDataResult,
- SDLRPCParameterNameOdometer:vehicleDataResult,
+ @{SDLRPCParameterNameParameters:@{
+ SDLRPCParameterNameAccelerationPedalPosition:vehicleDataResult,
+ SDLRPCParameterNameAirbagStatus:vehicleDataResult,
+ SDLRPCParameterNameBeltStatus:vehicleDataResult,
+ SDLRPCParameterNameBodyInformation:vehicleDataResult,
+ SDLRPCParameterNameCloudAppVehicleID:vehicleDataResult,
+ SDLRPCParameterNameClusterModes:vehicleDataResult,
+ SDLRPCParameterNameDeviceStatus:vehicleDataResult,
+ SDLRPCParameterNameDriverBraking:vehicleDataResult,
+ SDLRPCParameterNameECallInfo:vehicleDataResult,
+ SDLRPCParameterNameElectronicParkBrakeStatus:vehicleDataResult,
+ SDLRPCParameterNameEmergencyEvent:vehicleDataResult,
+ SDLRPCParameterNameEngineOilLife:vehicleDataResult,
+ SDLRPCParameterNameEngineTorque:vehicleDataResult,
+ SDLRPCParameterNameExternalTemperature:vehicleDataResult,
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ SDLRPCParameterNameFuelLevel:vehicleDataResult,
+ SDLRPCParameterNameFuelLevelState:vehicleDataResult,
+#pragma clang diagnostic pop
+ SDLRPCParameterNameFuelRange:vehicleDataResult,
+ SDLRPCParameterNameGPS:vehicleDataResult,
+ SDLRPCParameterNameGearStatus:vehicleDataResult,
+ SDLRPCParameterNameHandsOffSteering:vehicleDataResult,
+ SDLRPCParameterNameHeadLampStatus:vehicleDataResult,
+ SDLRPCParameterNameInstantFuelConsumption:vehicleDataResult,
+ SDLRPCParameterNameMyKey:vehicleDataResult,
+ SDLRPCParameterNameOdometer:vehicleDataResult,
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLRPCParameterNamePRNDL:vehicleDataResult,
+ SDLRPCParameterNamePRNDL:vehicleDataResult,
#pragma clang diagnostic pop
- SDLRPCParameterNameRPM:vehicleDataResult,
- SDLRPCParameterNameSpeed:vehicleDataResult,
- SDLRPCParameterNameSteeringWheelAngle:vehicleDataResult,
- SDLRPCParameterNameTirePressure:vehicleDataResult,
- SDLRPCParameterNameTurnSignal:vehicleDataResult,
- SDLRPCParameterNameWiperStatus:vehicleDataResult,
- },
- SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}};
+ SDLRPCParameterNameRPM:vehicleDataResult,
+ SDLRPCParameterNameSpeed:vehicleDataResult,
+ SDLRPCParameterNameSteeringWheelAngle:vehicleDataResult,
+ SDLRPCParameterNameTirePressure:vehicleDataResult,
+ SDLRPCParameterNameTurnSignal:vehicleDataResult,
+ SDLRPCParameterNameWiperStatus:vehicleDataResult,
+ },
+ SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithDictionary:dict];
#pragma clang diagnostic pop
- 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));
- expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
- expect(testResponse.fuelRange).to(equal(vehicleDataResult));
- expect(testResponse.gearStatus).to(equal(vehicleDataResult));
- expect(testResponse.gps).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));
+ 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));
+ expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
+ expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
+#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(equal(vehicleDataResult));
+ expect(testResponse.prndl).to(equal(vehicleDataResult));
#pragma clang diagnostic pop
- expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ expect(testResponse.rpm).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.wiperStatus).to(equal(vehicleDataResult));
+ });
});
- it(@"should return nil if not set", ^ {
+ context(@"init", ^{
SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] init];
- expect(testResponse.accPedalPosition).to(beNil());
- expect(testResponse.airbagStatus).to(beNil());
- expect(testResponse.beltStatus).to(beNil());
- expect(testResponse.bodyInformation).to(beNil());
- expect(testResponse.cloudAppVehicleID).to(beNil());
- expect(testResponse.clusterModes).to(beNil());
- expect(testResponse.deviceStatus).to(beNil());
- expect(testResponse.driverBraking).to(beNil());
- expect(testResponse.eCallInfo).to(beNil());
- expect(testResponse.electronicParkBrakeStatus).to(beNil());
- expect(testResponse.emergencyEvent).to(beNil());
- expect(testResponse.engineOilLife).to(beNil());
- expect(testResponse.engineTorque).to(beNil());
- expect(testResponse.externalTemperature).to(beNil());
- expect(testResponse.fuelLevel).to(beNil());
- expect(testResponse.fuelLevel_State).to(beNil());
- expect(testResponse.fuelRange).to(beNil());
- expect(testResponse.gearStatus).to(beNil());
- expect(testResponse.gps).to(beNil());
- expect(testResponse.headLampStatus).to(beNil());
- expect(testResponse.instantFuelConsumption).to(beNil());
- expect(testResponse.myKey).to(beNil());
- expect(testResponse.odometer).to(beNil());
+ it(@"expect all properties to be nil", ^{
+ expect(testResponse.accPedalPosition).to(beNil());
+ expect(testResponse.airbagStatus).to(beNil());
+ expect(testResponse.beltStatus).to(beNil());
+ expect(testResponse.bodyInformation).to(beNil());
+ expect(testResponse.cloudAppVehicleID).to(beNil());
+ expect(testResponse.clusterModes).to(beNil());
+ expect(testResponse.deviceStatus).to(beNil());
+ expect(testResponse.driverBraking).to(beNil());
+ expect(testResponse.eCallInfo).to(beNil());
+ expect(testResponse.electronicParkBrakeStatus).to(beNil());
+ 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.fuelLevel).to(beNil());
+ expect(testResponse.fuelLevel_State).to(beNil());
+#pragma clang diagnostic pop
+ expect(testResponse.fuelRange).to(beNil());
+ expect(testResponse.gearStatus).to(beNil());
+ expect(testResponse.gps).to(beNil());
+ expect(testResponse.handsOffSteering).to(beNil());
+ expect(testResponse.headLampStatus).to(beNil());
+ expect(testResponse.instantFuelConsumption).to(beNil());
+ expect(testResponse.myKey).to(beNil());
+ expect(testResponse.odometer).to(beNil());
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#pragma clang diagnostic push
- expect(testResponse.prndl).to(beNil());
+ expect(testResponse.prndl).to(beNil());
#pragma clang diagnostic pop
- expect(testResponse.rpm).to(beNil());
- expect(testResponse.speed).to(beNil());
- expect(testResponse.steeringWheelAngle).to(beNil());
- expect(testResponse.tirePressure).to(beNil());
- expect(testResponse.turnSignal).to(beNil());
- expect(testResponse.wiperStatus).to(beNil());
+ expect(testResponse.rpm).to(beNil());
+ expect(testResponse.speed).to(beNil());
+ expect(testResponse.steeringWheelAngle).to(beNil());
+ expect(testResponse.tirePressure).to(beNil());
+ expect(testResponse.turnSignal).to(beNil());
+ });
});
-
- context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:gearStatus:", ^{
- SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithGps:vehicleDataResult speed:vehicleDataResult rpm:vehicleDataResult fuelLevel:vehicleDataResult fuelLevel_State: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 eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult];
+
+ context(@"initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:", ^{
+ 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 eCallInfo:vehicleDataResult airbagStatus:vehicleDataResult emergencyEvent:vehicleDataResult clusterModes:vehicleDataResult myKey:vehicleDataResult handsOffSteering:vehicleDataResult];
it(@"expect all properties to be set properly", ^{
expect(testResponse.accPedalPosition).to(equal(vehicleDataResult));
@@ -226,11 +251,15 @@ describe(@"getter/setter tests", ^ {
expect(testResponse.engineOilLife).to(equal(vehicleDataResult));
expect(testResponse.engineTorque).to(equal(vehicleDataResult));
expect(testResponse.externalTemperature).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel).to(equal(vehicleDataResult));
- expect(testResponse.fuelLevel_State).to(equal(vehicleDataResult));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ 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));
@@ -248,7 +277,7 @@ describe(@"getter/setter tests", ^ {
});
});
- context(@"should set and get OEM Custom Vehicle Data", ^{
+ context(@"should set OEM Custom Vehicle Data", ^{
SDLUnsubscribeVehicleDataResponse *testRequest = [[SDLUnsubscribeVehicleDataResponse alloc] init];
[testRequest setOEMCustomVehicleData:@"customOEMVehicleData" withVehicleDataState:customOEMvehicleDataResult];
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDriverDistractionCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDriverDistractionCapabilitySpec.m
new file mode 100644
index 000000000..bd04b06ba
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDriverDistractionCapabilitySpec.m
@@ -0,0 +1,60 @@
+//
+// SDLDriverDistractionCapabilitySpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 7/27/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDriverDistractionCapability.h"
+#import "SDLRPCParameterNames.h"
+
+QuickSpecBegin(SDLDriverDistractionCapabilitySpec)
+
+describe(@"the driver distraction capability struct", ^{
+ __block SDLDriverDistractionCapability *testCapability = nil;
+ __block NSNumber *testMenuLength = @2;
+ __block NSNumber *testSubmenuDepth = @4;
+
+ beforeEach(^{
+ testCapability = [[SDLDriverDistractionCapability alloc] init];
+ });
+
+ describe(@"Getter/Setter Tests", ^ {
+ it(@"Should set and get correctly", ^ {
+ testCapability.menuLength = testMenuLength;
+ testCapability.subMenuDepth = testSubmenuDepth;
+
+ expect(testCapability.menuLength).to(equal(testMenuLength));
+ expect(testCapability.subMenuDepth).to(equal(testSubmenuDepth));
+ });
+
+ it(@"Should get correctly when initialized", ^ {
+ NSDictionary *dict = @{
+ SDLRPCParameterNameMenuLength: testMenuLength,
+ SDLRPCParameterNameSubMenuDepth: testSubmenuDepth
+ };
+ testCapability = [[SDLDriverDistractionCapability alloc] initWithDictionary:dict];
+
+ expect(testCapability.menuLength).to(equal(testMenuLength));
+ expect(testCapability.subMenuDepth).to(equal(testSubmenuDepth));
+ });
+
+ it(@"Should return nil if not set", ^ {
+ expect(testCapability.menuLength).to(beNil());
+ expect(testCapability.subMenuDepth).to(beNil());
+ });
+
+ it(@"should properly init with initWithMenuLength:subMenuDepth:", ^{
+ testCapability = [[SDLDriverDistractionCapability alloc] initWithMenuLength:testMenuLength subMenuDepth:testSubmenuDepth];
+
+ expect(testCapability.menuLength).to(equal(testMenuLength));
+ expect(testCapability.subMenuDepth).to(equal(testSubmenuDepth));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m
index faad50b3b..bb4f31e36 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m
@@ -15,36 +15,80 @@
#import "SDLRPCParameterNames.h"
QuickSpecBegin(SDLFuelRangeSpec)
+const float fuelLevel = 123.45f;
+const float fuelCapacity = 34.56f;
+const float range = 23.0f;
+SDLFuelType type = SDLFuelTypeDiesel;
+SDLComponentVolumeStatus levelState = SDLComponentVolumeStatusAlert;
+SDLCapacityUnit capacityUnit = SDLCapacityUnitKilowatthours;
-describe(@"Getter/Setter Tests", ^ {
- it(@"Should set and get correctly", ^ {
+describe(@"getter/setter tests", ^{
+ context(@"init and assign", ^{
SDLFuelRange *testStruct = [[SDLFuelRange alloc] init];
-
- testStruct.type = SDLFuelTypeDiesel;
- testStruct.range = @45;
-
- expect(testStruct.type).to(equal(SDLFuelTypeDiesel));
- expect(testStruct.range).to(equal(@45));
+ testStruct.type = type;
+ testStruct.range = @(range);
+ testStruct.level = @(fuelLevel);
+ testStruct.levelState = levelState;
+ testStruct.capacity = @(fuelCapacity);
+ testStruct.capacityUnit = capacityUnit;
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.type).to(equal(type));
+ expect(testStruct.range).to(equal(@(range)));
+ expect(testStruct.level).to(equal(fuelLevel));
+ expect(testStruct.levelState).to(equal(levelState));
+ expect(testStruct.capacity).to(equal(fuelCapacity));
+ expect(testStruct.capacityUnit).to(equal(capacityUnit));
+ });
});
- it(@"Should get correctly when initialized", ^ {
- NSDictionary *dict = @{SDLRPCParameterNameType:SDLFuelTypeLPG,
- SDLRPCParameterNameRange:@23
+ context(@"should get correctly when initialized with dictionary", ^{
+ NSDictionary *dict = @{SDLRPCParameterNameType:type,
+ SDLRPCParameterNameRange:@(range),
+ SDLRPCParameterNameLevel:@(fuelLevel),
+ SDLRPCParameterNameLevelState:levelState,
+ SDLRPCParameterNameCapacity:@(fuelCapacity),
+ SDLRPCParameterNameCapacityUnit:capacityUnit
};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLFuelRange *testStruct = [[SDLFuelRange alloc] initWithDictionary:dict];
#pragma clang diagnostic pop
- expect(testStruct.type).to(equal(SDLFuelTypeLPG));
- expect(testStruct.range).to(equal(@23));
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.type).to(equal(type));
+ expect(testStruct.range).to(equal(@(range)));
+ expect(testStruct.level).to(equal(fuelLevel));
+ expect(testStruct.levelState).to(equal(levelState));
+ expect(testStruct.capacity).to(equal(fuelCapacity));
+ expect(testStruct.capacityUnit).to(equal(capacityUnit));
+ });
});
- it(@"Should return nil if not set", ^ {
+ context(@"init", ^{
SDLFuelRange *testStruct = [[SDLFuelRange alloc] init];
- expect(testStruct.type).to(beNil());
- expect(testStruct.range).to(beNil());
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.type).to(beNil());
+ expect(testStruct.range).to(beNil());
+ expect(testStruct.level).to(beNil());
+ expect(testStruct.levelState).to(beNil());
+ expect(testStruct.capacity).to(beNil());
+ expect(testStruct.capacityUnit).to(beNil());
+ });
+ });
+
+ context(@"initWithType:range:level:levelState:capacity:capacityUnit:", ^{
+ SDLFuelRange *testStruct = [[SDLFuelRange alloc] initWithType:type range:range level:fuelLevel levelState:levelState capacity:fuelCapacity capacityUnit:capacityUnit];
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.type).to(equal(type));
+ expect(testStruct.range).to(equal(@(range)));
+ expect(testStruct.level).to(equal(fuelLevel));
+ expect(testStruct.levelState).to(equal(levelState));
+ expect(testStruct.capacity).to(equal(fuelCapacity));
+ expect(testStruct.capacityUnit).to(equal(capacityUnit));
+ });
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m
index 8ecd92e6c..c5c18cd6a 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m
@@ -19,9 +19,11 @@ describe(@"SDLHMICapabilities struct", ^{
__block NSNumber *someVideoStreamState = @NO;
__block NSNumber *someRemoteControlState = @YES;
__block NSNumber *someAppServicesState = @YES;
-
+ __block NSNumber *someDisplaysState = @YES;
+ __block NSNumber *someSeatLocationState = @NO;
+ __block NSNumber *someDriverDistractionState = @NO;
- context(@"When initialized with properties", ^{
+ context(@"when initialized with properties", ^{
beforeEach(^{
testStruct = [[SDLHMICapabilities alloc] init];
testStruct.phoneCall = somePhoneCallState;
@@ -29,6 +31,9 @@ describe(@"SDLHMICapabilities struct", ^{
testStruct.videoStreaming = someVideoStreamState;
testStruct.remoteControl = someRemoteControlState;
testStruct.appServices = someAppServicesState;
+ testStruct.displays = someDisplaysState;
+ testStruct.seatLocation = someSeatLocationState;
+ testStruct.driverDistraction = someDriverDistractionState;
});
it(@"should properly set properties", ^{
@@ -37,22 +42,26 @@ describe(@"SDLHMICapabilities struct", ^{
expect(testStruct.videoStreaming).to(equal(someVideoStreamState));
expect(testStruct.remoteControl).to(equal(someRemoteControlState));
expect(testStruct.appServices).to(equal(someAppServicesState));
+ expect(testStruct.displays).to(equal(someDisplaysState));
+ expect(testStruct.seatLocation).to(equal(someSeatLocationState));
+ expect(testStruct.driverDistraction).to(equal(someDriverDistractionState));
});
});
- context(@"When initialized with a dictionary", ^{
+ context(@"when initialized with a dictionary", ^{
beforeEach(^{
NSDictionary<NSString *, NSNumber *> *structInitDict = @{
SDLRPCParameterNameNavigation: someNavigationState,
SDLRPCParameterNamePhoneCall: somePhoneCallState,
SDLRPCParameterNameVideoStreaming: someVideoStreamState,
SDLRPCParameterNameRemoteControl: someRemoteControlState,
- SDLRPCParameterNameAppServices: someAppServicesState
+ SDLRPCParameterNameAppServices: someAppServicesState,
+ SDLRPCParameterNameDisplays: someDisplaysState,
+ SDLRPCParameterNameSeatLocation: someSeatLocationState,
+ SDLRPCParameterNameDriverDistraction: someDriverDistractionState
};
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- testStruct = [[SDLHMICapabilities alloc] initWithDictionary:[structInitDict mutableCopy]];
-#pragma clang diagnostic pop
+
+ testStruct = [[SDLHMICapabilities alloc] initWithDictionary:structInitDict];
});
it(@"should properly set properties", ^{
@@ -61,20 +70,44 @@ describe(@"SDLHMICapabilities struct", ^{
expect(testStruct.videoStreaming).to(equal(someVideoStreamState));
expect(testStruct.remoteControl).to(equal(someRemoteControlState));
expect(testStruct.appServices).to(equal(someAppServicesState));
+ expect(testStruct.displays).to(equal(someDisplaysState));
+ expect(testStruct.seatLocation).to(equal(someSeatLocationState));
+ expect(testStruct.driverDistraction).to(equal(someDriverDistractionState));
});
});
- context(@"When not initialized", ^{
- beforeEach(^{
- testStruct = nil;
+ context(@"when initialized", ^{
+ context(@"with no parameters", ^{
+ beforeEach(^{
+ testStruct = [[SDLHMICapabilities alloc] init];
+ });
+
+ it(@"properties should be nil", ^{
+ expect(testStruct.phoneCall).to(beNil());
+ expect(testStruct.navigation).to(beNil());
+ expect(testStruct.videoStreaming).to(beNil());
+ expect(testStruct.remoteControl).to(beNil());
+ expect(testStruct.displays).to(beNil());
+ expect(testStruct.seatLocation).to(beNil());
+ expect(testStruct.appServices).to(beNil());
+ });
});
-
- it(@"properties should be nil", ^{
- expect(testStruct.phoneCall).to(beNil());
- expect(testStruct.navigation).to(beNil());
- expect(testStruct.videoStreaming).to(beNil());
- expect(testStruct.remoteControl).to(beNil());
- expect(testStruct.appServices).to(beNil());
+
+ context(@"with initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:", ^{
+ beforeEach(^{
+ testStruct = [[SDLHMICapabilities alloc] initWithNavigation:someNavigationState phoneCall:somePhoneCallState videoStreaming:someVideoStreamState remoteControl:someRemoteControlState appServices:someAppServicesState displays:someDisplaysState seatLocation:someSeatLocationState driverDistraction:someDriverDistractionState];
+ });
+
+ it(@"properties should be nil", ^{
+ expect(testStruct.phoneCall).to(equal(somePhoneCallState));
+ expect(testStruct.navigation).to(equal(someNavigationState));
+ expect(testStruct.videoStreaming).to(equal(someVideoStreamState));
+ expect(testStruct.remoteControl).to(equal(someRemoteControlState));
+ expect(testStruct.appServices).to(equal(someAppServicesState));
+ expect(testStruct.displays).to(equal(someDisplaysState));
+ expect(testStruct.seatLocation).to(equal(someSeatLocationState));
+ expect(testStruct.driverDistraction).to(equal(someDriverDistractionState));
+ });
});
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m
index 95af8629e..2736f3500 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m
@@ -27,9 +27,9 @@ describe(@"Initialization tests", ^{
});
it(@"should properly initialize initWithDictionary", ^{
- NSMutableDictionary* dict = [@{SDLRPCParameterNameParentId:@(testParentId),
+ NSDictionary *dict = @{SDLRPCParameterNameParentID:@(testParentId),
SDLRPCParameterNamePosition:@(testPosition),
- SDLRPCParameterNameMenuName:testMenuName} mutableCopy];
+ SDLRPCParameterNameMenuName:testMenuName};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLMenuParams* testStruct = [[SDLMenuParams alloc] initWithDictionary:dict];
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m
index d41f553b6..68bd020f0 100755
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m
@@ -6,17 +6,18 @@
#import "SDLSystemCapability.h"
#import "SDLAppServicesCapabilities.h"
+#import "SDLDriverDistractionCapability.h"
#import "SDLImageResolution.h"
#import "SDLNavigationCapability.h"
#import "SDLPhoneCapability.h"
-#import "SDLSystemCapabilityType.h"
#import "SDLRemoteControlCapabilities.h"
#import "SDLRPCParameterNames.h"
+#import "SDLSeatLocationCapability.h"
+#import "SDLSystemCapabilityType.h"
#import "SDLVideoStreamingCapability.h"
#import "SDLVideoStreamingCodec.h"
#import "SDLVideoStreamingFormat.h"
#import "SDLVideoStreamingProtocol.h"
-#import "SDLSeatLocationCapability.h"
#import "SDLRPCParameterNames.h"
@@ -29,6 +30,7 @@ describe(@"Getter/Setter Tests", ^ {
__block SDLRemoteControlCapabilities *testRemoteControlCapabilities = nil;
__block SDLVideoStreamingCapability *testVideoStreamingCapability = nil;
__block SDLSeatLocationCapability *testSeatLocationCapability = nil;
+ __block SDLDriverDistractionCapability *testDriverDistractionCapability = nil;
beforeEach(^{
testAppServicesCapabilities = [[SDLAppServicesCapabilities alloc] initWithAppServices:nil];
@@ -37,6 +39,7 @@ describe(@"Getter/Setter Tests", ^ {
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];
testSeatLocationCapability = [[SDLSeatLocationCapability alloc] init];
+ testDriverDistractionCapability = [[SDLDriverDistractionCapability alloc] initWithMenuLength:@2 subMenuDepth:@4];
});
it(@"Should set and get correctly", ^ {
@@ -48,6 +51,7 @@ describe(@"Getter/Setter Tests", ^ {
testStruct.videoStreamingCapability = testVideoStreamingCapability;
testStruct.remoteControlCapability = testRemoteControlCapabilities;
testStruct.seatLocationCapability = testSeatLocationCapability;
+ testStruct.driverDistractionCapability = testDriverDistractionCapability;
expect(testStruct.systemCapabilityType).to(equal(SDLSystemCapabilityTypeNavigation));
expect(testStruct.appServicesCapabilities).to(equal(testAppServicesCapabilities));
@@ -56,17 +60,19 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.videoStreamingCapability).to(equal(testVideoStreamingCapability));
expect(testStruct.remoteControlCapability).to(equal(testRemoteControlCapabilities));
expect(testStruct.seatLocationCapability).to(equal(testSeatLocationCapability));
+ expect(testStruct.driverDistractionCapability).to(equal(testDriverDistractionCapability));
});
it(@"Should get correctly when initialized with a dictionary", ^ {
NSDictionary *dict = @{
- SDLRPCParameterNameSystemCapabilityType:SDLSystemCapabilityTypeNavigation,
- SDLRPCParameterNameAppServicesCapabilities:testAppServicesCapabilities,
- SDLRPCParameterNameNavigationCapability:testNavigationCapability,
- SDLRPCParameterNamePhoneCapability:testPhoneCapability,
- SDLRPCParameterNameRemoteControlCapability:testRemoteControlCapabilities,
- SDLRPCParameterNameVideoStreamingCapability:testVideoStreamingCapability,
- SDLRPCParameterNameSeatLocationCapability:testSeatLocationCapability
+ SDLRPCParameterNameSystemCapabilityType: SDLSystemCapabilityTypeNavigation,
+ SDLRPCParameterNameAppServicesCapabilities: testAppServicesCapabilities,
+ SDLRPCParameterNameNavigationCapability: testNavigationCapability,
+ SDLRPCParameterNamePhoneCapability: testPhoneCapability,
+ SDLRPCParameterNameRemoteControlCapability: testRemoteControlCapabilities,
+ SDLRPCParameterNameVideoStreamingCapability: testVideoStreamingCapability,
+ SDLRPCParameterNameSeatLocationCapability: testSeatLocationCapability,
+ SDLRPCParameterNameDriverDistractionCapability: testDriverDistractionCapability
};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -80,6 +86,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(equal(testRemoteControlCapabilities));
expect(testStruct.videoStreamingCapability).to(equal(testVideoStreamingCapability));
expect(testStruct.seatLocationCapability).to(equal(testSeatLocationCapability));
+ expect(testStruct.driverDistractionCapability).to(equal(testDriverDistractionCapability));
});
it(@"Should return nil if not set", ^ {
@@ -92,6 +99,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.videoStreamingCapability).to(beNil());
expect(testStruct.remoteControlCapability).to(beNil());
expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(beNil());
});
it(@"should initialize correctly with initWithAppServicesCapabilities:", ^{
@@ -104,6 +112,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(beNil());
expect(testStruct.videoStreamingCapability).to(beNil());
expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(beNil());
});
it(@"should initialize correctly with initWithPhoneCapability:", ^{
@@ -117,6 +126,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(beNil());
expect(testStruct.videoStreamingCapability).to(beNil());
expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(beNil());
});
it(@"should initialize correctly with initWithNavigationCapability:", ^{
@@ -130,6 +140,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(beNil());
expect(testStruct.videoStreamingCapability).to(beNil());
expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(beNil());
});
it(@"should initialize correctly with initWithVideoStreamingCapability:", ^{
@@ -160,6 +171,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(beNil());
expect(testStruct.videoStreamingCapability).to(equal(testVidStruct));
expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(beNil());
});
it(@"should initialize correctly with initWithRemoteControlCapability:", ^{
@@ -172,6 +184,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(equal(testRemoteControlCapabilities));
expect(testStruct.videoStreamingCapability).to(beNil());
expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(beNil());
});
it(@"should initialize correctly with initWithSeatLocationCapability:", ^{
@@ -184,6 +197,20 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.remoteControlCapability).to(beNil());
expect(testStruct.videoStreamingCapability).to(beNil());
expect(testStruct.seatLocationCapability).to(equal(testSeatLocationCapability));
+ expect(testStruct.driverDistractionCapability).to(beNil());
+ });
+
+ it(@"should initialize correctly with initWithDriverDistractionCapability:", ^{
+ SDLSystemCapability *testStruct = [[SDLSystemCapability alloc] initWithDriverDistractionCapability:testDriverDistractionCapability];
+
+ expect(testStruct.systemCapabilityType).to(equal(SDLSystemCapabilityTypeDriverDistraction));
+ expect(testStruct.appServicesCapabilities).to(beNil());
+ expect(testStruct.navigationCapability).to(beNil());
+ expect(testStruct.phoneCapability).to(beNil());
+ expect(testStruct.remoteControlCapability).to(beNil());
+ expect(testStruct.videoStreamingCapability).to(beNil());
+ expect(testStruct.seatLocationCapability).to(beNil());
+ expect(testStruct.driverDistractionCapability).to(equal(testDriverDistractionCapability));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m
index fcde49e1e..d8b6e8983 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m
@@ -18,7 +18,7 @@ QuickSpecBegin(SDLTextFieldSpec)
describe(@"Getter/Setter Tests", ^ {
__block SDLTextFieldName testName = SDLTextFieldNameETA;
- __block SDLCharacterSet testCharacterSet = SDLCharacterSetCID1;
+ __block SDLCharacterSet testCharacterSet = SDLCharacterSetUtf8;
__block NSUInteger testWidth = 100;
__block NSUInteger testRows = 4;
diff --git a/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m b/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m
index 5ae9101a3..15295118b 100644
--- a/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLEncryptionLifecycleManagerSpec.m
@@ -11,30 +11,34 @@
#import <OCMock/OCMock.h>
#import "SDLDisplayCapabilities.h"
+#import "SDLConfiguration.h"
+#import "SDLEncryptionConfiguration.h"
+#import "SDLEncryptionLifecycleManager.h"
+#import "SDLEncryptionManagerConstants.h"
+#import "SDLFakeSecurityManager.h"
#import "SDLGlobals.h"
+#import "SDLLifecycleConfiguration.h"
#import "SDLOnHMIStatus.h"
#import "SDLProtocol.h"
#import "SDLRegisterAppInterfaceResponse.h"
#import "SDLRPCNotificationNotification.h"
#import "SDLRPCResponseNotification.h"
#import "SDLStateMachine.h"
-#import "SDLEncryptionConfiguration.h"
-#import "SDLEncryptionLifecycleManager.h"
#import "SDLV2ProtocolHeader.h"
#import "SDLV2ProtocolMessage.h"
+#import "SDLVehicleType.h"
#import "TestConnectionManager.h"
-#import "SDLFakeSecurityManager.h"
-#import "SDLEncryptionManagerConstants.h"
@interface SDLEncryptionLifecycleManager()
@property (strong, nonatomic, readwrite) SDLStateMachine *encryptionStateMachine;
+@property (nonatomic, strong) NSMutableDictionary<NSString *, Class> *securityManagers;
@end
QuickSpecBegin(SDLEncryptionLifecycleManagerSpec)
describe(@"the encryption lifecycle manager", ^{
__block SDLEncryptionLifecycleManager *encryptionLifecycleManager = nil;
- __block SDLEncryptionConfiguration *testConfiguration = nil;
+ __block SDLConfiguration *testConfiguration = nil;
__block TestConnectionManager *testConnectionManager = nil;
__block SDLFakeSecurityManager *testFakeSecurityManager = nil;
__block NSOperationQueue *testRPCOperationQueue = nil;
@@ -42,14 +46,18 @@ describe(@"the encryption lifecycle manager", ^{
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
testFakeSecurityManager = [[SDLFakeSecurityManager alloc] init];
- testConfiguration = [[SDLEncryptionConfiguration alloc] initWithSecurityManagers:@[testFakeSecurityManager.class] delegate:nil];
+
+ SDLEncryptionConfiguration *encryptionConfig = [[SDLEncryptionConfiguration alloc] initWithSecurityManagers:@[testFakeSecurityManager.class] delegate:nil];
+ SDLLifecycleConfiguration *lifecycleConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:@"Test" fullAppId:@"1234"];
+ testConfiguration = [[SDLConfiguration alloc] initWithLifecycle:lifecycleConfig lockScreen:nil logging:nil fileManager:nil encryption:encryptionConfig];
testRPCOperationQueue = OCMClassMock([NSOperationQueue class]);
encryptionLifecycleManager = [[SDLEncryptionLifecycleManager alloc] initWithConnectionManager:testConnectionManager configuration:testConfiguration];
});
it(@"should initialize properties", ^{
- expect(@(encryptionLifecycleManager.isEncryptionReady)).to(equal(@NO));
+ expect(encryptionLifecycleManager.isEncryptionReady).to(beFalse());
+ expect(encryptionLifecycleManager.securityManagers).toNot(beEmpty());
});
describe(@"when started", ^{
@@ -65,8 +73,8 @@ describe(@"the encryption lifecycle manager", ^{
[encryptionLifecycleManager startWithProtocol:protocolMock];
});
- it(@"should not be ready to stream", ^{
- expect(@(encryptionLifecycleManager.isEncryptionReady)).to(equal(@NO));
+ it(@"should not be ready to encrypt", ^{
+ expect(encryptionLifecycleManager.isEncryptionReady).to(beFalse());
});
describe(@"after receiving an RPC Start ACK", ^{
@@ -83,7 +91,7 @@ describe(@"the encryption lifecycle manager", ^{
testRPCHeader.serviceType = SDLServiceTypeRPC;
testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager handleProtocolStartServiceACKMessage:testRPCMessage];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveStartServiceACK:testRPCMessage];
});
it(@"should have set all the right properties", ^{
@@ -106,7 +114,7 @@ describe(@"the encryption lifecycle manager", ^{
testRPCHeader.serviceType = SDLServiceTypeRPC;
testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager handleProtocolEndServiceACKMessage:testRPCMessage];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testRPCMessage];
});
it(@"should have set all the right properties", ^{
@@ -128,7 +136,7 @@ describe(@"the encryption lifecycle manager", ^{
testRPCHeader.serviceType = SDLServiceTypeRPC;
testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager handleProtocolEndServiceACKMessage:testRPCMessage];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceACK:testRPCMessage];
});
it(@"should have set all the right properties", ^{
@@ -150,13 +158,55 @@ describe(@"the encryption lifecycle manager", ^{
testRPCHeader.serviceType = SDLServiceTypeRPC;
testRPCMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:testRPCHeader andPayload:nil];
- [encryptionLifecycleManager handleProtocolEndServiceNAKMessage:testRPCMessage];
+ [encryptionLifecycleManager protocol:protocolMock didReceiveEndServiceNAK: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]]);
+
+ 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];
+ });
+
+ it(@"should set the protocol's security manager", ^{
+ OCMVerifyAll((id)protocolMock);
+ });
+ });
+ });
+
+ describe(@"when stopped", ^{
+ it(@"if the encryption manager is ready it should transition to the stopped state", ^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateReady fromOldState:nil callEnterTransition:NO];
+
+ [encryptionLifecycleManager stop];
+
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+ });
+
+ it(@"if the encryption manager is starting it should stay in the stopped state", ^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStarting fromOldState:nil callEnterTransition:NO];
+
+ [encryptionLifecycleManager stop];
+
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+ });
+
+ it(@"if the encryption manager is stopped it should stay in the stopped state", ^{
+ [encryptionLifecycleManager.encryptionStateMachine setToState:SDLEncryptionLifecycleManagerStateStopped fromOldState:nil callEnterTransition:NO];
+
+ [encryptionLifecycleManager stop];
+
+ expect(encryptionLifecycleManager.encryptionStateMachine.currentState).to(equal(SDLEncryptionLifecycleManagerStateStopped));
+ });
});
});
diff --git a/SmartDeviceLinkTests/SDLPermissionElementSpec.m b/SmartDeviceLinkTests/SDLPermissionElementSpec.m
new file mode 100644
index 000000000..2fac3a7c2
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLPermissionElementSpec.m
@@ -0,0 +1,59 @@
+//
+// SDLPermissionElementSpec.m
+// SmartDeviceLinkTests
+//
+// Created by James Lapinski on 6/24/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLParameterPermissions.h"
+#import "SDLPermissionElement.h"
+
+QuickSpecBegin(SDLPermissionElementSpec)
+
+describe(@"A permission element", ^{
+ __block NSString *testRPCName1 = nil;
+ __block NSArray<NSString *> *parameterPermissions = nil;
+ __block NSString *testParameterRPCName = nil;
+
+ beforeEach(^{
+ testRPCName1 = @"testRPCName1";
+ testParameterRPCName = @"testParameterRPCName";
+ parameterPermissions = @[testParameterRPCName];
+ });
+
+ describe(@"it should initialize correctly", ^{
+ __block SDLPermissionElement *testPermissionElement = nil;
+
+ beforeEach(^{
+ testPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:testRPCName1 parameterPermissions:parameterPermissions];
+ });
+
+ it(@"should set the rpcName and parameterPermissions correctly", ^{
+ expect(testPermissionElement.rpcName).to(equal(testRPCName1));
+ expect(testPermissionElement.parameterPermissions).to(equal(parameterPermissions));
+ });
+ });
+
+ describe(@"copying a permission element", ^{
+ __block SDLPermissionElement *testPermissionElement = nil;
+ __block SDLPermissionElement *testPermissionElementCopy = nil;
+
+ beforeEach(^{
+ testPermissionElement = [[SDLPermissionElement alloc] initWithRPCName:testRPCName1 parameterPermissions:parameterPermissions];
+ testPermissionElementCopy = [testPermissionElement copy];
+ });
+
+ it(@"should copy correctly", ^{
+ expect(testPermissionElementCopy).toNot(beIdenticalTo(testPermissionElement));
+ expect(testPermissionElementCopy.rpcName).to(equal(testPermissionElement.rpcName));
+ expect(testPermissionElementCopy.parameterPermissions).to(equal(testPermissionElement.parameterPermissions));
+ });
+ });
+});
+
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLRPCPermissionStatusSpec.m b/SmartDeviceLinkTests/SDLRPCPermissionStatusSpec.m
new file mode 100644
index 000000000..f0c0082c5
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLRPCPermissionStatusSpec.m
@@ -0,0 +1,43 @@
+//
+// SDLRPCPermissionStatusSpec.m
+// SmartDeviceLinkTests
+//
+// Created by James Lapinski on 6/29/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLRPCPermissionStatus.h"
+
+QuickSpecBegin(SDLRPCPermissionStatusSpec)
+
+describe(@"A rpc permission status", ^{
+ __block NSString *testRPCName = nil;
+ __block NSString *testParameterName = nil;
+ __block BOOL isRPCAllowed = NO;
+ __block NSMutableDictionary<NSString *,NSNumber *> *allowedParameters = nil;
+
+ beforeEach(^{
+ testRPCName = @"testRPCName";
+ testParameterName = @"testParameterRPCName";
+ allowedParameters = [@{ testParameterName: @0 } mutableCopy];
+ });
+
+ describe(@"it should initialize correctly", ^{
+ __block SDLRPCPermissionStatus *testSDLRPCPermissionStatusSpec = nil;
+
+ beforeEach(^{
+ testSDLRPCPermissionStatusSpec = [[SDLRPCPermissionStatus alloc] initWithRPCName:testRPCName isRPCAllowed:isRPCAllowed rpcParameters:allowedParameters];
+ });
+
+ it(@"should set rpcName, isRPCAllowed, rpcParameters correctly", ^{
+ expect(testSDLRPCPermissionStatusSpec.rpcName).to(equal(testRPCName));
+ expect(testSDLRPCPermissionStatusSpec.isRPCAllowed).to(equal(isRPCAllowed));
+ expect(testSDLRPCPermissionStatusSpec.rpcParameters[testParameterName]).to(equal(@NO));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
index f2b09c66e..623ec427c 100644
--- a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
+++ b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
@@ -21,7 +21,7 @@ describe(@"a soft button replace operation", ^{
__block SDLSoftButtonReplaceOperation *testOp = nil;
__block TestConnectionManager *testConnectionManager = nil;
- __block SDLFileManager *testFileManager = nil;
+ __block id testFileManager = nil;
__block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
@@ -33,15 +33,20 @@ describe(@"a soft button replace operation", ^{
__block NSString *object1State2Text = @"O1S2 Text";
__block SDLSoftButtonState *object1State1 = nil;
__block SDLSoftButtonState *object1State2 = nil;
- __block SDLSoftButtonObject *button1 = nil;
+ __block SDLSoftButtonObject *buttonWithText = nil;
__block NSString *object2Name = @"O2 Name";
__block NSString *object2State1Name = @"O2S1 Name";
+ __block NSString *object2State2Name = @"O2S2 Name";
__block NSString *object2State1Text = @"O2S1 Text";
+ __block NSString *object2State2Text = @"O2S2 Text";
__block NSString *object2State1ArtworkName = @"O2S1 Artwork";
+ __block NSString *object2State2ArtworkName = @"O2S2 Artwork";
__block SDLArtwork *object2State1Art = nil;
+ __block SDLArtwork *object2State2Art = nil;
__block SDLSoftButtonState *object2State1 = nil;
- __block SDLSoftButtonObject *button2 = nil;
+ __block SDLSoftButtonState *object2State2 = nil;
+ __block SDLSoftButtonObject *buttonWithTextAndImage = nil;
__block NSString *object3Name = @"O3 Name";
__block NSString *object3State1Name = @"O3S1 Name";
@@ -49,14 +54,30 @@ describe(@"a soft button replace operation", ^{
__block NSString *object3State1IconName = SDLStaticIconNameRSS;
__block SDLArtwork *object3State1Art = nil;
__block SDLSoftButtonState *object3State1 = nil;
- __block SDLSoftButtonObject *button3 = nil;
+ __block SDLSoftButtonObject *buttonWithTextAndStaticImage = nil;
__block NSString *object4Name = @"O4 Name";
__block NSString *object4State1Name = @"O4S1 Name";
__block NSString *object4State1IconName = SDLStaticIconNameAlbum;
__block SDLArtwork *object4State1Art = nil;
__block SDLSoftButtonState *object4State1 = nil;
- __block SDLSoftButtonObject *button4 = nil;
+ __block SDLSoftButtonObject *buttonWithImage = nil;
+
+ __block NSString *object5Name = @"O5 Name";
+ __block NSString *object5State1Name = @"O5S1 Name";
+ __block NSString *object5State2Name = @"O5S2 Name";
+ __block NSString *object5State3Name = @"O5S3 Name";
+ __block NSString *object5State2IconName = @"O5S2 Name";
+ __block NSString *object5State3IconName = @"O5S3 Name";
+ __block NSString *object5State1Text = @"O5S1 Text";
+ __block NSString *object5State2Text = @"O5S2 Text";
+ __block NSString *object5State3Text = @"O5S3 Text";
+ __block SDLArtwork *object5State2Art = nil;
+ __block SDLArtwork *object5State3Art = nil;
+ __block SDLSoftButtonState *object5State1 = nil;
+ __block SDLSoftButtonState *object5State2 = nil;
+ __block SDLSoftButtonState *object5State3 = nil;
+ __block SDLSoftButtonObject *buttonWithTextAndImage2 = nil;
__block NSString *testMainField1 = @"Test main field 1";
@@ -68,25 +89,32 @@ describe(@"a soft button replace operation", ^{
hasCalledOperationCompletionHandler = NO;
testConnectionManager = [[TestConnectionManager alloc] init];
- testFileManager = OCMClassMock([SDLFileManager class]);
+ testFileManager = OCMStrictClassMock([SDLFileManager class]);
object1State1 = [[SDLSoftButtonState alloc] initWithStateName:object1State1Name text:object1State1Text artwork:nil];
object1State2 = [[SDLSoftButtonState alloc] initWithStateName:object1State2Name text:object1State2Text artwork:nil];
- button1 = [[SDLSoftButtonObject alloc] initWithName:object1Name state:object1State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ buttonWithText = [[SDLSoftButtonObject alloc] initWithName:object1Name state:object1State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
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];
object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State1Art];
- button2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ 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) {}];
object3State1Art = [[SDLArtwork alloc] initWithStaticIcon:object3State1IconName];
object3State1 = [[SDLSoftButtonState alloc] initWithStateName:object3State1Name text:object3State1Text artwork:object3State1Art];
- button3 = [[SDLSoftButtonObject alloc] initWithName:object3Name state:object3State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
+ buttonWithTextAndStaticImage = [[SDLSoftButtonObject alloc] initWithName:object3Name state:object3State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
object4State1Art = [[SDLArtwork alloc] initWithStaticIcon:object4State1IconName];
object4State1 = [[SDLSoftButtonState alloc] initWithStateName:object4State1Name text:nil artwork:object4State1Art];;
- button4 = [[SDLSoftButtonObject alloc] initWithName:object4Name state:object4State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];;
+ buttonWithImage = [[SDLSoftButtonObject alloc] initWithName:object4Name state:object4State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
- OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ object5State2Art = [[SDLArtwork alloc] initWithData:[@"object5State2Art" dataUsingEncoding:NSUTF8StringEncoding] name:object5State2IconName fileExtension:@"png" persistent:YES];
+ object5State3Art = [[SDLArtwork alloc] initWithData:[@"object5State3Art" dataUsingEncoding:NSUTF8StringEncoding] name:object5State3IconName fileExtension:@"png" persistent:YES];
+ object5State1 = [[SDLSoftButtonState alloc] initWithStateName:object5State1Name text:object5State1Text artwork:nil];
+ object5State2 = [[SDLSoftButtonState alloc] initWithStateName:object5State2Name text:object5State2Text artwork:object5State2Art];
+ object5State3 = [[SDLSoftButtonState alloc] initWithStateName:object5State3Name text:object5State3Text artwork:object5State3Art];
+ buttonWithTextAndImage2 = [[SDLSoftButtonObject alloc] initWithName:object5Name states:@[object5State1, object5State2, object5State3] initialStateName:object5State1.name handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];
successResponse = [[SDLRPCResponse alloc] init];
successResponse.success = @YES;
@@ -99,23 +127,29 @@ describe(@"a soft button replace operation", ^{
it(@"should have a priority of 'normal'", ^{
testOp = [[SDLSoftButtonReplaceOperation alloc] init];
-
expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
});
describe(@"running the operation", ^{
context(@"without artworks", ^{
+ __block NSArray<SDLSoftButtonObject *> *testSoftButtonObjects = nil;
+ __block SDLSoftButtonCapabilities *capabilities = nil;
+
beforeEach(^{
- SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init];
+ testSoftButtonObjects = @[buttonWithText];
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
+
+ capabilities = [[SDLSoftButtonCapabilities alloc] init];
capabilities.imageSupported = @YES;
+ });
- NSArray<SDLSoftButtonObject *> *testSoftButtonObjects = @[button1];
+ it(@"should send the correct RPCs", ^{
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:nil completionHandler:nil]);
- testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
[testOp start];
- });
- it(@"should send the correct RPCs", ^{
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+
NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
expect(sentRequests).to(haveCount(1));
expect(sentRequests.firstObject.mainField1).to(equal(testMainField1));
@@ -126,7 +160,11 @@ describe(@"a soft button replace operation", ^{
expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText));
});
- context(@"When a response is received to the text upload", ^{
+ context(@"When a response is received to the upload", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
it(@"should finish the operation on a successful response", ^{
[testConnectionManager respondToLastRequestWithResponse:successResponse];
@@ -145,25 +183,27 @@ describe(@"a soft button replace operation", ^{
context(@"with artworks", ^{
__block NSArray<SDLSoftButtonObject *> *testSoftButtonObjects = nil;
+ __block SDLSoftButtonCapabilities *capabilities = nil;
beforeEach(^{
- testSoftButtonObjects = @[button1, button2];
+ testSoftButtonObjects = @[buttonWithText, buttonWithTextAndImage];
});
context(@"but the HMI does not support artworks", ^{
beforeEach(^{
- SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init];
+ capabilities = [[SDLSoftButtonCapabilities alloc] init];
capabilities.imageSupported = @NO;
testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
- [testOp start];
- });
-
- it(@"should not upload any artworks", ^{
- OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
});
it(@"should send the button text", ^{
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:nil completionHandler:nil]);
+
+ [testOp start];
+
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+
NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
expect(sentRequests).to(haveCount(1));
expect(sentRequests.firstObject.mainField1).to(equal(testMainField1));
@@ -177,7 +217,11 @@ describe(@"a soft button replace operation", ^{
expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeText));
});
- context(@"When a response is received to the text upload", ^{
+ context(@"When a response is received to the upload", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
it(@"should finish the operation on a successful response", ^{
[testConnectionManager respondToLastRequestWithResponse:successResponse];
@@ -195,52 +239,49 @@ describe(@"a soft button replace operation", ^{
});
context(@"but the HMI does not support artworks and some buttons are image-only", ^{
- __block NSArray<SDLSoftButtonObject *> *testImageOnlySoftButtonObjects = nil;
-
beforeEach(^{
- testImageOnlySoftButtonObjects = @[button3, button4];
- });
+ testSoftButtonObjects = @[buttonWithTextAndStaticImage, buttonWithImage];
- beforeEach(^{
- SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init];
+ capabilities = [[SDLSoftButtonCapabilities alloc] init];
capabilities.imageSupported = @NO;
- testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testImageOnlySoftButtonObjects mainField1:testMainField1];
- [testOp start];
- });
-
- it(@"should not send artworks", ^{
- OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
});
it(@"should not send any buttons", ^{
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:nil completionHandler:nil]);
+
+ [testOp start];
+
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+
NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
expect(sentRequests).to(haveCount(0));
- });
- it(@"should have set the operation to finished", ^ {
expect(testOp.isFinished).to(beTrue());
});
});
- context(@"and the HMI supports artworks", ^{
- __block SDLSoftButtonCapabilities *buttonCapabilities = nil;
-
+ context(@"and the module supports artworks", ^{
beforeEach(^{
- buttonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
- buttonCapabilities.imageSupported = @YES;
+ capabilities = [[SDLSoftButtonCapabilities alloc] init];
+ capabilities.imageSupported = @YES;
});
context(@"when artworks are already on the system", ^{
beforeEach(^{
OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
- testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:buttonCapabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
- [testOp start];
+ testSoftButtonObjects = @[buttonWithText, buttonWithTextAndImage];
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
});
it(@"should not upload artworks", ^{
- OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:nil completionHandler:nil]);
+
+ [testOp start];
+
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
expect(sentRequests).to(haveCount(1));
@@ -255,7 +296,11 @@ describe(@"a soft button replace operation", ^{
expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeBoth));
});
- context(@"When a response is received to the text upload", ^{
+ context(@"When a response is received to the upload", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
it(@"should finish the operation on a successful response", ^{
[testConnectionManager respondToLastRequestWithResponse:successResponse];
@@ -273,23 +318,23 @@ describe(@"a soft button replace operation", ^{
});
context(@"when the artworks need uploading", ^{
- __block SDLSoftButtonCapabilities *buttonCapabilities = nil;
-
beforeEach(^{
- buttonCapabilities = [[SDLSoftButtonCapabilities alloc] init];
- buttonCapabilities.imageSupported = @YES;
+ OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
});
context(@"when artworks are static icons", ^{
beforeEach(^{
- testSoftButtonObjects = @[button3];
+ testSoftButtonObjects = @[buttonWithTextAndStaticImage];
- testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:buttonCapabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
- [testOp start];
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
});
it(@"should skip uploading artwork", ^{
- OCMReject([testFileManager uploadArtwork:[OCMArg any] completionHandler:[OCMArg any]]);
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:nil completionHandler:nil]);
+
+ [testOp start];
+
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
expect(sentRequests).to(haveCount(1));
@@ -301,7 +346,11 @@ describe(@"a soft button replace operation", ^{
expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeBoth));
});
- context(@"When a response is received to the text upload", ^{
+ context(@"When a response is received to the upload", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
it(@"should finish the operation on a successful response", ^{
[testConnectionManager respondToLastRequestWithResponse:successResponse];
@@ -318,20 +367,20 @@ describe(@"a soft button replace operation", ^{
});
});
- context(@"when artwork are not already on the system", ^{
- beforeEach(^{
- OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
-
- testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:buttonCapabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
+ context(@"when artworks are dynamic icons", ^{
+ 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]]);
+ testSoftButtonObjects = @[buttonWithText, buttonWithTextAndImage];
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
[testOp start];
- });
-
- it(@"should upload artworks", ^{
- OCMVerify([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
- NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
- return (artworks.count == 1);
- }] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+ // Check that the artworks in the other states (i.e. the non-first states) are uploaded
+ OCMExpect([testFileManager uploadArtworks:@[buttonWithTextAndImage.states[1].artwork] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ [testConnectionManager respondToLastRequestWithResponse:successResponse];
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+
// Both the text only buttons and the image buttons should be sent
NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
expect(sentRequests).to(haveCount(2));
@@ -350,23 +399,76 @@ describe(@"a soft button replace operation", ^{
expect(sentRequests.lastObject.softButtons).to(haveCount(2));
expect(sentRequests.lastObject.softButtons.firstObject.text).to(equal(object1State1Text));
expect(sentRequests.lastObject.softButtons.firstObject.image).to(beNil());
- expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText));
+ expect(sentRequests.lastObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText));
expect(sentRequests.lastObject.softButtons.lastObject.text).to(equal(object2State1Text));
expect(sentRequests.lastObject.softButtons.lastObject.image).toNot(beNil());
expect(sentRequests.lastObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeBoth));
});
- context(@"When a response is received to the text upload", ^{
+ 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]]);
+
+ // 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];
+ OCMExpect([testFileManager uploadArtworks:testArtworkUploads progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+ [testConnectionManager respondToLastRequestWithResponse:successResponse];
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+
+ // Both the text only buttons and the image buttons should be sent
+ NSArray<SDLShow *> *sentRequests = testConnectionManager.receivedRequests;
+ expect(sentRequests).to(haveCount(2));
+ expect(sentRequests.firstObject.mainField1).to(equal(testMainField1));
+ expect(sentRequests.firstObject.mainField2).to(beNil());
+ expect(sentRequests.firstObject.softButtons).to(haveCount(2));
+ expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(object3State1Text));
+ expect(sentRequests.firstObject.softButtons.firstObject.image).to(beNil());
+ expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText));
+ expect(sentRequests.firstObject.softButtons.lastObject.text).to(equal(object5State1Text));
+ expect(sentRequests.firstObject.softButtons.lastObject.image).to(beNil());
+ expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeText));
+
+ expect(sentRequests.lastObject.mainField1).to(equal(testMainField1));
+ expect(sentRequests.lastObject.mainField2).to(beNil());
+ expect(sentRequests.lastObject.softButtons).to(haveCount(2));
+ expect(sentRequests.lastObject.softButtons.firstObject.text).to(equal(object3State1Text));
+ expect(sentRequests.lastObject.softButtons.firstObject.image).to(equal(object3State1Art.imageRPC));
+ expect(sentRequests.lastObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeBoth));
+ expect(sentRequests.lastObject.softButtons.lastObject.text).to(equal(object5State1Text));
+ expect(sentRequests.lastObject.softButtons.lastObject.image).to(beNil());
+ expect(sentRequests.lastObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeText));
+ });
+
+ context(@"When a response is received to the upload", ^{
+ beforeEach(^{
+ OCMExpect([testFileManager uploadArtworks:[OCMArg isNotNil] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
+ testSoftButtonObjects = @[buttonWithTextAndImage];
+ testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1];
+ [testOp start];
+
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
+ });
+
it(@"should finish the operation on a successful response", ^{
+ OCMExpect([testFileManager uploadArtworks:[OCMArg isNotNil] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
+
[testConnectionManager respondToLastRequestWithResponse:successResponse];
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
expect(testOp.isFinished).to(beTrue());
expect(testOp.isExecuting).to(beFalse());
});
it(@"should finish the operation on a failed response", ^{
+ OCMExpect([testFileManager uploadArtworks:[OCMArg isNotNil] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]);
[testConnectionManager respondToLastRequestWithResponse:failedResponse];
+ OCMVerifyAllWithDelay(testFileManager, 0.5);
expect(testOp.isFinished).to(beTrue());
expect(testOp.isExecuting).to(beFalse());
});
diff --git a/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m b/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m
index 2eaddbffb..cfab13eec 100644
--- a/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLStreamingMediaManagerSpec.m
@@ -38,11 +38,13 @@ describe(@"the streaming media manager", ^{
__block SDLStreamingMediaManager *testStreamingMediaManager = nil;
__block TestConnectionManager *testConnectionManager = nil;
__block SDLConfiguration *testConfiguration = nil;
- __block SDLSecondaryTransportManager *mockSecondaryTransportManager = nil;
- __block SDLStreamingVideoLifecycleManager *mockVideoLifecycleManager = nil;
- __block SDLStreamingAudioLifecycleManager *mockAudioLifecycleManager = nil;
__block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
+ // Need to use `id` data type in order to use `OCMVerifyAllWithDelay`
+ __block id mockSecondaryTransportManager = nil;
+ __block id mockVideoLifecycleManager = nil;
+ __block id mockAudioLifecycleManager = nil;
+
beforeEach(^{
mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
testConnectionManager = [[TestConnectionManager alloc] init];
@@ -54,7 +56,7 @@ describe(@"the streaming media manager", ^{
mockAudioLifecycleManager = OCMClassMock([SDLStreamingAudioLifecycleManager class]);
testStreamingMediaManager.audioLifecycleManager = mockAudioLifecycleManager;
- mockSecondaryTransportManager = OCMClassMock([SDLSecondaryTransportManager class]);
+ mockSecondaryTransportManager = OCMStrictClassMock([SDLSecondaryTransportManager class]);
testStreamingMediaManager.secondaryTransportManager = mockSecondaryTransportManager;
});
@@ -176,7 +178,8 @@ describe(@"the streaming media manager", ^{
OCMVerify([mockVideoLifecycleManager isVideoStreamingPaused]);
[testStreamingMediaManager screenSize];
- OCMVerify([mockVideoLifecycleManager.videoScaleManager displayViewportResolution]);
+ SDLStreamingVideoLifecycleManager *streamingVideoLifecycleManager = (SDLStreamingVideoLifecycleManager *)mockVideoLifecycleManager;
+ OCMVerify([streamingVideoLifecycleManager.videoScaleManager displayViewportResolution]);
[testStreamingMediaManager videoFormat];
OCMVerify([mockVideoLifecycleManager videoFormat]);
@@ -218,188 +221,135 @@ describe(@"the streaming media manager", ^{
});
describe(@"when using the secondary transport", ^{
- __block SDLProtocol *mockProtocol = nil;
-
- beforeEach(^{
- mockProtocol = OCMClassMock([SDLProtocol class]);
- });
-
describe(@"starting a service on a transport when none is running", ^{
- beforeEach(^{
- [testStreamingMediaManager startSecondaryTransportWithProtocol:mockProtocol];
+ __block SDLProtocol *mockNewProtocol = nil;
- // Make sure the dispatch_group tasks finish before performing checks
- [NSThread sleepForTimeInterval:0.5];
+ beforeEach(^{
+ mockNewProtocol = OCMClassMock([SDLProtocol class]);
+ [testStreamingMediaManager startWithProtocol:mockNewProtocol];
});
it(@"should start both the audio and video stream managers with the protocol", ^{
- OCMVerify([mockAudioLifecycleManager startWithProtocol:mockProtocol]);
- OCMVerify([mockVideoLifecycleManager startWithProtocol:mockProtocol]);
-
- expect(testStreamingMediaManager.audioStarted).to(beTrue());
- expect(testStreamingMediaManager.videoStarted).to(beTrue());
-
- OCMReject([mockSecondaryTransportManager disconnectSecondaryTransport]);
-
+ OCMExpect([mockAudioLifecycleManager startWithProtocol:mockNewProtocol]);
+ OCMExpect([mockVideoLifecycleManager startWithProtocol:mockNewProtocol]);
+ OCMReject([mockSecondaryTransportManager disconnectSecondaryTransportWithCompletionHandler:[OCMArg any]]);
OCMReject([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]);
OCMReject([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]);
- });
- });
- describe(@"stopping a running service on a transport", ^{
- beforeEach(^{
- OCMStub([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
- void (^handler)(void);
- [invocation getArgument:&handler atIndex:2];
- handler();
- });
-
- OCMStub([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
- void (^handler)(void);
- [invocation getArgument:&handler atIndex:2];
- handler();
- });
+ [testStreamingMediaManager startWithProtocol:mockNewProtocol];
- [testStreamingMediaManager didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:nil fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:nil];
+ OCMVerifyAllWithDelay(mockAudioLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockVideoLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockSecondaryTransportManager, 0.5);
- // Make sure the dispatch_group tasks finish before performing checks
- [NSThread sleepForTimeInterval:0.5];
+ expect(testStreamingMediaManager.audioStarted).toEventually(beTrue());
+ expect(testStreamingMediaManager.videoStarted).toEventually(beTrue());
+ expect(testStreamingMediaManager.audioProtocol).toEventually(equal(mockNewProtocol));
+ expect(testStreamingMediaManager.videoProtocol).toEventually(equal(mockNewProtocol));
});
+ });
+ describe(@"stopping a running service on a transport", ^{
it(@"should stop both the audio and video stream managers", ^{
- OCMVerify([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]);
- OCMVerify([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]);
- expect(testStreamingMediaManager.audioStarted).to(beFalse());
- expect(testStreamingMediaManager.videoStarted).to(beFalse());
-
+ OCMExpect([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockSecondaryTransportManager disconnectSecondaryTransportWithCompletionHandler:[OCMArg invokeBlock]]);
OCMReject([mockAudioLifecycleManager startWithProtocol:[OCMArg any]]);
OCMReject([mockVideoLifecycleManager startWithProtocol:[OCMArg any]]);
- OCMVerify([mockSecondaryTransportManager disconnectSecondaryTransport]);
+ [testStreamingMediaManager didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:nil fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:nil];
+
+ OCMVerifyAllWithDelay(mockAudioLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockVideoLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockSecondaryTransportManager, 0.5);
- expect(testStreamingMediaManager.audioProtocol).to(beNil());
- expect(testStreamingMediaManager.videoProtocol).to(beNil());
+ expect(testStreamingMediaManager.audioStarted).toEventually(beFalse());
+ expect(testStreamingMediaManager.videoStarted).toEventually(beFalse());
+ expect(testStreamingMediaManager.audioProtocol).toEventually(beNil());
+ expect(testStreamingMediaManager.videoProtocol).toEventually(beNil());
});
});
describe(@"switching both the video and audio services to a different transport", ^{
- __block SDLProtocol *mockOldVideoProtocol = nil;
__block SDLProtocol *mockNewVideoProtocol = nil;
- __block SDLProtocol *mockOldAudioProtocol = nil;
__block SDLProtocol *mockNewAudioProtocol = nil;
beforeEach(^{
- mockOldVideoProtocol = OCMClassMock([SDLProtocol class]);
mockNewVideoProtocol = OCMClassMock([SDLProtocol class]);
- mockOldAudioProtocol = OCMClassMock([SDLProtocol class]);
mockNewAudioProtocol = OCMClassMock([SDLProtocol class]);
-
- OCMStub([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
- void (^handler)(void);
- [invocation getArgument:&handler atIndex:2];
- handler();
- });
-
- OCMStub([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
- void (^handler)(void);
- [invocation getArgument:&handler atIndex:2];
- handler();
- });
-
- [testStreamingMediaManager didUpdateFromOldVideoProtocol:mockOldVideoProtocol toNewVideoProtocol:mockNewVideoProtocol fromOldAudioProtocol:mockOldAudioProtocol toNewAudioProtocol:mockNewAudioProtocol];
-
- // Make sure the dispatch_group tasks finish before performing checks
- [NSThread sleepForTimeInterval:0.5];
});
it(@"should stop both the audio and video stream managers and call the delegate then start a new session", ^{
- OCMVerify([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]);
- OCMVerify([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]);
-
- OCMVerify([mockSecondaryTransportManager disconnectSecondaryTransport]);
-
- OCMVerify([mockAudioLifecycleManager startWithProtocol:mockNewAudioProtocol]);
- OCMVerify([mockVideoLifecycleManager startWithProtocol:mockNewVideoProtocol]);
-
- expect(testStreamingMediaManager.audioStarted).to(beTrue());
- expect(testStreamingMediaManager.videoStarted).to(beTrue());
-
- expect(testStreamingMediaManager.audioProtocol).to(equal(mockNewAudioProtocol));
- expect(testStreamingMediaManager.videoProtocol).to(equal(mockNewVideoProtocol));
+ OCMExpect([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockSecondaryTransportManager disconnectSecondaryTransportWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockAudioLifecycleManager startWithProtocol:mockNewAudioProtocol]);
+ OCMExpect([mockVideoLifecycleManager startWithProtocol:mockNewVideoProtocol]);
+
+ [testStreamingMediaManager didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:mockNewVideoProtocol fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:mockNewAudioProtocol];
+
+ OCMVerifyAllWithDelay(mockAudioLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockVideoLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockSecondaryTransportManager, 0.5);
+
+ expect(testStreamingMediaManager.audioStarted).toEventually(beTrue());
+ expect(testStreamingMediaManager.videoStarted).toEventually(beTrue());
+ expect(testStreamingMediaManager.audioProtocol).toEventually(equal(mockNewAudioProtocol));
+ expect(testStreamingMediaManager.videoProtocol).toEventually(equal(mockNewVideoProtocol));
});
});
describe(@"switching only the video service to a different transport", ^{
- __block SDLProtocol *mockOldProtocol = nil;
__block SDLProtocol *mockNewProtocol = nil;
beforeEach(^{
- mockOldProtocol = OCMClassMock([SDLProtocol class]);
mockNewProtocol = OCMClassMock([SDLProtocol class]);
-
- OCMStub([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
- void (^handler)(void);
- [invocation getArgument:&handler atIndex:2];
- handler();
- });
-
- [testStreamingMediaManager didUpdateFromOldVideoProtocol:mockOldProtocol toNewVideoProtocol:mockNewProtocol fromOldAudioProtocol:nil toNewAudioProtocol:nil];
-
- // Make sure the dispatch_group tasks finish before performing checks
- [NSThread sleepForTimeInterval:0.5];
});
it(@"should stop the video stream manager but not the audio stream manager", ^{
- OCMVerify([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]);
+ OCMExpect([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg invokeBlock]]);
OCMReject([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]);
+ OCMExpect([mockSecondaryTransportManager disconnectSecondaryTransportWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockVideoLifecycleManager startWithProtocol:mockNewProtocol]);
+ OCMReject([mockAudioLifecycleManager startWithProtocol:[OCMArg any]]);
- OCMVerify([mockSecondaryTransportManager disconnectSecondaryTransport]);
-
- OCMVerify([mockVideoLifecycleManager startWithProtocol:mockNewProtocol]);
- expect(testStreamingMediaManager.videoStarted).to(beTrue());
+ [testStreamingMediaManager didUpdateFromOldVideoProtocol:[OCMArg any] toNewVideoProtocol:mockNewProtocol fromOldAudioProtocol:nil toNewAudioProtocol:nil];
- OCMReject([mockAudioLifecycleManager startWithProtocol:mockNewProtocol]);
- expect(testStreamingMediaManager.audioStarted).to(beFalse());
+ OCMVerifyAllWithDelay(mockAudioLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockVideoLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockSecondaryTransportManager, 0.5);
- expect(testStreamingMediaManager.audioProtocol).to(beNil());
- expect(testStreamingMediaManager.videoProtocol).to(equal(mockNewProtocol));
+ expect(testStreamingMediaManager.videoStarted).toEventually(beTrue());
+ expect(testStreamingMediaManager.audioStarted).toEventually(beFalse());
+ expect(testStreamingMediaManager.audioProtocol).toEventually(beNil());
+ expect(testStreamingMediaManager.videoProtocol).toEventually(equal(mockNewProtocol));
});
});
describe(@"switching only the audio service to a different transport", ^{
- __block SDLProtocol *mockOldProtocol = nil;
__block SDLProtocol *mockNewProtocol = nil;
beforeEach(^{
- mockOldProtocol = OCMClassMock([SDLProtocol class]);
mockNewProtocol = OCMClassMock([SDLProtocol class]);
-
- OCMStub([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]).andDo(^(NSInvocation *invocation) {
- void (^handler)(void);
- [invocation getArgument:&handler atIndex:2];
- handler();
- });
-
- [testStreamingMediaManager didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:nil fromOldAudioProtocol:mockOldProtocol toNewAudioProtocol:mockNewProtocol];
-
- // Make sure the dispatch_group tasks finish before performing checks
- [NSThread sleepForTimeInterval:0.5];
});
it(@"should stop the audio stream manager but not the video stream manager", ^{
- OCMVerify([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg any]]);
+ OCMExpect([mockAudioLifecycleManager endAudioServiceWithCompletionHandler:[OCMArg invokeBlock]]);
OCMReject([mockVideoLifecycleManager endVideoServiceWithCompletionHandler:[OCMArg any]]);
+ OCMExpect([mockSecondaryTransportManager disconnectSecondaryTransportWithCompletionHandler:[OCMArg invokeBlock]]);
+ OCMExpect([mockAudioLifecycleManager startWithProtocol:mockNewProtocol]);
+ OCMReject([mockVideoLifecycleManager startWithProtocol:[OCMArg any]]);
- OCMVerify([mockSecondaryTransportManager disconnectSecondaryTransport]);
-
- OCMVerify([mockAudioLifecycleManager startWithProtocol:mockNewProtocol]);
- expect(testStreamingMediaManager.audioStarted).to(beTrue());
+ [testStreamingMediaManager didUpdateFromOldVideoProtocol:nil toNewVideoProtocol:nil fromOldAudioProtocol:[OCMArg any] toNewAudioProtocol:mockNewProtocol];
- OCMReject([mockVideoLifecycleManager startWithProtocol:mockNewProtocol]);
- expect(testStreamingMediaManager.videoStarted).to(beFalse());
+ OCMVerifyAllWithDelay(mockAudioLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockVideoLifecycleManager, 0.5);
+ OCMVerifyAllWithDelay(mockSecondaryTransportManager, 0.5);
- expect(testStreamingMediaManager.audioProtocol).to(equal(mockNewProtocol));
- expect(testStreamingMediaManager.videoProtocol).to(beNil());
+ expect(testStreamingMediaManager.videoStarted).toEventually(beFalse());
+ expect(testStreamingMediaManager.audioStarted).toEventually(beTrue());
+ expect(testStreamingMediaManager.audioProtocol).toEventually(equal(mockNewProtocol));
+ expect(testStreamingMediaManager.videoProtocol).toEventually(beNil());
});
});
});
diff --git a/SmartDeviceLinkTests/SDLSubscribeButtonManagerSpec.m b/SmartDeviceLinkTests/SDLSubscribeButtonManagerSpec.m
new file mode 100644
index 000000000..55151ad05
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLSubscribeButtonManagerSpec.m
@@ -0,0 +1,787 @@
+//
+// SDLSubscribeButtonManagerSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 5/22/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLError.h"
+#import "SDLOnButtonEvent.h"
+#import "SDLOnButtonPress.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLSubscribeButtonManager.h"
+#import "SDLSubscribeButtonObserver.h"
+#import "SDLSubscribeButtonResponse.h"
+#import "SDLSubscribebutton.h"
+#import "SDLUnsubscribeButton.h"
+#import "SDLUnsubscribeButtonResponse.h"
+#import "TestConnectionManager.h"
+#import "TestSubscribeButtonObserver.h"
+
+@interface SDLSubscribeButtonManager()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (strong, nonatomic) NSMutableDictionary<SDLButtonName, NSMutableArray<SDLSubscribeButtonObserver *> *> *subscribeButtonObservers;
+
+@end
+
+QuickSpecBegin(SDLSubscribeButtonManagerSpec)
+
+describe(@"subscribe button manager", ^{
+ __block SDLSubscribeButtonManager *testManager = nil;
+ __block TestConnectionManager *testConnectionManager = nil;
+
+ __block SDLSubscribeButtonResponse *testSubscribeSuccessResponse = nil;
+ __block SDLSubscribeButtonResponse *testSubscribeFailureResponse = nil;
+ __block SDLUnsubscribeButtonResponse *testUnSubscribeSuccessResponse = nil;
+ __block SDLUnsubscribeButtonResponse *testUnSubscribeFailureResponse = nil;
+
+ beforeEach(^{
+ testSubscribeSuccessResponse = [[SDLSubscribeButtonResponse alloc] init];
+ testSubscribeSuccessResponse.success = @YES;
+ testUnSubscribeSuccessResponse.resultCode = SDLResultSuccess;
+
+ testSubscribeFailureResponse = [[SDLSubscribeButtonResponse alloc] init];
+ testSubscribeFailureResponse.success = @NO;
+ testUnSubscribeSuccessResponse.resultCode = SDLResultDisallowed;
+
+ testUnSubscribeSuccessResponse = [[SDLUnsubscribeButtonResponse alloc] init];
+ testUnSubscribeSuccessResponse.success = @YES;
+ testUnSubscribeSuccessResponse.resultCode = SDLResultSuccess;
+
+ testUnSubscribeFailureResponse = [[SDLUnsubscribeButtonResponse alloc] init];
+ testUnSubscribeFailureResponse.success = @NO;
+ testUnSubscribeFailureResponse.resultCode = SDLResultDisallowed;
+
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testManager = [[SDLSubscribeButtonManager alloc] initWithConnectionManager:testConnectionManager];
+ });
+
+ it(@"should instantiate correctly with initWithConnectionManager:", ^{
+ expect(testManager.connectionManager).to(equal(testConnectionManager));
+ expect(testManager.subscribeButtonObservers).toNot(beNil());
+ expect(testManager.subscribeButtonObservers.count).to(equal(0));
+ });
+
+ it(@"should do nothing when Start is called", ^{
+ [testManager start];
+
+ expect(testManager.subscribeButtonObservers).toNot(beNil());
+ expect(testManager.subscribeButtonObservers.count).to(equal(0));
+ });
+
+ it(@"should clear, but not destroy, the list of observers when Stop is called", ^{
+ SDLSubscribeButtonUpdateHandler testUpdateBlock = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {};
+ testManager.subscribeButtonObservers[SDLButtonNameTuneUp] = [NSMutableArray arrayWithObject:[[SDLSubscribeButtonObserver alloc] initWithObserver:[[NSObject alloc] init] updateHandler:testUpdateBlock]];
+ expect(testManager.subscribeButtonObservers.count).to(equal(1));
+
+ [testManager stop];
+
+ expect(testManager.subscribeButtonObservers).toNot(beNil());
+ expect(testManager.subscribeButtonObservers.count).to(equal(0));
+ });
+
+ describe(@"should subscribe with a block handler", ^{
+ __block SDLButtonName testButtonName = nil;
+ __block SDLSubscribeButtonUpdateHandler testUpdateHandler1 = nil;
+ __block BOOL testHandler1Called = NO;
+ __block NSError *testHandle1Error = nil;
+ __block SDLOnButtonPress *testHandler1OnButtonPress = nil;
+ __block SDLOnButtonEvent *testHandler1OnButtonEvent = nil;
+
+ __block SDLSubscribeButtonUpdateHandler testUpdateHandler2 = nil;
+ __block BOOL testHandler2Called = NO;
+ __block NSError *testHandler2Error = nil;
+ __block SDLOnButtonPress *testHandler2OnButtonPress = nil;
+ __block SDLOnButtonEvent *testHandler2OnButtonEvent = nil;
+
+ beforeEach(^{
+ testButtonName = SDLButtonNameTuneUp;
+ testUpdateHandler1 = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {
+ testHandler1Called = YES;
+ testHandle1Error = error;
+ testHandler1OnButtonPress = buttonPress;
+ testHandler1OnButtonEvent = buttonEvent;
+ };
+ testUpdateHandler2 = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {
+ testHandler2Called = YES;
+ testHandler2Error = error;
+ testHandler2OnButtonPress = buttonPress;
+ testHandler2OnButtonEvent = buttonEvent;
+ };
+ });
+
+ it(@"should send a subscription request to the module if adding the first observer for that button name but it should not send a subscription request to the module if adding a subsequent observer for the same button name", ^{
+ id subscriptionID1 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ id subscriptionID2 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler2];
+ expect(subscriptionID1).toNot(beNil());
+ expect(subscriptionID2).toNot(beNil());
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).toEventually(equal(2));
+ expect((id)observers[0].updateBlock).toEventually(equal((id)testUpdateHandler1));
+ expect((id)observers[1].updateBlock).toEventually(equal((id)testUpdateHandler2));
+
+ expect(testConnectionManager.receivedRequests.count).toEventually(equal(1));
+ expect(testConnectionManager.receivedRequests[0]).toEventually(beAKindOf(SDLSubscribeButton.class));
+ });
+
+ it(@"should send two subscription request for the same button name to the module if the second request is sent before the module responds to the first request and it should add both observers if the second request fails with a result code of IGNORED", ^{
+ id subscriptionID1 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ id subscriptionID2 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler2];
+ expect(subscriptionID1).toNot(beNil());
+ expect(subscriptionID2).toNot(beNil());
+
+ // Respond to first request with a success response
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ // Respond to second request with a failure response and a result code of `IGNORED`
+ SDLSubscribeButtonResponse *testSubscribeIgnoredResponse = [[SDLSubscribeButtonResponse alloc] init];
+ testSubscribeIgnoredResponse.success = @NO;
+ testSubscribeIgnoredResponse.resultCode = SDLResultIgnored;
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeIgnoredResponse];
+
+ // Both observers should be added
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).toEventually(equal(2));
+
+ expect(testConnectionManager.receivedRequests.count).toEventually(equal(2));
+ expect(testConnectionManager.receivedRequests[0]).toEventually(beAKindOf(SDLSubscribeButton.class));
+ expect(testConnectionManager.receivedRequests[1]).toEventually(beAKindOf(SDLSubscribeButton.class));
+ });
+
+ it(@"should not notify the observer when a success response is received for the subscribe button request", ^{
+ [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ expect(testHandler1Called).to(beFalse());
+ });
+
+ it(@"should notify the observer with the error and remove the observer when a failure response is received for the subscribe button request", ^{
+ [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+
+ NSError *testError = [NSError errorWithDomain:@"errorDomain" code:9 userInfo:@{@"subscribe button error":@"error 2"}];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeFailureResponse error:testError];
+
+ expect(testHandler1Called).to(beTrue());
+ expect(testHandle1Error).to(equal(testError));
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(0));
+ });
+ });
+
+ describe(@"should subscribe with an observer and selector", ^{
+ __block SDLButtonName testButtonName = nil;
+ __block TestSubscribeButtonObserver *testSubscribeButtonObserver1 = nil;
+ __block SEL testSelector1 = @selector(buttonPressEvent);
+
+ __block TestSubscribeButtonObserver *testSubscribeButtonObserver2 = nil;
+ __block SEL testSelector2 = @selector(buttonPressEvent);
+
+ beforeEach(^{
+ testButtonName = SDLButtonNameSeekLeft;
+ testSubscribeButtonObserver1 = [[TestSubscribeButtonObserver alloc] init];
+ testSubscribeButtonObserver2 = [[TestSubscribeButtonObserver alloc] init];
+
+ testSelector1 = @selector(buttonPressEvent);
+ testSelector2 = @selector(buttonPressEventWithButtonName:error:);
+ });
+
+ it(@"should send a subscription request to the module if adding the first observer for that button name", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(1));
+ expect(NSStringFromSelector(observers[0].selector)).to(equal(NSStringFromSelector(testSelector1)));
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(1));
+ expect([testConnectionManager.receivedRequests[0] isKindOfClass:SDLSubscribeButton.class]);
+ });
+
+ it(@"should not send a subscription request to the module if adding a subsequent observer for that button name", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver2 selector:testSelector2];
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(2));
+ expect(NSStringFromSelector(observers[0].selector)).to(equal(NSStringFromSelector(testSelector1)));
+ expect(NSStringFromSelector(observers[1].selector)).to(equal(NSStringFromSelector(testSelector2)));
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(1));
+ expect([testConnectionManager.receivedRequests[0] isKindOfClass:SDLSubscribeButton.class]);
+ });
+
+ it(@"should not notify the observer when a success response is received for the subscribe button request", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ expect(testSubscribeButtonObserver1.selectorCalledCount).to(equal(0));
+ });
+
+ it(@"should notify the observer with the error and remove the observer when a failure response is received for the subscribe button request", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector2];
+ NSError *testError = [NSError errorWithDomain:@"errorDomain" code:9 userInfo:@{@"subscribe button error":@"error 2"}];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeFailureResponse error:testError];
+
+ expect(testSubscribeButtonObserver1.selectorCalledCount).to(equal(1));
+ expect(testSubscribeButtonObserver1.buttonErrorsReceived.count).to(equal(1));
+ expect(testSubscribeButtonObserver1.buttonErrorsReceived[0]).to(equal(testError));
+ expect(testSubscribeButtonObserver1.buttonNamesReceived[0]).to(equal(testButtonName));
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(0));
+ });
+
+ it(@"should ignore a subscription attempt with an invalid selector (selector has too many parameters)", ^{
+ SEL testInvalidSelector = @selector(buttonPressEventWithButtonName:error:buttonPress:buttonEvent:extraParameter:);
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testInvalidSelector];
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers).to(beNil());
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(0));
+ });
+
+ it(@"should ignore a subscription attempt with an nil observer", ^{
+ SEL testValidSelector = @selector(buttonPressEventWithButtonName:error:);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wnonnull"
+ [testManager subscribeButton:testButtonName withObserver:nil selector:testValidSelector];
+#pragma GCC diagnostic pop
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers).to(beNil());
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(0));
+ });
+ });
+
+ describe(@"notifying subscribers of subscribe button presses and events", ^{
+ __block SDLButtonName testButtonName = nil;
+ __block SDLOnButtonPress *testButtonPress = nil;
+ __block SDLOnButtonEvent *testButtonEvent = nil;
+ __block SDLRPCNotificationNotification *buttonEventNotification = nil;
+ __block SDLRPCNotificationNotification *buttonPressNotification = nil;
+
+ beforeEach(^{
+ testButtonName = SDLButtonNameTuneUp;
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonPressMode = SDLButtonPressModeLong;
+ testButtonPress.buttonName = testButtonName;
+
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonEventMode = SDLButtonEventModeButtonUp;
+ testButtonEvent.buttonName = testButtonName;
+
+ buttonEventNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveButtonEventNotification object:nil rpcNotification:testButtonEvent];
+ buttonPressNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveButtonPressNotification object:nil rpcNotification:testButtonPress];
+ });
+
+ describe(@"all subscribers should be notified", ^{
+ __block SDLSubscribeButtonUpdateHandler testUpdateHandler1 = nil;
+ __block BOOL testHandler1Called = NO;
+ __block NSError *testHandle1Error = nil;
+ __block SDLOnButtonPress *testHandler1OnButtonPress = nil;
+ __block SDLOnButtonEvent *testHandler1OnButtonEvent = nil;
+
+ __block SDLSubscribeButtonUpdateHandler testUpdateHandler2 = nil;
+ __block BOOL testHandler2Called = NO;
+ __block NSError *testHandler2Error = nil;
+ __block SDLOnButtonPress *testHandler2OnButtonPress = nil;
+ __block SDLOnButtonEvent *testHandler2OnButtonEvent = nil;
+
+ __block TestSubscribeButtonObserver *testObserver1 = nil;
+ __block SEL testSelector1 = nil;
+
+ __block TestSubscribeButtonObserver *testObserver2 = nil;
+ __block SEL testSelector2 = nil;
+
+ beforeEach(^{
+ testUpdateHandler1 = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {
+ testHandler1Called = YES;
+ testHandle1Error = error;
+ testHandler1OnButtonPress = buttonPress;
+ testHandler1OnButtonEvent = buttonEvent;
+ };
+
+ testUpdateHandler2 = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {
+ testHandler2Called = YES;
+ testHandler2Error = error;
+ testHandler2OnButtonPress = buttonPress;
+ testHandler2OnButtonEvent = buttonEvent;
+ };
+
+ testObserver1 = [[TestSubscribeButtonObserver alloc] init];
+ testSelector1 = @selector(buttonPressEventWithButtonName:error:buttonPress:buttonEvent:);
+
+ testObserver2 = [[TestSubscribeButtonObserver alloc] init];
+ testSelector2 = @selector(buttonPressEventWithButtonName:error:buttonPress:buttonEvent:);
+
+ [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+ [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler2];
+ [testManager subscribeButton:testButtonName withObserver:testObserver1 selector:testSelector1];
+ [testManager subscribeButton:testButtonName withObserver:testObserver2 selector:testSelector2];
+ });
+
+ it(@"should notify block handler and observer/selector subscribers when a button event notification is received", ^{
+ [[NSNotificationCenter defaultCenter] postNotification:buttonEventNotification];
+
+ expect(testHandler1Called).toEventually(beTrue());
+ expect(testHandle1Error).toEventually(beNil());
+ expect(testHandler1OnButtonEvent).toEventually(equal(testButtonEvent));
+ expect(testHandler1OnButtonPress).toEventually(beNil());
+
+ expect(testHandler2Called).toEventually(beTrue());
+ expect(testHandler2Error).toEventually(beNil());
+ expect(testHandler2OnButtonEvent).toEventually(equal(testButtonEvent));
+ expect(testHandler2OnButtonPress).toEventually(beNil());
+
+ expect(testObserver1.buttonNamesReceived.count).to(equal(1));
+ expect(testObserver1.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver1.buttonPressesReceived).to(beEmpty());
+ expect(testObserver1.buttonEventsReceived[0]).to(equal(testButtonEvent));
+
+ expect(testObserver2.buttonNamesReceived.count).to(equal(1));
+ expect(testObserver2.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver2.buttonPressesReceived).to(beEmpty());
+ expect(testObserver2.buttonEventsReceived[0]).to(equal(testButtonEvent));
+ });
+
+ it(@"should notify block handler and observer/selector subscribers when a button press notification is received", ^{
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+
+ expect(testHandler1Called).toEventually(beTrue());
+ expect(testHandle1Error).toEventually(beNil());
+ expect(testHandler1OnButtonEvent).toEventually(beNil());
+ expect(testHandler1OnButtonPress).toEventually(equal(testButtonPress));
+
+ expect(testHandler2Called).toEventually(beTrue());
+ expect(testHandler2Error).toEventually(beNil());
+ expect(testHandler2OnButtonEvent).toEventually(beNil());
+ expect(testHandler2OnButtonPress).toEventually(equal(testButtonPress));
+
+ expect(testObserver1.buttonNamesReceived.count).to(equal(1));
+ expect(testObserver1.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver1.buttonPressesReceived[0]).to(equal(testButtonPress));
+ expect(testObserver1.buttonEventsReceived).to(beEmpty());
+
+ expect(testObserver2.buttonNamesReceived.count).to(equal(1));
+ expect(testObserver2.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver2.buttonPressesReceived[0]).to(equal(testButtonPress));
+ expect(testObserver2.buttonEventsReceived).to(beEmpty());
+ });
+ });
+
+ describe(@"All selector/observers subscribers with 0-4 parameters in the selector should be notified of button presses", ^{
+ it(@"should notify the observer of a button press when the selector has no parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEvent);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(1));
+ expect(testObserver.buttonNamesReceived).to(beEmpty());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should notify the observer of a button press when the selector has one parameter", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(1));
+ expect([testObserver.buttonNamesReceived containsObject:testButtonName]).to(beTrue());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should notify the observer of a button press when the selector has two parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:error:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(1));
+ expect([testObserver.buttonNamesReceived containsObject:testButtonName]).to(beTrue());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should notify the observer of a button press when the selector has three parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:error:buttonPress:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(1));
+ expect([testObserver.buttonNamesReceived containsObject:testButtonName]).to(beTrue());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived[0]).to(equal(testButtonPress));
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should notify the observer of a button press when the selector has four parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:error:buttonPress:buttonEvent:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(1));
+ expect([testObserver.buttonNamesReceived containsObject:testButtonName]).to(beTrue());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived[0]).to(equal(testButtonPress));
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+ });
+
+ describe(@"Only selector/observer subscribers with four parameters in the selector should be notified of button events", ^{
+ it(@"should not notify the observer of a button event when the selector has no parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEvent);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonEventNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(0));
+ expect(testObserver.buttonNamesReceived).to(beEmpty());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should not notify the observer of a button event when the selector has one parameter", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonEventNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(0));
+ expect(testObserver.buttonNamesReceived).to(beEmpty());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should not notify the observer of a button event when the selector has two parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:error:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonEventNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(0));
+ expect(testObserver.buttonNamesReceived).to(beEmpty());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should not notify the observer of a button event when the selector has three parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:error:buttonPress:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonEventNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(0));
+ expect(testObserver.buttonNamesReceived).to(beEmpty());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived).to(beEmpty());
+ });
+
+ it(@"should notify the observer of a button event when the selector has four parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testSelector = @selector(buttonPressEventWithButtonName:error:buttonPress:buttonEvent:);
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [[NSNotificationCenter defaultCenter] postNotification:buttonEventNotification];
+
+ expect(testObserver.selectorCalledCount).to(equal(1));
+ expect([testObserver.buttonNamesReceived containsObject:testButtonName]).to(beTrue());
+ expect(testObserver.buttonErrorsReceived).to(beEmpty());
+ expect(testObserver.buttonPressesReceived).to(beEmpty());
+ expect(testObserver.buttonEventsReceived[0]).to(equal(testButtonEvent));
+ });
+ });
+
+ describe(@"Handling invalid selectors", ^{
+ __block SDLRPCNotificationNotification *buttonPressNotification = nil;
+
+ beforeEach(^{
+ testButtonName = SDLButtonNameOk;
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonPressMode = SDLButtonPressModeLong;
+ testButtonPress.buttonName = testButtonName;
+ buttonPressNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveButtonPressNotification object:nil rpcNotification:testButtonPress];
+ });
+
+ it(@"should throw an exception if the selector does not exist for the observer", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wundeclared-selector"
+ SEL testInvalidSelector = @selector(invalidSelector:);
+#pragma GCC diagnostic pop
+ [testManager subscribeButton:testButtonName withObserver:testObserver selector:testInvalidSelector];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ expectAction(^{
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+ }).to(raiseException().named([NSException sdl_invalidSubscribeButtonSelectorExceptionWithSelector:testInvalidSelector].name));
+ });
+
+ it(@"should throw an assert if the selector has too many parameters", ^{
+ TestSubscribeButtonObserver *testObserver = [[TestSubscribeButtonObserver alloc] init];
+ SEL testInvalidSelector = @selector(buttonPressEventWithButtonName:error:buttonPress:buttonEvent:extraParameter:);
+
+ // Set the invalid selector manually as using `subscribeButton:withObserver:selector:` will not add an invalid selector to the list of `subscribeButtonObservers`
+ testManager.subscribeButtonObservers[testButtonName] = [NSMutableArray arrayWithObject:[[SDLSubscribeButtonObserver alloc] initWithObserver:testObserver selector:testInvalidSelector]];
+
+ expectAction(^{
+ [[NSNotificationCenter defaultCenter] postNotification:buttonPressNotification];
+ }).to(raiseException().named([NSException sdl_invalidSubscribeButtonSelectorExceptionWithSelector:testInvalidSelector].name));
+ });
+
+ afterEach(^{
+ [testManager.subscribeButtonObservers removeAllObjects];
+ });
+ });
+ });
+
+ describe(@"should unsubscribe with an update handler", ^{
+ __block SDLButtonName testButtonName = nil;
+
+ __block SDLSubscribeButtonUpdateHandler testUpdateHandler1 = nil;
+ __block SDLSubscribeButtonUpdateCompletionHandler testCompletionHandler1 = nil;
+ __block BOOL testCompletionHandler1Called = NO;
+ __block NSError *testCompletionHandler1Error = nil;
+
+ __block SDLSubscribeButtonUpdateHandler testUpdateHandler2 = nil;
+ __block SDLSubscribeButtonUpdateCompletionHandler testCompletionHandler2 = nil;
+ __block BOOL testCompletionHandler2Called = NO;
+ __block NSError *testCompletionHandler2Error = nil;
+
+ beforeEach(^{
+ testButtonName = SDLButtonNameTuneUp;
+
+ testUpdateHandler1 = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {};
+ testCompletionHandler1 = ^(NSError *__nullable error) {
+ testCompletionHandler1Called = YES;
+ testCompletionHandler1Error = error;
+ };
+ testCompletionHandler1Called = NO;
+ testCompletionHandler2Error = nil;
+
+ testUpdateHandler2 = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {};
+ testCompletionHandler2 = ^(NSError *__nullable error) {
+ testCompletionHandler2Called = YES;
+ testCompletionHandler2Error = error;
+ };
+ testCompletionHandler2Called = NO;
+ testCompletionHandler2Error = nil;
+ });
+
+ it(@"should unsubscribe the observer if there are multiple observers subscribed to the button", ^{
+ id subscriptionID1 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+ id subscriptionID2 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler2];
+
+ [testManager unsubscribeButton:testButtonName withObserver:subscriptionID1 withCompletionHandler:testCompletionHandler1];
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(1));
+ expect((id)observers[0].updateBlock).to(equal((id)testUpdateHandler2));
+ expect(observers[0].observer).to(equal(subscriptionID2));
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler2Called).to(beFalse());
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(1));
+ expect(testConnectionManager.receivedRequests.firstObject).to(beAKindOf(SDLSubscribeButton.class));
+ });
+
+ it(@"should send an unsubscribe button request when the last observer is removed and it should notify the observer that the unsubscribe request succeeded", ^{
+ id subscriptionID1 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+ id subscriptionID2 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler2];
+
+ [testManager unsubscribeButton:testButtonName withObserver:subscriptionID1 withCompletionHandler:testCompletionHandler1];
+ [testManager unsubscribeButton:testButtonName withObserver:subscriptionID2 withCompletionHandler:testCompletionHandler2];
+ [testConnectionManager respondToLastRequestWithResponse:testUnSubscribeSuccessResponse];
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler1Error).to(beNil());
+ expect(testCompletionHandler2Called).to(beTrue());
+ expect(testCompletionHandler2Error).to(beNil());
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers).to(beEmpty());
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(2));
+ expect(testConnectionManager.receivedRequests[1]).to(beAKindOf(SDLUnsubscribeButton.class));
+ });
+
+ it(@"should notify the observer with the error when a failure response is received for the unsubscribe button request and it should not remove the observer", ^{
+ id subscriptionID1 = [testManager subscribeButton:testButtonName withUpdateHandler:testUpdateHandler1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [testManager unsubscribeButton:testButtonName withObserver:subscriptionID1 withCompletionHandler:testCompletionHandler1];
+ NSError *testError = [NSError errorWithDomain:@"errorDomain" code:9 userInfo:@{@"subscribe button error":@"error 2"}];
+ [testConnectionManager respondToLastRequestWithResponse:testUnSubscribeFailureResponse error:testError];
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler1Error).to(equal(testError));
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(1));
+ expect((id)observers[0].updateBlock).to(equal((id)testUpdateHandler1));
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(2));
+ expect(testConnectionManager.receivedRequests[1]).to(beAKindOf(SDLUnsubscribeButton.class));
+ });
+
+ it(@"should return an error if the observer is not subscribed to the button", ^{
+ [testManager unsubscribeButton:testButtonName withObserver:[[NSObject alloc] init] withCompletionHandler:testCompletionHandler1];
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler1Error).to(equal([NSError sdl_subscribeButtonManager_notSubscribed]));
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers).to(beNil());
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ });
+ });
+
+ describe(@"should unsubscribe with an observer and selector", ^{
+ __block SDLButtonName testButtonName = nil;
+
+ __block TestSubscribeButtonObserver *testSubscribeButtonObserver1 = nil;
+ __block SEL testSelector1 = @selector(buttonPressEvent);
+ __block SDLSubscribeButtonUpdateCompletionHandler testCompletionHandler1 = nil;
+ __block BOOL testCompletionHandler1Called = NO;
+ __block NSError *testCompletionHandler1Error = nil;
+
+ __block TestSubscribeButtonObserver *testSubscribeButtonObserver2 = nil;
+ __block SEL testSelector2 = @selector(buttonPressEvent);
+ __block SDLSubscribeButtonUpdateCompletionHandler testCompletionHandler2 = nil;
+ __block BOOL testCompletionHandler2Called = NO;
+ __block NSError *testCompletionHandler2Error = nil;
+
+ beforeEach(^{
+ testButtonName = SDLButtonNamePlayPause;
+
+ testSubscribeButtonObserver1 = [[TestSubscribeButtonObserver alloc] init];
+ testCompletionHandler1 = ^(NSError *__nullable error) {
+ testCompletionHandler1Called = YES;
+ testCompletionHandler1Error = error;
+ };
+ testSelector1 = @selector(buttonPressEvent);
+ testCompletionHandler1Called = NO;
+ testCompletionHandler2Error = nil;
+
+ testSubscribeButtonObserver2 = [[TestSubscribeButtonObserver alloc] init];
+ testSelector2 = @selector(buttonPressEventWithButtonName:error:);
+ testCompletionHandler2 = ^(NSError *__nullable error) {
+ testCompletionHandler2Called = YES;
+ testCompletionHandler2Error = error;
+ };
+ testCompletionHandler2Called = NO;
+ testCompletionHandler2Error = nil;
+ });
+
+ it(@"should unsubscribe the observer if there are multiple observers subscribed to the button", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver2 selector:testSelector2];
+
+ [testManager unsubscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 withCompletionHandler:testCompletionHandler1];
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(1));
+ expect(NSStringFromSelector(observers[0].selector)).to(equal(NSStringFromSelector(testSelector2)));
+ expect((id)observers[0].observer).to(equal((id)testSubscribeButtonObserver2));
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler2Called).to(beFalse());
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(1));
+ expect(testConnectionManager.receivedRequests.firstObject).to(beAKindOf(SDLSubscribeButton.class));
+ });
+
+ it(@"should send an unsubscribe button request when the last observer is removed and it should notify the observer that the unsubscribe request succeeded", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver2 selector:testSelector2];
+
+ [testManager unsubscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 withCompletionHandler:testCompletionHandler1];
+ [testManager unsubscribeButton:testButtonName withObserver:testSubscribeButtonObserver2 withCompletionHandler:testCompletionHandler2];
+ [testConnectionManager respondToLastRequestWithResponse:testUnSubscribeSuccessResponse];
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler1Error).to(beNil());
+ expect(testCompletionHandler2Called).to(beTrue());
+ expect(testCompletionHandler2Error).to(beNil());
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers).to(beEmpty());
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(2));
+ expect(testConnectionManager.receivedRequests[1]).to(beAKindOf(SDLUnsubscribeButton.class));
+ });
+
+ it(@"should notify the observer with the error when a failure response is received for the unsubscribe button request and it should not remove the observer", ^{
+ [testManager subscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 selector:testSelector1];
+ [testConnectionManager respondToLastRequestWithResponse:testSubscribeSuccessResponse];
+
+ [testManager unsubscribeButton:testButtonName withObserver:testSubscribeButtonObserver1 withCompletionHandler:testCompletionHandler1];
+ NSError *testError = [NSError errorWithDomain:@"errorDomain" code:9 userInfo:@{@"subscribe button error":@"error 2"}];
+ [testConnectionManager respondToLastRequestWithResponse:testUnSubscribeFailureResponse error:testError];
+
+ expect(testCompletionHandler1Called).to(beTrue());
+ expect(testCompletionHandler1Error).to(equal(testError));
+
+ NSArray<SDLSubscribeButtonObserver *> *observers = testManager.subscribeButtonObservers[testButtonName];
+ expect(observers.count).to(equal(1));
+ expect(NSStringFromSelector(observers[0].selector)).to(equal(NSStringFromSelector(testSelector1)));
+
+ expect(testConnectionManager.receivedRequests.count).to(equal(2));
+ expect([testConnectionManager.receivedRequests[1] isKindOfClass:SDLUnsubscribeButton.class]);
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLSubscribeButtonObserverSpec.m b/SmartDeviceLinkTests/SDLSubscribeButtonObserverSpec.m
new file mode 100644
index 000000000..b99e36139
--- /dev/null
+++ b/SmartDeviceLinkTests/SDLSubscribeButtonObserverSpec.m
@@ -0,0 +1,64 @@
+//
+// SDLSubscribeButtonObserverSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Nicole on 5/22/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLSubscribeButtonObserver.h"
+#import "TestSubscribeButtonObserver.h"
+
+QuickSpecBegin(SDLSubscribeButtonObserverSpec)
+
+describe(@"subscribe button observer", ^{
+ __block TestSubscribeButtonObserver *testObserver = nil;
+ __block SEL testSelector = nil;
+ __block SDLSubscribeButtonUpdateHandler testUpdateBlock = nil;
+
+ beforeEach(^{
+ testObserver = [[TestSubscribeButtonObserver alloc] init];
+ testSelector = @selector(buttonPressEvent);
+ testUpdateBlock = ^(SDLOnButtonPress *_Nullable buttonPress, SDLOnButtonEvent *_Nullable buttonEvent, NSError *_Nullable error) {};
+ });
+
+ it(@"Should set and get correctly", ^{
+ SDLSubscribeButtonObserver *testSubscribeButtonObserver = [[SDLSubscribeButtonObserver alloc] init];
+ testSubscribeButtonObserver.observer = testObserver;
+ testSubscribeButtonObserver.selector = testSelector;
+ testSubscribeButtonObserver.updateBlock = testUpdateBlock;
+
+ expect(testSubscribeButtonObserver.observer).to(equal(testObserver));
+ expect(NSStringFromSelector(testSubscribeButtonObserver.selector)).to(equal(NSStringFromSelector(testSelector)));
+ expect((id)testSubscribeButtonObserver.updateBlock).to(equal((id)testUpdateBlock));
+ });
+
+ it(@"Should initialize correctly with initWithObserver:selector:", ^{
+ SDLSubscribeButtonObserver *testSubscribeButtonObserver = [[SDLSubscribeButtonObserver alloc] initWithObserver:testObserver selector:testSelector];
+
+ expect(testSubscribeButtonObserver.observer).to(equal(testObserver));
+ expect(NSStringFromSelector(testSubscribeButtonObserver.selector)).to(equal(NSStringFromSelector(testSelector)));
+ expect((id)testSubscribeButtonObserver.updateBlock).to(beNil());
+ });
+
+ it(@"Should initialize correctly with initWithObserver:updateHandler:", ^{
+ SDLSubscribeButtonObserver *testSubscribeButtonObserver = [[SDLSubscribeButtonObserver alloc] initWithObserver:testObserver updateHandler:testUpdateBlock];
+
+ expect(testSubscribeButtonObserver.observer).to(equal(testObserver));
+ expect(NSStringFromSelector(testSubscribeButtonObserver.selector)).to(beNil());
+ expect((id)testSubscribeButtonObserver.updateBlock).to(equal((id)testUpdateBlock));
+ });
+
+ it(@"Should return nil if not set", ^{
+ SDLSubscribeButtonObserver *testSubscribeButtonObserver = [[SDLSubscribeButtonObserver alloc] init];
+
+ expect(testSubscribeButtonObserver.observer).to(beNil());
+ expect(NSStringFromSelector(testSubscribeButtonObserver.selector)).to(beNil());
+ expect((id)testSubscribeButtonObserver.updateBlock).to(beNil());
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
index ad77dea1d..798a1499a 100644
--- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
@@ -64,6 +64,7 @@ typedef NSString * SDLServiceID;
@property (nullable, strong, nonatomic, readwrite) SDLVideoStreamingCapability *videoStreamingCapability;
@property (nullable, strong, nonatomic, readwrite) SDLRemoteControlCapabilities *remoteControlCapability;
@property (nullable, strong, nonatomic, readwrite) SDLSeatLocationCapability *seatLocationCapability;
+@property (nullable, strong, nonatomic, readwrite) SDLDriverDistractionCapability *driverDistractionCapability;
@property (nullable, strong, nonatomic) NSMutableDictionary<SDLServiceID, SDLAppServiceCapability *> *appServicesCapabilitiesDictionary;
@@ -104,7 +105,7 @@ describe(@"System capability manager", ^{
#pragma clang diagnostic pop
SDLTextField *textField = [[SDLTextField alloc] init];
textField.name = SDLTextFieldNameMainField1;
- textField.characterSet = SDLCharacterSetCID1;
+ textField.characterSet = SDLCharacterSetUtf8;
textField.width = @(123);
textField.rows = @(1);
testDisplayCapabilities.textFields = @[textField];
@@ -172,6 +173,7 @@ describe(@"System capability manager", ^{
expect(testSystemCapabilityManager.remoteControlCapability).to(beNil());
expect(testSystemCapabilityManager.appServicesCapabilities).to(beNil());
expect(testSystemCapabilityManager.seatLocationCapability).to(beNil());
+ expect(testSystemCapabilityManager.driverDistractionCapability).to(beNil());
expect(testSystemCapabilityManager.currentHMILevel).to(equal(SDLHMILevelNone));
});
@@ -911,6 +913,7 @@ describe(@"System capability manager", ^{
expect(testSystemCapabilityManager.videoStreamingCapability).to(beNil());
expect(testSystemCapabilityManager.remoteControlCapability).to(beNil());
expect(testSystemCapabilityManager.appServicesCapabilities).to(beNil());
+ expect(testSystemCapabilityManager.driverDistractionCapability).to(beNil());
expect(testSystemCapabilityManager.seatLocationCapability).to(beNil());
});
});
diff --git a/SmartDeviceLinkTests/TestMultipleFilesConnectionManager.m b/SmartDeviceLinkTests/TestMultipleFilesConnectionManager.m
index ef4756bda..e134d3eb5 100644
--- a/SmartDeviceLinkTests/TestMultipleFilesConnectionManager.m
+++ b/SmartDeviceLinkTests/TestMultipleFilesConnectionManager.m
@@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN
if ([[request name] isEqualToString:SDLRPCFunctionNamePutFile]) {
SDLPutFile *putfileRequest = (SDLPutFile *)request;
- TestResponse *response = self.responses[putfileRequest.syncFileName];
+ TestResponse *response = self.responses[putfileRequest.sdlFileName];
if (response == nil || handler == nil) { return; }
handler(request, response.testResponse, response.testError);
diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
index 4f823a4e6..ded122d0a 100644
--- a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
+++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
@@ -42,6 +42,10 @@ NS_ASSUME_NONNULL_BEGIN
[self sendConnectionRequest:request withResponseHandler:handler];
}
+- (void)sendConnectionManagerRPC:(__kindof SDLRPCMessage *)rpc {
+ [self sendConnectionRPC:rpc];
+}
+
- (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];
diff --git a/SmartDeviceLinkTests/TransportSpecs/TCP/SDLTCPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/TCP/SDLTCPTransportSpec.m
index e9a25f834..a23fec3e5 100644
--- a/SmartDeviceLinkTests/TransportSpecs/TCP/SDLTCPTransportSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/TCP/SDLTCPTransportSpec.m
@@ -48,7 +48,6 @@ describe(@"SDLTCPTransport", ^ {
transport.delegate = nil;
server.delegate = nil;
- [transport disconnect];
transport = nil;
transportDelegateMock = nil;
@@ -73,11 +72,15 @@ describe(@"SDLTCPTransport", ^ {
expect(transport.inputStream != nil);
expect(transport.outputStream != nil);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
- expect(transport.ioThread == nil);
- expect(transport.inputStream == nil);
- expect(transport.outputStream == nil);
+ done();
+ }];
+ });
});
it(@"Should invoke onError delegate when connection is refused", ^ {
@@ -101,11 +104,15 @@ describe(@"SDLTCPTransport", ^ {
OCMVerifyAllWithDelay(transportDelegateMock, 0.5);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
- expect(transport.ioThread == nil);
- expect(transport.inputStream == nil);
- expect(transport.outputStream == nil);
+ done();
+ }];
+ });
});
it(@"Should invoke onError delegate when connection is timed out", ^ {
@@ -121,13 +128,17 @@ describe(@"SDLTCPTransport", ^ {
[transport connect];
// timeout value should be longer than 'ConnectionTimeoutSecs' in SDLTCPTransport
- OCMVerifyAllWithDelay(transportDelegateMock, 60.0);
+ OCMVerifyAllWithDelay(transportDelegateMock, 30.5);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
- expect(transport.ioThread == nil);
- expect(transport.inputStream == nil);
- expect(transport.outputStream == nil);
+ done();
+ }];
+ });
});
it(@"Should invoke onError delegate when input parameter is invalid", ^ {
@@ -144,11 +155,15 @@ describe(@"SDLTCPTransport", ^ {
OCMVerifyAllWithDelay(transportDelegateMock, 0.5);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
- expect(transport.ioThread == nil);
- expect(transport.inputStream == nil);
- expect(transport.outputStream == nil);
+ done();
+ }];
+ });
});
it(@"Should send out data when send is called", ^ {
@@ -175,11 +190,17 @@ describe(@"SDLTCPTransport", ^ {
OCMVerifyAllWithDelay(serverDelegateMock, 0.5);
OCMVerifyAllWithDelay(transportDelegateMock, 0.5);
-
- [NSThread sleepForTimeInterval:0.5];
expect([receivedData isEqualToData:testData]);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
+
+ done();
+ }];
+ });
});
it(@"Should send out data even if send is called some time after", ^ {
@@ -209,20 +230,25 @@ describe(@"SDLTCPTransport", ^ {
[transport connect];
// check that transport still sends out data long after NSStreamEventHasSpaceAvailable event
- [NSThread sleepForTimeInterval:1.0];
[transport sendData:testData1];
[transport sendData:testData2];
OCMVerifyAllWithDelay(serverDelegateMock, 0.5);
OCMVerifyAllWithDelay(transportDelegateMock, 0.5);
-
- [NSThread sleepForTimeInterval:0.5];
expect([receivedData isEqualToData:expectedData]);
// don't receive further delegate events
server.delegate = nil;
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
+
+ done();
+ }];
+ });
});
it(@"Should invoke onDataReceived delegate when received some data", ^ {
@@ -257,11 +283,17 @@ describe(@"SDLTCPTransport", ^ {
[server send:testData2];
OCMVerifyAllWithDelay(transportDelegateMock, 0.5);
-
- [NSThread sleepForTimeInterval:0.5];
expect([receivedData isEqualToData:expectedData]);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
+
+ done();
+ }];
+ });
});
it(@"Should generate disconnected event after peer closed connection", ^ {
@@ -284,7 +316,15 @@ describe(@"SDLTCPTransport", ^ {
OCMVerifyAllWithDelay(transportDelegateMock, 0.5);
- [transport disconnect];
+ waitUntilTimeout(1, ^(void (^done)(void)){
+ [transport disconnectWithCompletionHandler:^{
+ expect(transport.ioThread.isCancelled).to(beTrue());
+ expect(transport.inputStream).to(beNil());
+ expect(transport.outputStream).to(beNil());
+
+ done();
+ }];
+ });
});
});
diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m
index 1d980b139..5c6112373 100644
--- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m
@@ -23,7 +23,6 @@
@property (weak, nonatomic) id<SDLIAPDataSessionDelegate> delegate;
@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue;
-@property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore;
@end
@@ -47,7 +46,6 @@ describe(@"SDLIAPDataSession", ^{
it(@"Should init correctly", ^{
expect(dataSession.delegate).to(equal(mockDelegate));
expect(dataSession.sendDataQueue).toNot(beNil());
- expect(dataSession.canceledSemaphore).toNot(beNil());
});
it(@"Should get correctly", ^{
diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m
index 24d4943c1..808ba33bf 100644
--- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m
+++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m
@@ -42,7 +42,7 @@ describe(@"SDLIAPTransport", ^{
__block EAAccessory *mockAccessory = nil;
beforeEach(^{
- transport = [SDLIAPTransport new];
+ transport = [[SDLIAPTransport alloc] init];
mockTransportDelegate = OCMProtocolMock(@protocol(SDLTransportDelegate));
transport.delegate = mockTransportDelegate;
mockAccessory = [EAAccessory.class sdlCoreMock];
@@ -142,26 +142,22 @@ describe(@"SDLIAPTransport", ^{
__block SDLIAPDataSession *mockDataSession = nil;
beforeEach(^{
- mockDataSession = OCMClassMock([SDLIAPDataSession class]);
+ mockDataSession = OCMStrictClassMock([SDLIAPDataSession class]);
OCMStub([mockDataSession isSessionInProgress]).andReturn(YES);
OCMStub([mockDataSession connectionID]).andReturn(mockAccessory.connectionID);
transport.dataSession = mockDataSession;
transport.controlSession = nil;
-
- [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification];
});
- it(@"It should cleanup on disconnect", ^{
- expect(transport.retryCounter).to(equal(0));
- expect(transport.sessionSetupInProgress).to(beFalse());
- expect(transport.transportDestroyed).to(beTrue());
- });
+ 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]]);
- it(@"It should close and destroy data session", ^{
- OCMVerify([mockDataSession destroySession]);
- });
+ [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification];
+
+ expect(transport.retryCounter).toEventually(equal(0));
+ expect(transport.sessionSetupInProgress).toEventually(beFalse());
+ expect(transport.transportDestroyed).toEventually(beTrue());
- it(@"It should notify the lifecycle manager that the transport disconnected ", ^{
OCMVerify([mockTransportDelegate onTransportDisconnected]);
});
});
@@ -170,26 +166,22 @@ describe(@"SDLIAPTransport", ^{
__block SDLIAPControlSession *mockControlSession = nil;
beforeEach(^{
- mockControlSession = OCMClassMock([SDLIAPControlSession class]);
+ mockControlSession = OCMStrictClassMock([SDLIAPControlSession class]);
OCMStub([mockControlSession isSessionInProgress]).andReturn(YES);
OCMStub([mockControlSession connectionID]).andReturn(mockAccessory.connectionID);
transport.controlSession = mockControlSession;
transport.dataSession = nil;
-
- [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification];
});
- it(@"It should cleanup on disconnect", ^{
- expect(transport.retryCounter).to(equal(0));
- expect(transport.sessionSetupInProgress).to(beFalse());
- expect(transport.transportDestroyed).to(beFalse());
- });
+ 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]]);
- it(@"It should close and destroy data session", ^{
- OCMVerify([mockControlSession destroySession]);
- });
+ [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification];
+
+ expect(transport.retryCounter).toEventually(equal(0));
+ expect(transport.sessionSetupInProgress).toEventually(beFalse());
+ expect(transport.transportDestroyed).toEventually(beFalse());
- it(@"Should not tell the delegate that the transport closed", ^{
OCMReject([mockTransportDelegate onTransportDisconnected]);
});
});
diff --git a/SmartDeviceLink_Example/SubscribeButtonManager.h b/SmartDeviceLink_Example/SubscribeButtonManager.h
new file mode 100644
index 000000000..07ecc4c87
--- /dev/null
+++ b/SmartDeviceLink_Example/SubscribeButtonManager.h
@@ -0,0 +1,25 @@
+//
+// SubscribeButtonManager.h
+// SmartDeviceLink-Example-ObjC
+//
+// Created by Nicole on 6/19/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLManager;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SubscribeButtonManager : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithManager:(SDLManager *)manager;
+
+/// Subscribe to all available preset buttons. An alert will be shown when a preset button is short pressed or long pressed.
+- (void)subscribeToAllPresetButtons;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink_Example/SubscribeButtonManager.m b/SmartDeviceLink_Example/SubscribeButtonManager.m
new file mode 100644
index 000000000..80512a7b2
--- /dev/null
+++ b/SmartDeviceLink_Example/SubscribeButtonManager.m
@@ -0,0 +1,69 @@
+//
+// SubscribeButtonManager.m
+// SmartDeviceLink-Example-ObjC
+//
+// Created by Nicole on 6/19/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+#import "SubscribeButtonManager.h"
+
+#import "AlertManager.h"
+#import "SmartDeviceLink.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SubscribeButtonManager()
+
+@property (strong, nonatomic) SDLManager *sdlManager;
+
+@end
+
+@implementation SubscribeButtonManager
+
+- (instancetype)initWithManager:(SDLManager *)manager {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _sdlManager = manager;
+
+ return self;
+}
+
+- (void)subscribeToAllPresetButtons {
+ if (self.sdlManager.systemCapabilityManager.defaultMainWindowCapability.numCustomPresetsAvailable.intValue == 0) {
+ SDLLogW(@"The module does not support preset buttons");
+ return;
+ }
+
+ for (SDLButtonName buttonName in [self.class sdlex_allPresetButtons]) {
+ [self.sdlManager.screenManager subscribeButton:buttonName withObserver:self selector:@selector(sdlex_buttonPressEventWithButtonName:error:buttonPress:)];
+ }
+}
+
+- (void)sdlex_buttonPressEventWithButtonName:(SDLButtonName)buttonName error:(NSError *)error buttonPress:(SDLOnButtonPress *)buttonPress {
+ if (error != nil) {
+ SDLLogE(@"There was an error subscribing to the preset button: %@", error.localizedDescription);
+ return;
+ }
+
+ NSString *alertMessage = nil;
+ if ([buttonPress.buttonPressMode isEqualToEnum:SDLButtonPressModeShort]) {
+ alertMessage = [NSString stringWithFormat:@"%@ short pressed", buttonName];
+ } else {
+ alertMessage = [NSString stringWithFormat:@"%@ long pressed", buttonName];
+ }
+
+ SDLAlert *alert = [AlertManager alertWithMessageAndCloseButton:alertMessage textField2:nil iconName:nil];
+ [self.sdlManager sendRPC:alert];
+}
+
++ (NSArray<SDLButtonName> *)sdlex_allPresetButtons {
+ return @[SDLButtonNamePreset0, SDLButtonNamePreset1, SDLButtonNamePreset2, SDLButtonNamePreset3, SDLButtonNamePreset4, SDLButtonNamePreset5, SDLButtonNamePreset6, SDLButtonNamePreset7];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink_Example/SubscribeButtonManager.swift b/SmartDeviceLink_Example/SubscribeButtonManager.swift
new file mode 100644
index 000000000..6567d9e64
--- /dev/null
+++ b/SmartDeviceLink_Example/SubscribeButtonManager.swift
@@ -0,0 +1,53 @@
+//
+// SubscribeButtonManager.swift
+// SmartDeviceLink
+//
+// Created by Nicole on 6/19/20.
+// Copyright © 2020 smartdevicelink. All rights reserved.
+//
+
+import Foundation
+import SmartDeviceLink
+import SmartDeviceLinkSwift
+
+class SubscribeButtonManager: NSObject {
+ private let sdlManager: SDLManager!
+ private let presetButtons: [SDLButtonName] = [.preset0, .preset1, .preset2, .preset3, .preset4, .preset5, .preset6, .preset7]
+
+ init(sdlManager: SDLManager) {
+ self.sdlManager = sdlManager
+ }
+
+ /// Subscribe to all available preset buttons. An alert will be shown when a preset button is short pressed or long pressed.
+ func subscribeToPresetButtons() {
+ guard (sdlManager.systemCapabilityManager.defaultMainWindowCapability?.numCustomPresetsAvailable?.intValue ?? 0) > 0 else {
+ SDLLog.w("The module does not support preset buttons")
+ return
+ }
+
+ presetButtons.forEach { buttonName in
+ sdlManager.screenManager.subscribeButton(buttonName, withObserver: self, selector: #selector(buttonPressEvent(buttonName:error:buttonPress:)))
+ }
+ }
+
+ @objc private func buttonPressEvent(buttonName: SDLButtonName, error: Error?, buttonPress: SDLOnButtonPress?) {
+ if let error = error {
+ SDLLog.e("There was an error subscribing to the preset button: \(error)")
+ return
+ }
+
+ guard let buttonPress = buttonPress else { return }
+
+ let alert: SDLAlert
+ let buttonNameString = buttonName.rawValue.rawValue
+ switch buttonPress.buttonPressMode {
+ case .short:
+ alert = AlertManager.alertWithMessageAndCloseButton("\(buttonNameString) short pressed")
+ case .long:
+ alert = AlertManager.alertWithMessageAndCloseButton("\(buttonNameString) long pressed")
+ default: fatalError()
+ }
+
+ sdlManager.send(alert)
+ }
+}
diff --git a/docs/Classes.html b/docs/Classes.html
index ef134a5f2..c6781fd86 100644
--- a/docs/Classes.html
+++ b/docs/Classes.html
@@ -180,6 +180,7 @@
<li><a href="#section-SDLPerformAudioPassThruResponse">SDLPerformAudioPassThruResponse</a></li>
<li><a href="#section-SDLPerformInteraction">SDLPerformInteraction</a></li>
<li><a href="#section-SDLPerformInteractionResponse">SDLPerformInteractionResponse</a></li>
+ <li><a href="#section-SDLPermissionElement">SDLPermissionElement</a></li>
<li><a href="#section-SDLPermissionItem">SDLPermissionItem</a></li>
<li><a href="#section-SDLPermissionManager">SDLPermissionManager</a></li>
<li><a href="#section-SDLPhoneCapability">SDLPhoneCapability</a></li>
@@ -194,6 +195,7 @@
<li><a href="#section-SDLRPCMessage">SDLRPCMessage</a></li>
<li><a href="#section-SDLRPCNotification">SDLRPCNotification</a></li>
<li><a href="#section-SDLRPCNotificationNotification">SDLRPCNotificationNotification</a></li>
+ <li><a href="#section-SDLRPCPermissionStatus">SDLRPCPermissionStatus</a></li>
<li><a href="#section-SDLRPCRequest">SDLRPCRequest</a></li>
<li><a href="#section-SDLRPCRequestNotification">SDLRPCRequestNotification</a></li>
<li><a href="#section-SDLRPCResponse">SDLRPCResponse</a></li>
@@ -4046,6 +4048,25 @@ A keyboard can be used for searches. For example, the user could be asked to ent
+ <h3 id="section-SDLPermissionElement">
+ SDLPermissionElement
+ </h3>
+
+ <p>An object containing the RPC name and its parameter names that should be checked when checking permissions</p>
+
+ <a href="Classes/SDLPermissionElement.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">SDLPermissionElement</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></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLPermissionElement</span> <span class="p">:</span> <span class="kt">NSObject</span><span class="p">,</span> <span class="kt">NSCopying</span></code></pre>
+
+
+
+
<h3 id="section-SDLPermissionItem">
SDLPermissionItem
</h3>
@@ -4329,6 +4350,25 @@ Subsequent calls with the same service type will update the manifest for that se
+ <h3 id="section-SDLRPCPermissionStatus">
+ SDLRPCPermissionStatus
+ </h3>
+
+ <p>An object containing the result status of a permission element request</p>
+
+ <a href="Classes/SDLRPCPermissionStatus.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">SDLRPCPermissionStatus</span> <span class="p">:</span> <span class="nc">NSObject</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">class</span> <span class="kt">SDLRPCPermissionStatus</span> <span class="p">:</span> <span class="kt">NSObject</span></code></pre>
+
+
+
+
<h3 id="section-SDLRPCRequest">
SDLRPCRequest
</h3>
diff --git a/docs/Classes/SDLAppServiceManifest.html b/docs/Classes/SDLAppServiceManifest.html
index 0261c3c8f..25370a759 100644
--- a/docs/Classes/SDLAppServiceManifest.html
+++ b/docs/Classes/SDLAppServiceManifest.html
@@ -569,11 +569,11 @@
<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">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">*&gt;</span> <span class="o">*</span><span class="n">handledRPCs</span><span class="p">;</span></code></pre>
+ <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">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">handledRPCs</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">handledRPCs</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">handledRPCs</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLButtonPress.html b/docs/Classes/SDLButtonPress.html
index d2dcae903..488290b33 100644
--- a/docs/Classes/SDLButtonPress.html
+++ b/docs/Classes/SDLButtonPress.html
@@ -5,6 +5,7 @@
<ul>
<li><a href="#section--initWithButtonName:moduleType:">-initWithButtonName:moduleType:</a></li>
<li><a href="#section--initWithButtonName:moduleType:moduleId:">-initWithButtonName:moduleType:moduleId:</a></li>
+ <li><a href="#section--initWithButtonName:moduleType:moduleId:buttonPressMode:">-initWithButtonName:moduleType:moduleId:buttonPressMode:</a></li>
<li><a href="#section-moduleType">moduleType</a></li>
<li><a href="#section-moduleId">moduleId</a></li>
<li><a href="#section-buttonName">buttonName</a></li>
@@ -82,6 +83,43 @@
<p>An instance of the SDLButtonPress class.</p>
</div>
+ <h3 id="section--initWithButtonName:moduleType:moduleId:buttonPressMode:">
+ -initWithButtonName:moduleType:moduleId:buttonPressMode:
+ </h3>
+
+ <p>Constructs a newly allocated SDLButtonPress object with the given 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">initWithButtonName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">)</span><span class="nv">buttonName</span>
+ <span class="nf">moduleType</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLModuleType.h@T@SDLModuleType">SDLModuleType</a></span><span class="p">)</span><span class="nv">moduleType</span>
+ <span class="nf">moduleId</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">moduleId</span>
+ <span class="nf">buttonPressMode</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode">SDLButtonPressMode</a></span><span class="p">)</span><span class="nv">buttonPressMode</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">buttonName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">,</span> <span class="nv">moduleType</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLModuleType.h@T@SDLModuleType">SDLModuleType</a></span><span class="p">,</span> <span class="nv">moduleId</span><span class="p">:</span> <span class="kt">String</span><span class="p">?,</span> <span class="nv">buttonPressMode</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode">SDLButtonPressMode</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>buttonName</dt>
+ <dd><p>the name of the button</p></dd>
+ <dt>moduleType</dt>
+ <dd><p>the module where the button should be pressed</p></dd>
+ <dt>moduleId</dt>
+ <dd><p>the id of the module</p></dd>
+ <dt>buttonPressMode</dt>
+ <dd><p>indicates LONG or SHORT button press event</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of the SDLButtonPress class.</p>
+ </div>
+
<h3 id="section-moduleType">
moduleType
</h3>
diff --git a/docs/Classes/SDLConfiguration.html b/docs/Classes/SDLConfiguration.html
index 8435611db..09593f5e0 100644
--- a/docs/Classes/SDLConfiguration.html
+++ b/docs/Classes/SDLConfiguration.html
@@ -9,16 +9,16 @@
<li><a href="#section-streamingMediaConfig">streamingMediaConfig</a></li>
<li><a href="#section-fileManagerConfig">fileManagerConfig</a></li>
<li><a href="#section-encryptionConfig">encryptionConfig</a></li>
+ <li><a href="#section--initWithLifecycle:lockScreen:logging:fileManager:encryption:">-initWithLifecycle:lockScreen:logging:fileManager:encryption:</a></li>
+ <li><a href="#section--initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:">-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:</a></li>
<li><a href="#section--initWithLifecycle:lockScreen:logging:">-initWithLifecycle:lockScreen:logging:</a></li>
<li><a href="#section--initWithLifecycle:lockScreen:logging:fileManager:">-initWithLifecycle:lockScreen:logging:fileManager:</a></li>
- <li><a href="#section--initWithLifecycle:lockScreen:logging:fileManager:encryption:">-initWithLifecycle:lockScreen:logging:fileManager:encryption:</a></li>
- <li><a href="#section-+configurationWithLifecycle:lockScreen:logging:">+configurationWithLifecycle:lockScreen:logging:</a></li>
- <li><a href="#section-+configurationWithLifecycle:lockScreen:logging:fileManager:">+configurationWithLifecycle:lockScreen:logging:fileManager:</a></li>
<li><a href="#section--initWithLifecycle:lockScreen:logging:streamingMedia:">-initWithLifecycle:lockScreen:logging:streamingMedia:</a></li>
<li><a href="#section--initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:">-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:</a></li>
- <li><a href="#section--initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:">-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:</a></li>
- <li><a href="#section-+configurationWithLifecycle:lockScreen:logging:streamingMedia:">+configurationWithLifecycle:lockScreen:logging:streamingMedia:</a></li>
+ <li><a href="#section-+configurationWithLifecycle:lockScreen:logging:fileManager:">+configurationWithLifecycle:lockScreen:logging:fileManager:</a></li>
<li><a href="#section-+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:">+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:</a></li>
+ <li><a href="#section-+configurationWithLifecycle:lockScreen:logging:streamingMedia:">+configurationWithLifecycle:lockScreen:logging:streamingMedia:</a></li>
+ <li><a href="#section-+configurationWithLifecycle:lockScreen:logging:">+configurationWithLifecycle:lockScreen:logging:</a></li>
</ul>
<h3>Overview</h3>
@@ -90,11 +90,11 @@
<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"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">streamingMediaConfig</span><span class="p">;</span></code></pre>
+ <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"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="o">*</span><span class="n">streamingMediaConfig</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">streamingMediaConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">streamingMediaConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
@@ -135,45 +135,11 @@
- <h3 id="section--initWithLifecycle:lockScreen:logging:">
- -initWithLifecycle:lockScreen:logging:
- </h3>
-
- <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.</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">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
- <span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
- <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</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">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?)</span></code></pre>
-
-
-
- <h4>Parameters</h4>
- <dl>
- <dt>lifecycleConfig</dt>
- <dd><p>The lifecycle configuration to be used.</p></dd>
- <dt>lockScreenConfig</dt>
- <dd><p>The lockscreen configuration to be used. If nil, the <code>enabledConfiguration</code> will be used.</p></dd>
- <dt>logConfig</dt>
- <dd><p>The logging configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
- </dl>
- <div>
- <h4>Return Value</h4>
- <p>The configuration</p>
- </div>
-
- <h3 id="section--initWithLifecycle:lockScreen:logging:fileManager:">
- -initWithLifecycle:lockScreen:logging:fileManager:
+ <h3 id="section--initWithLifecycle:lockScreen:logging:fileManager:encryption:">
+ -initWithLifecycle:lockScreen:logging:fileManager:encryption:
</h3>
- <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</p>
+ <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.</p>
@@ -182,11 +148,12 @@
<span class="nf">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
<span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
<span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
- <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fileManagerConfig</span><span class="p">;</span></code></pre>
+ <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fileManagerConfig</span>
+ <span class="nf">encryption</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">encryptionConfig</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">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?,</span> <span class="n">fileManager</span> <span class="nv">fileManagerConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span><span class="p">?)</span></code></pre>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="n">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?,</span> <span class="n">fileManager</span> <span class="nv">fileManagerConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span><span class="p">?,</span> <span class="n">encryption</span> <span class="nv">encryptionConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span><span class="p">?)</span></code></pre>
@@ -200,17 +167,19 @@
<dd><p>The logging configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
<dt>fileManagerConfig</dt>
<dd><p>The file manager configuration to be used or <code>defaultConfiguration</code> if nil.</p></dd>
+ <dt>encryptionConfig</dt>
+ <dd><p>The encryption configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
</dl>
<div>
<h4>Return Value</h4>
<p>The configuration</p>
</div>
- <h3 id="section--initWithLifecycle:lockScreen:logging:fileManager:encryption:">
- -initWithLifecycle:lockScreen:logging:fileManager:encryption:
+ <h3 id="section--initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:">
+ -initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:
</h3>
- <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.</p>
+ <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>
@@ -219,12 +188,14 @@
<span class="nf">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
<span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
<span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
+ <span class="nf">streamingMedia</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">streamingMediaConfig</span>
<span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fileManagerConfig</span>
<span class="nf">encryption</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">encryptionConfig</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">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?,</span> <span class="n">fileManager</span> <span class="nv">fileManagerConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span><span class="p">?,</span> <span class="n">encryption</span> <span class="nv">encryptionConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span><span class="p">?)</span></code></pre>
+ <pre class="highlight swift"><code><span class="nf">init</span><span class="p">(</span><span class="n">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?,</span> <span class="n">streamingMedia</span> <span class="nv">streamingMediaConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span><span class="p">?,</span> <span class="n">fileManager</span> <span class="nv">fileManagerConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span><span class="p">?,</span> <span class="n">encryption</span> <span class="nv">encryptionConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span><span class="p">?)</span></code></pre>
@@ -236,6 +207,8 @@
<dd><p>The lockscreen configuration to be used. If nil, the <code>enabledConfiguration</code> will be used.</p></dd>
<dt>logConfig</dt>
<dd><p>The logging configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
+ <dt>streamingMediaConfig</dt>
+ <dd><p>The streaming media configuration to be used or nil if not used.</p></dd>
<dt>fileManagerConfig</dt>
<dd><p>The file manager configuration to be used or <code>defaultConfiguration</code> if nil.</p></dd>
<dt>encryptionConfig</dt>
@@ -246,8 +219,8 @@
<p>The configuration</p>
</div>
- <h3 id="section-+configurationWithLifecycle:lockScreen:logging:">
- +configurationWithLifecycle:lockScreen:logging:
+ <h3 id="section--initWithLifecycle:lockScreen:logging:">
+ -initWithLifecycle:lockScreen:logging:
</h3>
<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.</p>
@@ -255,14 +228,15 @@
<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">configurationWithLifecycle</span><span class="p">:</span>
- <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
- <span class="nf">lockScreen</span><span class="p">:</span>
- <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
- <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span><span class="p">;</span></code></pre>
+ <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">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
+ <span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
+ <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</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">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?)</span></code></pre>
+
<h4>Parameters</h4>
@@ -279,8 +253,8 @@
<p>The configuration</p>
</div>
- <h3 id="section-+configurationWithLifecycle:lockScreen:logging:fileManager:">
- +configurationWithLifecycle:lockScreen:logging:fileManager:
+ <h3 id="section--initWithLifecycle:lockScreen:logging:fileManager:">
+ -initWithLifecycle:lockScreen:logging:fileManager:
</h3>
<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</p>
@@ -288,16 +262,16 @@
<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">configurationWithLifecycle</span><span class="p">:</span>
- <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
- <span class="nf">lockScreen</span><span class="p">:</span>
- <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
- <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
- <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span>
- <span class="n"><a href="../Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig">fileManagerConfig</a></span><span class="p">;</span></code></pre>
+ <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">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
+ <span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
+ <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
+ <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fileManagerConfig</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">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?,</span> <span class="n">fileManager</span> <span class="nv">fileManagerConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span><span class="p">?)</span></code></pre>
+
<h4>Parameters</h4>
@@ -395,30 +369,66 @@
<p>The configuration</p>
</div>
- <h3 id="section--initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:">
- -initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:
+ <h3 id="section-+configurationWithLifecycle:lockScreen:logging:fileManager:">
+ +configurationWithLifecycle:lockScreen:logging:fileManager:
</h3>
- <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>
+ <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</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">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
- <span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
- <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
- <span class="nf">streamingMedia</span><span class="p">:</span>
- <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">streamingMediaConfig</span>
- <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">fileManagerConfig</span>
- <span class="nf">encryption</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">encryptionConfig</span><span class="p">;</span></code></pre>
+ <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">configurationWithLifecycle</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
+ <span class="nf">lockScreen</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
+ <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
+ <span class="nf">fileManager</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig">fileManagerConfig</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="n">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">?,</span> <span class="n">logging</span> <span class="nv">logConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span><span class="p">?,</span> <span class="n">streamingMedia</span> <span class="nv">streamingMediaConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span><span class="p">?,</span> <span class="n">fileManager</span> <span class="nv">fileManagerConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span><span class="p">?,</span> <span class="n">encryption</span> <span class="nv">encryptionConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLEncryptionConfiguration.html">SDLEncryptionConfiguration</a></span><span class="p">?)</span></code></pre>
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>lifecycleConfig</dt>
+ <dd><p>The lifecycle configuration to be used.</p></dd>
+ <dt>lockScreenConfig</dt>
+ <dd><p>The lockscreen configuration to be used. If nil, the <code>enabledConfiguration</code> will be used.</p></dd>
+ <dt>logConfig</dt>
+ <dd><p>The logging configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
+ <dt>fileManagerConfig</dt>
+ <dd><p>The file manager configuration to be used or <code>defaultConfiguration</code> if nil.</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+ </div>
+
+ <h3 id="section-+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:">
+ +configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:
+ </h3>
+
+ <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.</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">configurationWithLifecycle</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
+ <span class="nf">lockScreen</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
+ <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
+ <span class="nf">streamingMedia</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig">streamingMediaConfig</a></span>
+ <span class="n">fileManager</span><span class="o">:</span><span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig">fileManagerConfig</a></span><span class="p">;</span></code></pre>
+
<h4>Parameters</h4>
<dl>
<dt>lifecycleConfig</dt>
@@ -431,8 +441,6 @@
<dd><p>The streaming media configuration to be used or nil if not used.</p></dd>
<dt>fileManagerConfig</dt>
<dd><p>The file manager configuration to be used or <code>defaultConfiguration</code> if nil.</p></dd>
- <dt>encryptionConfig</dt>
- <dd><p>The encryption configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
</dl>
<div>
<h4>Return Value</h4>
@@ -476,11 +484,11 @@
<p>The configuration</p>
</div>
- <h3 id="section-+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:">
- +configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:
+ <h3 id="section-+configurationWithLifecycle:lockScreen:logging:">
+ +configurationWithLifecycle:lockScreen:logging:
</h3>
- <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.</p>
+ <p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.</p>
@@ -490,11 +498,7 @@
<span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
<span class="nf">lockScreen</span><span class="p">:</span>
<span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span>
- <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span>
- <span class="nf">streamingMedia</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLStreamingMediaConfiguration.html">SDLStreamingMediaConfiguration</a></span> <span class="o">*</span><span class="p">)</span>
- <span class="n"><a href="../Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig">streamingMediaConfig</a></span>
- <span class="n">fileManager</span><span class="o">:</span><span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLFileManagerConfiguration.html">SDLFileManagerConfiguration</a></span> <span class="o">*</span><span class="p">)</span>
- <span class="n"><a href="../Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig">fileManagerConfig</a></span><span class="p">;</span></code></pre>
+ <span class="nf">logging</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLogConfiguration.html">SDLLogConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">logConfig</span><span class="p">;</span></code></pre>
@@ -507,10 +511,6 @@
<dd><p>The lockscreen configuration to be used. If nil, the <code>enabledConfiguration</code> will be used.</p></dd>
<dt>logConfig</dt>
<dd><p>The logging configuration to be used. If nil, the <code>defaultConfiguration</code> will be used.</p></dd>
- <dt>streamingMediaConfig</dt>
- <dd><p>The streaming media configuration to be used or nil if not used.</p></dd>
- <dt>fileManagerConfig</dt>
- <dd><p>The file manager configuration to be used or <code>defaultConfiguration</code> if nil.</p></dd>
</dl>
<div>
<h4>Return Value</h4>
diff --git a/docs/Classes/SDLDiagnosticMessage.html b/docs/Classes/SDLDiagnosticMessage.html
index e74847d97..890498e92 100644
--- a/docs/Classes/SDLDiagnosticMessage.html
+++ b/docs/Classes/SDLDiagnosticMessage.html
@@ -102,11 +102,11 @@
<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">NSArray</span><span class="o">&lt;</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">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">messageData</span><span class="p">;</span></code></pre>
+ <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">NSArray</span><span class="o">&lt;</span><span class="n">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">messageData</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">messageData</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">messageData</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLDiagnosticMessageResponse.html b/docs/Classes/SDLDiagnosticMessageResponse.html
index 89b6c8c91..02cfd6e51 100644
--- a/docs/Classes/SDLDiagnosticMessageResponse.html
+++ b/docs/Classes/SDLDiagnosticMessageResponse.html
@@ -25,11 +25,11 @@
<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">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">*&gt;</span> <span class="o">*</span><span class="n">messageDataResult</span><span class="p">;</span></code></pre>
+ <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">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">messageDataResult</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">messageDataResult</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">messageDataResult</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLEncryptionConfiguration.html b/docs/Classes/SDLEncryptionConfiguration.html
index f48eed7f7..5ac6b6558 100644
--- a/docs/Classes/SDLEncryptionConfiguration.html
+++ b/docs/Classes/SDLEncryptionConfiguration.html
@@ -39,11 +39,11 @@
<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">id</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLServiceEncryptionDelegate.html">SDLServiceEncryptionDelegate</a></span><span class="o">&gt;</span> <span class="n">delegate</span><span class="p">;</span></code></pre>
+ <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/SDLServiceEncryptionDelegate.html">SDLServiceEncryptionDelegate</a></span><span class="o">&gt;</span> <span class="n">delegate</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">delegate</span><span class="p">:</span> <span class="kt"><a href="../Protocols/SDLServiceEncryptionDelegate.html">SDLServiceEncryptionDelegate</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>
+ <pre class="highlight swift"><code><span class="k">weak</span> <span class="k">var</span> <span class="nv">delegate</span><span class="p">:</span> <span class="kt"><a href="../Protocols/SDLServiceEncryptionDelegate.html">SDLServiceEncryptionDelegate</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>
diff --git a/docs/Classes/SDLGetInteriorVehicleDataConsentResponse.html b/docs/Classes/SDLGetInteriorVehicleDataConsentResponse.html
index c41e5e1bc..d9b26748c 100644
--- a/docs/Classes/SDLGetInteriorVehicleDataConsentResponse.html
+++ b/docs/Classes/SDLGetInteriorVehicleDataConsentResponse.html
@@ -22,16 +22,16 @@
&ldquo;true&rdquo; - if SDL grants the permission for the requested module
&ldquo;false&rdquo; - SDL denies the permission for the requested module.</p>
-<p>Optional</p>
+<p>Optional, contains a boolean</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">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">*&gt;</span> <span class="o">*</span><span class="n">allowed</span><span class="p">;</span></code></pre>
+ <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">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">allowed</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">allowed</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>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">allowed</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLManager.html b/docs/Classes/SDLManager.html
index 9ae82874e..728e0bfac 100644
--- a/docs/Classes/SDLManager.html
+++ b/docs/Classes/SDLManager.html
@@ -16,7 +16,6 @@
<li><a href="#section-authToken">authToken</a></li>
<li><a href="#section-delegate">delegate</a></li>
<li><a href="#section-pendingRPCTransactions">pendingRPCTransactions</a></li>
- <li><a href="#section-proxy">proxy</a></li>
<li><a href="#section--initWithConfiguration:delegate:">-initWithConfiguration:delegate:</a></li>
<li><a href="#section--startWithReadyHandler:">-startWithReadyHandler:</a></li>
<li><a href="#section--stop">-stop</a></li>
@@ -268,25 +267,6 @@
- <h3 id="section-proxy">
- proxy
- </h3>
-
- <p>Deprecated internal proxy object. This should only be accessed when the Manager is READY. This property may go to nil at any time.
-All the other functionality exists on managers in sdl_ios 4.3+.</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">SDLProxy</span> <span class="o">*</span><span class="n">proxy</span><span class="p">;</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">proxy</span><span class="p">:</span> <span class="kt">SDLProxy</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
-
-
-
-
<h3 id="section--initWithConfiguration:delegate:">
-initWithConfiguration:delegate:
</h3>
diff --git a/docs/Classes/SDLPerformInteraction.html b/docs/Classes/SDLPerformInteraction.html
index 239b7a75a..0fb69c74d 100644
--- a/docs/Classes/SDLPerformInteraction.html
+++ b/docs/Classes/SDLPerformInteraction.html
@@ -547,11 +547,11 @@ A keyboard can be used for searches. For example, the user could be asked to ent
<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">NSArray</span><span class="o">&lt;</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">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">interactionChoiceSetIDList</span><span class="p">;</span></code></pre>
+ <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">NSArray</span><span class="o">&lt;</span><span class="n">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">interactionChoiceSetIDList</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">interactionChoiceSetIDList</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">interactionChoiceSetIDList</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLPermissionElement.html b/docs/Classes/SDLPermissionElement.html
new file mode 100644
index 000000000..53fc592ec
--- /dev/null
+++ b/docs/Classes/SDLPermissionElement.html
@@ -0,0 +1,85 @@
+<h1>SDLPermissionElement Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-rpcName">rpcName</a></li>
+ <li><a href="#section-parameterPermissions">parameterPermissions</a></li>
+ <li><a href="#section--initWithRPCName:parameterPermissions:">-initWithRPCName:parameterPermissions:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>An object containing the RPC name and its parameter names that should be checked when checking permissions</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-rpcName">
+ rpcName
+ </h3>
+
+ <p>Name of the individual RPC.
+Required</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:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span> <span class="n">_Nonnull</span> <span class="n">rpcName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</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-parameterPermissions">
+ parameterPermissions
+ </h3>
+
+ <p>RPC parameters for the individual RPC</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">parameterPermissions</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">parameterPermissions</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>
+
+
+
+
+ <h3 id="section--initWithRPCName:parameterPermissions:">
+ -initWithRPCName:parameterPermissions:
+ </h3>
+
+ <p>Creates a new permission element.</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">initWithRPCName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span><span class="nv">rpcName</span>
+ <span class="nf">parameterPermissions</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">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">parameterPermissions</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">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">,</span> <span class="nv">parameterPermissions</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>rpcName</dt>
+ <dd><p>The name of the RPC.</p></dd>
+ <dt>parameterPermissions</dt>
+ <dd><p>An array parameters for the RPC that should be checked if they are allowed. Note that not all head units may provide this data. If no parameter data is received, we assume that the parameter is not allowed.</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of <code>SDLPermissionElement</code>.</p>
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLPermissionManager.html b/docs/Classes/SDLPermissionManager.html
index 08fd19575..2858dedb8 100644
--- a/docs/Classes/SDLPermissionManager.html
+++ b/docs/Classes/SDLPermissionManager.html
@@ -7,12 +7,18 @@
<li><a href="#section--startWithCompletionHandler:">-startWithCompletionHandler:</a></li>
<li><a href="#section--stop">-stop</a></li>
<li><a href="#section--isRPCAllowed:">-isRPCAllowed:</a></li>
+ <li><a href="#section--isRPCNameAllowed:">-isRPCNameAllowed:</a></li>
<li><a href="#section--groupStatusOfRPCs:">-groupStatusOfRPCs:</a></li>
+ <li><a href="#section--groupStatusOfRPCPermissions:">-groupStatusOfRPCPermissions:</a></li>
<li><a href="#section--statusOfRPCs:">-statusOfRPCs:</a></li>
+ <li><a href="#section--statusesOfRPCPermissions:">-statusesOfRPCPermissions:</a></li>
<li><a href="#section--addObserverForRPCs:groupType:withHandler:">-addObserverForRPCs:groupType:withHandler:</a></li>
+ <li><a href="#section--subscribeToRPCPermissions:groupType:withHandler:">-subscribeToRPCPermissions:groupType:withHandler:</a></li>
<li><a href="#section--removeAllObservers">-removeAllObservers</a></li>
<li><a href="#section--removeObserverForIdentifier:">-removeObserverForIdentifier:</a></li>
<li><a href="#section--rpcRequiresEncryption:">-rpcRequiresEncryption:</a></li>
+ <li><a href="#section--rpcNameRequiresEncryption:">-rpcNameRequiresEncryption:</a></li>
+ <li><a href="#section--isPermissionParameterAllowed:parameter:">-isPermissionParameterAllowed:parameter:</a></li>
</ul>
<h3>Overview</h3>
@@ -108,6 +114,33 @@
<p>YES if the RPC is allowed at the current HMI level, NO if not</p>
</div>
+ <h3 id="section--isRPCNameAllowed:">
+ -isRPCNameAllowed:
+ </h3>
+
+ <p>Determine if an individual RPC is allowed for the current HMI level</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">isRPCNameAllowed</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span><span class="nv">rpcName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">isRPCNameAllowed</span><span class="p">(</span><span class="n">_</span> <span class="nv">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcName</dt>
+ <dd><p>The name of the RPC to be tested, for example, SDLRPCFunctionNameShow</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>YES if the RPC is allowed at the current HMI level, NO if not</p>
+ </div>
+
<h3 id="section--groupStatusOfRPCs:">
-groupStatusOfRPCs:
</h3>
@@ -136,6 +169,34 @@
<p>AllAllowed if all of the permissions are allowed, AllDisallowed if all the permissions are disallowed, Any if some are allowed, and some are disallowed</p>
</div>
+ <h3 id="section--groupStatusOfRPCPermissions:">
+ -groupStatusOfRPCPermissions:
+ </h3>
+
+ <p>Determine if all RPCs are allowed for the current HMI level</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n"><a href="../Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span><span class="p">)</span><span class="nf">groupStatusOfRPCPermissions</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"><a href="../Classes/SDLPermissionElement.html">SDLPermissionElement</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpcNames</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">groupStatus</span><span class="p">(</span><span class="n">ofRPCPermissions</span> <span class="nv">rpcNames</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLPermissionElement.html">SDLPermissionElement</a></span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kt"><a href="../Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcNames</dt>
+ <dd><p>The RPCs to check</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>AllAllowed if all of the permissions are allowed, AllDisallowed if all the permissions are disallowed, Any if some are allowed, and some are disallowed</p>
+ </div>
+
<h3 id="section--statusOfRPCs:">
-statusOfRPCs:
</h3>
@@ -164,6 +225,35 @@
<p>A dictionary specifying if the passed in RPC names are currently allowed or not</p>
</div>
+ <h3 id="section--statusesOfRPCPermissions:">
+ -statusesOfRPCPermissions:
+ </h3>
+
+ <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>
+
+
+
+ <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">NSDictionary</span><span class="o">&lt;</span><span class="n"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">,</span> <span class="n"><a href="../Classes/SDLRPCPermissionStatus.html">SDLRPCPermissionStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+ <span class="nf">statusesOfRPCPermissions</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"><a href="../Classes/SDLPermissionElement.html">SDLPermissionElement</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpcNames</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">statuses</span><span class="p">(</span><span class="n">ofRPCPermissions</span> <span class="nv">rpcNames</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLPermissionElement.html">SDLPermissionElement</a></span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span> <span class="p">:</span> <span class="kt"><a href="../Classes/SDLRPCPermissionStatus.html">SDLRPCPermissionStatus</a></span><span class="p">]</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcNames</dt>
+ <dd><p>An array of permission elements to check</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A dictionary with specific RPC info contained in a SDLRPCPermissionStatus</p>
+ </div>
+
<h3 id="section--addObserverForRPCs:groupType:withHandler:">
-addObserverForRPCs:groupType:withHandler:
</h3>
@@ -198,6 +288,47 @@
<dt>rpcNames</dt>
<dd><p>The RPCs to be observed</p></dd>
<dt>groupType</dt>
+ <dd><p>Affects the times that the observer block will be called. If Any, any change to any RPC in rpcNames will cause the observer block to be called. If AllAllowed, the block will be called when: 1. The observer is first set regardless of RPC status 2. Every RPC in rpcNames becomes allowed 3. The group of rpcNames goes from all being allowed to some or all being disallowed.</p></dd>
+ <dt>handler</dt>
+ <dd><p>The block that will be called whenever permissions change.</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An identifier that can be passed to removeObserverForIdentifer: to remove the observer</p>
+ </div>
+
+ <h3 id="section--subscribeToRPCPermissions:groupType:withHandler:">
+ -subscribeToRPCPermissions:groupType:withHandler:
+ </h3>
+
+ <p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. Unlike addObserverForRPCs:groupType:withHandler:, 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. That could send <code>nil</code> to removeObserverForIdentifier:. If you want functionality like that, call groupStatusOfRPCs: instead.</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"><a href="../Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier">SDLPermissionObserverIdentifier</a></span><span class="p">)</span>
+ <span class="nf">subscribeToRPCPermissions</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"><a href="../Classes/SDLPermissionElement.html">SDLPermissionElement</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">permissionElements</span>
+ <span class="nf">groupType</span><span class="p">:(</span><span class="n"><a href="../Enums/SDLPermissionGroupType.html">SDLPermissionGroupType</a></span><span class="p">)</span><span class="nv">groupType</span>
+ <span class="nf">withHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler">SDLRPCPermissionStatusChangedHandler</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">subscribe</span><span class="p">(</span><span class="n">toRPCPermissions</span> <span class="nv">permissionElements</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLPermissionElement.html">SDLPermissionElement</a></span><span class="p">],</span> <span class="nv">groupType</span><span class="p">:</span> <span class="kt"><a href="../Enums/SDLPermissionGroupType.html">SDLPermissionGroupType</a></span><span class="p">,</span> <span class="n">withHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler">SDLRPCPermissionStatusChangedHandler</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">UUID</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>permissionElements</dt>
+ <dd><p>The permission elements to be observed</p></dd>
+ <dt>groupType</dt>
<dd><p>Affects the times that the observer block will be called. If Any, any change to any RPC in rpcNames will cause the observer block to be called. If AllAllowed, the block will be called when: 1. Every RPC in rpcNames becomes allowed 2. The group of rpcNames goes from all being allowed to some or all being disallowed.</p></dd>
<dt>handler</dt>
<dd><p>The block that will be called whenever permissions change.</p></dd>
@@ -267,4 +398,52 @@
+ <h3 id="section--rpcNameRequiresEncryption:">
+ -rpcNameRequiresEncryption:
+ </h3>
+
+ <p>Check whether or not an RPC needs encryption.</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">rpcNameRequiresEncryption</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span><span class="nv">rpcName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">rpcNameRequiresEncryption</span><span class="p">(</span><span class="n">_</span> <span class="nv">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+
+ <h3 id="section--isPermissionParameterAllowed:parameter:">
+ -isPermissionParameterAllowed:parameter:
+ </h3>
+
+ <p>Check whether a parameter of an RPC is allowed</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">isPermissionParameterAllowed</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span><span class="nv">rpcName</span>
+ <span class="nf">parameter</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">parameter</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">isPermissionParameterAllowed</span><span class="p">(</span><span class="n">_</span> <span class="nv">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">,</span> <span class="nv">parameter</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcName</dt>
+ <dd><p>The name of the RPC to be tested, for example, SDLRPCFunctionNameGetVehicleData</p></dd>
+ <dt>parameter</dt>
+ <dd><p>The name of the parameter to be tested, for example, rpm</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>True if the parameter is allowed, false if it is not</p>
+ </div>
+
</section>
diff --git a/docs/Classes/SDLPutFile.html b/docs/Classes/SDLPutFile.html
index 11d603678..52764784c 100644
--- a/docs/Classes/SDLPutFile.html
+++ b/docs/Classes/SDLPutFile.html
@@ -10,6 +10,7 @@
<li><a href="#section--initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:">-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:</a></li>
<li><a href="#section--initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:">-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:</a></li>
<li><a href="#section-syncFileName">syncFileName</a></li>
+ <li><a href="#section-sdlFileName">sdlFileName</a></li>
<li><a href="#section-fileType">fileType</a></li>
<li><a href="#section-persistentFile">persistentFile</a></li>
<li><a href="#section-systemFile">systemFile</a></li>
@@ -259,7 +260,7 @@
<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">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">syncFileName</span><span class="p">;</span></code></pre>
+ <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">__deprecated_msg</span><span class="p">(</span><span class="s">"use sdlFileName instead"</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">syncFileName</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -268,6 +269,26 @@
+ <h3 id="section-sdlFileName">
+ sdlFileName
+ </h3>
+
+ <p>File reference name</p>
+
+<p>Required, max length 255 characters</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">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">sdlFileName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">sdlFileName</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-fileType">
fileType
</h3>
diff --git a/docs/Classes/SDLRPCPermissionStatus.html b/docs/Classes/SDLRPCPermissionStatus.html
new file mode 100644
index 000000000..ceb5ef912
--- /dev/null
+++ b/docs/Classes/SDLRPCPermissionStatus.html
@@ -0,0 +1,109 @@
+<h1>SDLRPCPermissionStatus Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-rpcName">rpcName</a></li>
+ <li><a href="#section-rpcAllowed">rpcAllowed</a></li>
+ <li><a href="#section-rpcParameters">rpcParameters</a></li>
+ <li><a href="#section--initWithRPCName:isRPCAllowed:rpcParameters:">-initWithRPCName:isRPCAllowed:rpcParameters:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>An object containing the result status of a permission element request</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-rpcName">
+ rpcName
+ </h3>
+
+ <p>Name of the individual RPC.</p>
+
+<p>Required</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"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span> <span class="n">_Nonnull</span> <span class="n">rpcName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-rpcAllowed">
+ rpcAllowed
+ </h3>
+
+ <p>Whether or not the RPC is allowed.</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">readonly</span><span class="p">,</span> <span class="n">getter</span><span class="o">=</span><span class="n">isRPCAllowed</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">rpcAllowed</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">isRPCAllowed</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-rpcParameters">
+ rpcParameters
+ </h3>
+
+ <p>Holds a dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed</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">NSDictionary</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*</span><span class="p">,</span> <span class="n">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">rpcParameters</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">rpcParameters</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span> <span class="p">:</span> <span class="kt">NSNumber</span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithRPCName:isRPCAllowed:rpcParameters:">
+ -initWithRPCName:isRPCAllowed:rpcParameters:
+ </h3>
+
+ <p>Initializes a SDLRPCPermissionStatus 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">initWithRPCName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">)</span><span class="nv">rpcName</span>
+ <span class="nf">isRPCAllowed</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">isRPCAllowed</span>
+ <span class="nf">rpcParameters</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">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcParameters">rpcParameters</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">rpcName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">,</span> <span class="nv">isRPCAllowed</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span> <span class="nv">rpcParameters</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span> <span class="p">:</span> <span class="kt">NSNumber</span><span class="p">]?)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcName</dt>
+ <dd><p>The name of the RPC.</p></dd>
+ <dt>isRPCAllowed</dt>
+ <dd><p>The permission status for the RPC.</p></dd>
+ <dt>rpcParameters</dt>
+ <dd><p>A dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of the SDLRPCPermissionStatus class.</p>
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLReadDID.html b/docs/Classes/SDLReadDID.html
index 5ade10cc6..1a15533a2 100644
--- a/docs/Classes/SDLReadDID.html
+++ b/docs/Classes/SDLReadDID.html
@@ -78,23 +78,25 @@
</h3>
<p>Raw data from vehicle data DID location(s)
- <br/>a Vector<Integer> value representing raw data from vehicle
- data DID location(s)
- <p>
- <b>Notes: </b>
- <ul>
- <li>Minvalue:0; Maxvalue:65535</li>
- <li>ArrayMin:0; ArrayMax:1000</li>
- </ul></p>
+ <br/>a Vector<Integer> value representing raw data from vehicle
+ data DID location(s)
+ <p>
+ <b>Notes: </b>
+ <ul>
+ <li>Minvalue:0; Maxvalue:65535</li>
+ <li>ArrayMin:0; ArrayMax:1000</li>
+ </ul></p>
+
+<p>Mandatory, contains an integer</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">NSArray</span><span class="o">&lt;</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">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">didLocation</span><span class="p">;</span></code></pre>
+ <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">NSArray</span><span class="o">&lt;</span><span class="n">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">didLocation</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">didLocation</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">didLocation</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLRegisterAppInterfaceResponse.html b/docs/Classes/SDLRegisterAppInterfaceResponse.html
index 8e86109eb..c90bb43e0 100644
--- a/docs/Classes/SDLRegisterAppInterfaceResponse.html
+++ b/docs/Classes/SDLRegisterAppInterfaceResponse.html
@@ -376,11 +376,11 @@
<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">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">*&gt;</span> <span class="o">*</span><span class="n">supportedDiagModes</span><span class="p">;</span></code></pre>
+ <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">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">supportedDiagModes</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">supportedDiagModes</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">supportedDiagModes</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLScreenManager.html b/docs/Classes/SDLScreenManager.html
index 27ad443ca..c10bd8585 100644
--- a/docs/Classes/SDLScreenManager.html
+++ b/docs/Classes/SDLScreenManager.html
@@ -30,6 +30,9 @@
<li><a href="#section--endUpdates">-endUpdates</a></li>
<li><a href="#section--endUpdatesWithCompletionHandler:">-endUpdatesWithCompletionHandler:</a></li>
<li><a href="#section--softButtonObjectNamed:">-softButtonObjectNamed:</a></li>
+ <li><a href="#section--subscribeButton:withUpdateHandler:">-subscribeButton:withUpdateHandler:</a></li>
+ <li><a href="#section--subscribeButton:withObserver:selector:">-subscribeButton:withObserver:selector:</a></li>
+ <li><a href="#section--unsubscribeButton:withObserver:withCompletionHandler:">-unsubscribeButton:withObserver:withCompletionHandler:</a></li>
<li><a href="#section--preloadChoices:withCompletionHandler:">-preloadChoices:withCompletionHandler:</a></li>
<li><a href="#section--deleteChoices:">-deleteChoices:</a></li>
<li><a href="#section--presentChoiceSet:mode:">-presentChoiceSet:mode:</a></li>
@@ -611,6 +614,108 @@
<dd><p>The name of the button</p></dd>
</dl>
+ <h3 id="section--subscribeButton:withUpdateHandler:">
+ -subscribeButton:withUpdateHandler:
+ </h3>
+
+ <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>
+
+
+
+ <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">id</span><span class="o">&lt;</span><span class="n">NSObject</span><span class="o">&gt;</span><span class="p">)</span><span class="nf">subscribeButton</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">)</span><span class="nv">buttonName</span>
+ <span class="nf">withUpdateHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler">SDLSubscribeButtonHandler</a></span><span class="p">)</span><span class="nv">updateHandler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">subscribeButton</span><span class="p">(</span><span class="n">_</span> <span class="nv">buttonName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">,</span> <span class="n">withUpdateHandler</span> <span class="nv">updateHandler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler">SDLSubscribeButtonHandler</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">NSObjectProtocol</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>buttonName</dt>
+ <dd><p>The name of the hard button to subscribe to</p></dd>
+ <dt>updateHandler</dt>
+ <dd><p>The block run when the subscribe button is selected</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object that can be used to unsubscribe the block using <code>unsubscribeButtonWithObserver:withCompletionHandler:</code>.</p>
+ </div>
+
+ <h3 id="section--subscribeButton:withObserver:selector:">
+ -subscribeButton:withObserver:selector:
+ </h3>
+
+ <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>
+
+<p>The selector supports the following parameters:</p>
+
+<ol>
+<li><p>A selector with no parameters. The observer will be notified when a button press occurs (it will not know if a short or long press has occurred).</p></li>
+<li><p>A selector with one parameter: (SDLButtonName). The observer will be notified when a button press occurs (both a short and long press will trigger the selector, but it will not be able to distinguish between them). It will not be notified of button events.</p></li>
+<li><p>A selector with two parameters: (SDLButtonName, NSError). The observer will be notified when a button press occurs (both a short and long press will trigger the selector, but it will not be able to distinguish between them). It will not be notified of button events.</p></li>
+<li><p>A selector with three parameters: (SDLButtonName, NSError, SDLOnButtonPress). The observer will be notified when a long or short button press occurs (and can distinguish between a short or long press), but will not be notified of individual button events.</p></li>
+<li><p>A selector with four parameters: (SDLButtonName, NSError, SDLOnButtonPress, SDLOnButtonEvent). The observer will be notified when any button press or any button event occurs (and can distinguish between them).</p></li>
+</ol>
+
+<p>To unsubscribe from the hard button, call <code>unsubscribeButton:withObserver:withCompletionHandler:</code>.</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">subscribeButton</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">)</span><span class="nv">buttonName</span>
+ <span class="nf">withObserver</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">id</span><span class="o">&lt;</span><span class="n">NSObject</span><span class="o">&gt;</span><span class="p">)</span><span class="nv">observer</span>
+ <span class="nf">selector</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">SEL</span><span class="p">)</span><span class="nv">selector</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">subscribeButton</span><span class="p">(</span><span class="n">_</span> <span class="nv">buttonName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">,</span> <span class="n">withObserver</span> <span class="nv">observer</span><span class="p">:</span> <span class="kt">NSObjectProtocol</span><span class="p">,</span> <span class="nv">selector</span><span class="p">:</span> <span class="kt">Selector</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>buttonName</dt>
+ <dd><p>The name of the hard button to subscribe to</p></dd>
+ <dt>observer</dt>
+ <dd><p>The object that will have <code>selector</code> called whenever the button has been selected</p></dd>
+ <dt>selector</dt>
+ <dd><p>The selector on <code>observer</code> that will be called whenever the button has been selected</p></dd>
+ </dl>
+
+ <h3 id="section--unsubscribeButton:withObserver:withCompletionHandler:">
+ -unsubscribeButton:withObserver:withCompletionHandler:
+ </h3>
+
+ <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>
+
+
+
+ <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">unsubscribeButton</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">)</span><span class="nv">buttonName</span>
+ <span class="nf">withObserver</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">id</span><span class="o">&lt;</span><span class="n">NSObject</span><span class="o">&gt;</span><span class="p">)</span><span class="nv">observer</span>
+ <span class="nf">withCompletionHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">)</span><span class="nv">completionHandler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">unsubscribeButton</span><span class="p">(</span><span class="n">_</span> <span class="nv">buttonName</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName">SDLButtonName</a></span><span class="p">,</span> <span class="n">withObserver</span> <span class="nv">observer</span><span class="p">:</span> <span class="kt">NSObjectProtocol</span><span class="p">,</span> <span class="n">withCompletionHandler</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>buttonName</dt>
+ <dd><p>The name of the hard button to subscribe to</p></dd>
+ <dt>observer</dt>
+ <dd><p>The object that will be unsubscribed. If a block was subscribed, the return value should be passed. If a selector was subscribed, the observer object should be passed</p></dd>
+ <dt>completionHandler</dt>
+ <dd><p>A handler called when the observer has been unsubscribed to the hard button</p></dd>
+ </dl>
+
<h3 id="section--preloadChoices:withCompletionHandler:">
-preloadChoices:withCompletionHandler:
</h3>
diff --git a/docs/Classes/SDLStreamingMediaManager.html b/docs/Classes/SDLStreamingMediaManager.html
index 56947da94..35a10d2c5 100644
--- a/docs/Classes/SDLStreamingMediaManager.html
+++ b/docs/Classes/SDLStreamingMediaManager.html
@@ -22,13 +22,13 @@
<li><a href="#section--init">-init</a></li>
<li><a href="#section--initWithConnectionManager:configuration:">-initWithConnectionManager:configuration:</a></li>
<li><a href="#section--initWithConnectionManager:configuration:systemCapabilityManager:">-initWithConnectionManager:configuration:systemCapabilityManager:</a></li>
+ <li><a href="#section--startWithProtocol:">-startWithProtocol:</a></li>
<li><a href="#section--stop">-stop</a></li>
<li><a href="#section--stopAudio">-stopAudio</a></li>
<li><a href="#section--stopVideo">-stopVideo</a></li>
<li><a href="#section--sendVideoData:">-sendVideoData:</a></li>
<li><a href="#section--sendVideoData:presentationTimestamp:">-sendVideoData:presentationTimestamp:</a></li>
<li><a href="#section--sendAudioData:">-sendAudioData:</a></li>
- <li><a href="#section--startWithProtocol:">-startWithProtocol:</a></li>
<li><a href="#section--startAudioWithProtocol:">-startAudioWithProtocol:</a></li>
<li><a href="#section--startVideoWithProtocol:">-startVideoWithProtocol:</a></li>
</ul>
@@ -412,6 +412,24 @@
<dd><p>The system capability manager object for reading window capabilities</p></dd>
</dl>
+ <h3 id="section--startWithProtocol:">
+ -startWithProtocol:
+ </h3>
+
+ <p>Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on <code><a href="../Classes/SDLManager.html">SDLManager</a></code>.</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">startWithProtocol</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">SDLProtocol</span> <span class="o">*</span><span class="p">)</span><span class="nv">protocol</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">(</span><span class="n">with</span> <span class="nv">protocol</span><span class="p">:</span> <span class="kt">SDLProtocol</span><span class="p">)</span></code></pre>
+
+
+
+
<h3 id="section--stop">
-stop
</h3>
@@ -552,24 +570,6 @@
<p>Whether or not the data was successfully sent.</p>
</div>
- <h3 id="section--startWithProtocol:">
- -startWithProtocol:
- </h3>
-
- <p>Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on <code><a href="../Classes/SDLManager.html">SDLManager</a></code>.</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">startWithProtocol</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">SDLProtocol</span> <span class="o">*</span><span class="p">)</span><span class="nv">protocol</span><span class="p">;</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">(</span><span class="n">with</span> <span class="nv">protocol</span><span class="p">:</span> <span class="kt">SDLProtocol</span><span class="p">)</span></code></pre>
-
-
-
-
<h3 id="section--startAudioWithProtocol:">
-startAudioWithProtocol:
</h3>
diff --git a/docs/Classes/SDLTouchEvent.html b/docs/Classes/SDLTouchEvent.html
index c969d498a..bda2ce7f3 100644
--- a/docs/Classes/SDLTouchEvent.html
+++ b/docs/Classes/SDLTouchEvent.html
@@ -55,11 +55,11 @@
<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">NSArray</span><span class="o">&lt;</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">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">timeStamp</span><span class="p">;</span></code></pre>
+ <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">NSArray</span><span class="o">&lt;</span><span class="n">NSNumber</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">timeStamp</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">timeStamp</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="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">var</span> <span class="nv">timeStamp</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSNumber</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>
diff --git a/docs/Classes/SDLTouchManager.html b/docs/Classes/SDLTouchManager.html
index c43168c61..8ca1f3626 100644
--- a/docs/Classes/SDLTouchManager.html
+++ b/docs/Classes/SDLTouchManager.html
@@ -43,8 +43,7 @@
touchEventHandler
</h3>
- <p>@abstract
- Returns all OnTouchEvent notifications as SDLTouch and SDLTouchType objects.</p>
+ <p>Returns all OnTouchEvent notifications as SDLTouch and SDLTouchType objects.</p>
@@ -63,11 +62,8 @@
</h3>
<p>Distance between two taps on the screen, in the head unit&rsquo;s coordinate system, used for registering double-tap callbacks.</p>
-<div class="aside aside-note">
- <p class="aside-title">Note</p>
- Defaults to 50 px.
-</div>
+<p>Defaults to 50 px.</p>
@@ -86,11 +82,8 @@
</h3>
<p>Minimum distance for a pan gesture in the head unit&rsquo;s coordinate system, used for registering pan callbacks.</p>
-<div class="aside aside-note">
- <p class="aside-title">Note</p>
- Defaults to 8 px.
-</div>
+<p>Defaults to 8 px.</p>
@@ -108,10 +101,9 @@
tapTimeThreshold
</h3>
- <p>@abstract
- Time (in seconds) between tap events to register a double-tap callback.
-@remark
- Default is 0.4 seconds.</p>
+ <p>Time (in seconds) between tap events to register a double-tap callback. This must be greater than 0.0.</p>
+
+<p>Default is 0.4 seconds.</p>
@@ -129,11 +121,9 @@
movementTimeThreshold
</h3>
- <p>@abstract
- Time (in seconds) between movement events to register panning or pinching
- callbacks.
-@remark
- Default is 0.05 seconds.</p>
+ <p>Time (in seconds) between movement events to register panning or pinching callbacks.</p>
+
+<p>Default is 0.05 seconds.</p>
@@ -169,11 +159,9 @@
touchEnabled
</h3>
- <p>@abstract
- Boolean denoting whether or not the touch manager should deliver touch event
- callbacks.
-@remark
- Default is true.</p>
+ <p>Boolean denoting whether or not the touch manager should deliver touch event callbacks.</p>
+
+<p>Default is true.</p>
@@ -192,10 +180,9 @@
-cancelPendingTouches
</h3>
- <p>@abstract
- Cancels pending touch event timers that may be in progress.
-@remark
- Currently only impacts the timer used to register single taps.</p>
+ <p>Cancels pending touch event timers that may be in progress.</p>
+
+<p>Currently only impacts the timer used to register single taps.</p>
diff --git a/docs/Constants.html b/docs/Constants.html
index 8640963bf..ec0037d77 100644
--- a/docs/Constants.html
+++ b/docs/Constants.html
@@ -38,7 +38,6 @@
<li><a href="#section-SDLAppServiceTypeMedia">SDLAppServiceTypeMedia</a></li>
<li><a href="#section-SDLAppServiceTypeWeather">SDLAppServiceTypeWeather</a></li>
<li><a href="#section-SDLAppServiceTypeNavigation">SDLAppServiceTypeNavigation</a></li>
- <li><a href="#section-SDLErrorDomainAudioStreamManager">SDLErrorDomainAudioStreamManager</a></li>
<li><a href="#section-SDLAudioStreamingIndicatorPlayPause">SDLAudioStreamingIndicatorPlayPause</a></li>
<li><a href="#section-SDLAudioStreamingIndicatorPlay">SDLAudioStreamingIndicatorPlay</a></li>
<li><a href="#section-SDLAudioStreamingIndicatorPause">SDLAudioStreamingIndicatorPause</a></li>
@@ -419,10 +418,14 @@
<li><a href="#section-SDLTransportDidDisconnect">SDLTransportDidDisconnect</a></li>
<li><a href="#section-SDLTransportDidConnect">SDLTransportDidConnect</a></li>
<li><a href="#section-SDLTransportConnectError">SDLTransportConnectError</a></li>
+ <li><a href="#section-SDLRPCServiceDidDisconnect">SDLRPCServiceDidDisconnect</a></li>
+ <li><a href="#section-SDLRPCServiceDidConnect">SDLRPCServiceDidConnect</a></li>
+ <li><a href="#section-SDLRPCServiceConnectionDidError">SDLRPCServiceConnectionDidError</a></li>
<li><a href="#section-SDLDidReceiveError">SDLDidReceiveError</a></li>
<li><a href="#section-SDLDidReceiveLockScreenIcon">SDLDidReceiveLockScreenIcon</a></li>
<li><a href="#section-SDLDidBecomeReady">SDLDidBecomeReady</a></li>
<li><a href="#section-SDLDidUpdateProjectionView">SDLDidUpdateProjectionView</a></li>
+ <li><a href="#section-SDLDidChangeLockScreenStatusNotification">SDLDidChangeLockScreenStatusNotification</a></li>
<li><a href="#section-SDLDidReceiveAddCommandResponse">SDLDidReceiveAddCommandResponse</a></li>
<li><a href="#section-SDLDidReceiveAddSubMenuResponse">SDLDidReceiveAddSubMenuResponse</a></li>
<li><a href="#section-SDLDidReceiveAlertResponse">SDLDidReceiveAlertResponse</a></li>
@@ -480,6 +483,7 @@
<li><a href="#section-SDLDidReceiveSubscribeVehicleDataResponse">SDLDidReceiveSubscribeVehicleDataResponse</a></li>
<li><a href="#section-SDLDidReceiveSubscribeWaypointsResponse">SDLDidReceiveSubscribeWaypointsResponse</a></li>
<li><a href="#section-SDLDidReceiveSyncPDataResponse">SDLDidReceiveSyncPDataResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSystemRequestResponse">SDLDidReceiveSystemRequestResponse</a></li>
<li><a href="#section-SDLDidReceiveUpdateTurnListResponse">SDLDidReceiveUpdateTurnListResponse</a></li>
<li><a href="#section-SDLDidReceiveUnpublishAppServiceResponse">SDLDidReceiveUnpublishAppServiceResponse</a></li>
<li><a href="#section-SDLDidReceiveUnregisterAppInterfaceResponse">SDLDidReceiveUnregisterAppInterfaceResponse</a></li>
@@ -561,7 +565,6 @@
<li><a href="#section-SDLDidReceiveInteriorVehicleDataNotification">SDLDidReceiveInteriorVehicleDataNotification</a></li>
<li><a href="#section-SDLDidReceiveKeyboardInputNotification">SDLDidReceiveKeyboardInputNotification</a></li>
<li><a href="#section-SDLDidChangeLanguageNotification">SDLDidChangeLanguageNotification</a></li>
- <li><a href="#section-SDLDidChangeLockScreenStatusNotification">SDLDidChangeLockScreenStatusNotification</a></li>
<li><a href="#section-SDLDidReceiveNewHashNotification">SDLDidReceiveNewHashNotification</a></li>
<li><a href="#section-SDLDidReceiveVehicleIconNotification">SDLDidReceiveVehicleIconNotification</a></li>
<li><a href="#section-SDLDidChangePermissionsNotification">SDLDidChangePermissionsNotification</a></li>
@@ -731,6 +734,9 @@
<li><a href="#section-SDLRPCFunctionNameUpdateTurnList">SDLRPCFunctionNameUpdateTurnList</a></li>
<li><a href="#section-SDLRPCFunctionNameCreateWindow">SDLRPCFunctionNameCreateWindow</a></li>
<li><a href="#section-SDLRPCFunctionNameDeleteWindow">SDLRPCFunctionNameDeleteWindow</a></li>
+ <li><a href="#section-SDLRPCMessageTypeNameRequest">SDLRPCMessageTypeNameRequest</a></li>
+ <li><a href="#section-SDLRPCMessageTypeNameResponse">SDLRPCMessageTypeNameResponse</a></li>
+ <li><a href="#section-SDLRPCMessageTypeNameNotification">SDLRPCMessageTypeNameNotification</a></li>
<li><a href="#section-SDLRadioBandAM">SDLRadioBandAM</a></li>
<li><a href="#section-SDLRadioBandFM">SDLRadioBandFM</a></li>
<li><a href="#section-SDLRadioBandXM">SDLRadioBandXM</a></li>
@@ -1859,24 +1865,6 @@
- <h3 id="section-SDLErrorDomainAudioStreamManager">
- SDLErrorDomainAudioStreamManager
- </h3>
-
- <p>Error relates to AudioStreamManager</p>
-
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n">NSString</span> <span class="o">*</span><span class="k">const</span> <span class="n">_Nonnull</span> <span class="n">SDLErrorDomainAudioStreamManager</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLErrorDomainAudioStreamManager</span><span class="p">:</span> <span class="kt">String</span></code></pre>
-
-
-
-
<h3 id="section-SDLAudioStreamingIndicatorPlayPause">
SDLAudioStreamingIndicatorPlayPause
</h3>
@@ -8830,6 +8818,60 @@ For example, right puddle lights and spot lights.</p>
+ <h3 id="section-SDLRPCServiceDidDisconnect">
+ SDLRPCServiceDidDisconnect
+ </h3>
+
+ <p>Name for a disconnection notification</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:SDLNotificationConstants.h@T@SDLNotificationName">SDLNotificationName</a></span> <span class="n">_Nonnull</span> <span class="n">SDLRPCServiceDidDisconnect</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLRPCServiceDidDisconnect</span><span class="p">:</span> <span class="kt">NSNotification</span><span class="o">.</span><span class="kt">Name</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLRPCServiceDidConnect">
+ SDLRPCServiceDidConnect
+ </h3>
+
+ <p>Name for a connection notification</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:SDLNotificationConstants.h@T@SDLNotificationName">SDLNotificationName</a></span> <span class="n">_Nonnull</span> <span class="n">SDLRPCServiceDidConnect</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLRPCServiceDidConnect</span><span class="p">:</span> <span class="kt">NSNotification</span><span class="o">.</span><span class="kt">Name</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLRPCServiceConnectionDidError">
+ SDLRPCServiceConnectionDidError
+ </h3>
+
+ <p>Name for a error during connection notification</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:SDLNotificationConstants.h@T@SDLNotificationName">SDLNotificationName</a></span> <span class="n">_Nonnull</span> <span class="n">SDLRPCServiceConnectionDidError</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLRPCServiceConnectionDidError</span><span class="p">:</span> <span class="kt">NSNotification</span><span class="o">.</span><span class="kt">Name</span></code></pre>
+
+
+
+
<h3 id="section-SDLDidReceiveError">
SDLDidReceiveError
</h3>
@@ -8902,6 +8944,26 @@ For example, right puddle lights and spot lights.</p>
+ <h3 id="section-SDLDidChangeLockScreenStatusNotification">
+ SDLDidChangeLockScreenStatusNotification
+ </h3>
+
+ <p>Name for a LockScreenStatus notification RPC</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n">__deprecated_msg</span><span class="p">(</span>
+ <span class="s">"This will be replaced in a future version where a fake RPC is not sent"</span><span class="p">)</span>
+ <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName">SDLNotificationName</a></span> <span class="n">SDLDidChangeLockScreenStatusNotification</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">SDLDidChangeLockScreenStatus</span><span class="p">:</span> <span class="kt">NSNotification</span><span class="o">.</span><span class="kt">Name</span></code></pre>
+
+
+
+
<h3 id="section-SDLDidReceiveAddCommandResponse">
SDLDidReceiveAddCommandResponse
</h3>
@@ -9929,6 +9991,24 @@ For example, right puddle lights and spot lights.</p>
+ <h3 id="section-SDLDidReceiveSystemRequestResponse">
+ SDLDidReceiveSystemRequestResponse
+ </h3>
+
+ <p>Name for a SystemRequest response 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:SDLNotificationConstants.h@T@SDLNotificationName">SDLNotificationName</a></span> <span class="n">_Nonnull</span> <span class="n">SDLDidReceiveSystemRequestResponse</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLDidReceiveSystemRequestResponse</span><span class="p">:</span> <span class="kt">NSNotification</span><span class="o">.</span><span class="kt">Name</span></code></pre>
+
+
+
+
<h3 id="section-SDLDidReceiveUpdateTurnListResponse">
SDLDidReceiveUpdateTurnListResponse
</h3>
@@ -11320,7 +11400,7 @@ For example, right puddle lights and spot lights.</p>
SDLDidReceiveEncodedDataNotification
</h3>
- <p>Name for a EncodedData notification RPC</p>
+ <p>Name for a EncodedSyncPData notification RPC</p>
@@ -11389,25 +11469,6 @@ For example, right puddle lights and spot lights.</p>
- <h3 id="section-SDLDidChangeLockScreenStatusNotification">
- SDLDidChangeLockScreenStatusNotification
- </h3>
-
- <p>Name for a LockScreenStatus notification RPC</p>
-
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n">__deprecated</span> <span class="k">const</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName">SDLNotificationName</a></span>
- <span class="n">SDLDidChangeLockScreenStatusNotification</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">SDLDidChangeLockScreenStatus</span><span class="p">:</span> <span class="kt">NSNotification</span><span class="o">.</span><span class="kt">Name</span></code></pre>
-
-
-
-
<h3 id="section-SDLDidReceiveNewHashNotification">
SDLDidReceiveNewHashNotification
</h3>
@@ -14456,6 +14517,60 @@ For example, right puddle lights and spot lights.</p>
+ <h3 id="section-SDLRPCMessageTypeNameRequest">
+ SDLRPCMessageTypeNameRequest
+ </h3>
+
+ <p>A request that will require a response</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:SDLRPCMessageType.h@T@SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></span> <span class="n">SDLRPCMessageTypeNameRequest</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">request</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLRPCMessageTypeNameResponse">
+ SDLRPCMessageTypeNameResponse
+ </h3>
+
+ <p>A response to a request</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:SDLRPCMessageType.h@T@SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></span> <span class="n">SDLRPCMessageTypeNameResponse</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">response</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></span></code></pre>
+
+
+
+
+ <h3 id="section-SDLRPCMessageTypeNameNotification">
+ SDLRPCMessageTypeNameNotification
+ </h3>
+
+ <p>A message that does not have a response</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:SDLRPCMessageType.h@T@SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></span> <span class="n">SDLRPCMessageTypeNameNotification</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">static</span> <span class="k">let</span> <span class="nv">SDLRPCMessageTypeName</span><span class="p">:</span> <span class="kt"><a href="Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></span></code></pre>
+
+
+
+
<h3 id="section-SDLRadioBandAM">
SDLRadioBandAM
</h3>
diff --git a/docs/Enums.html b/docs/Enums.html
index 2fa828129..1ccc4f81e 100644
--- a/docs/Enums.html
+++ b/docs/Enums.html
@@ -4,19 +4,20 @@
<ul>
<li><a href="#section-SDLArtworkImageFormat">SDLArtworkImageFormat</a></li>
- <li><a href="#section-SDLAudioStreamManagerError">SDLAudioStreamManagerError</a></li>
<li><a href="#section-SDLChoiceSetLayout">SDLChoiceSetLayout</a></li>
<li><a href="#section-SDLEncryptionLifecycleManagerError">SDLEncryptionLifecycleManagerError</a></li>
<li><a href="#section-SDLManagerError">SDLManagerError</a></li>
<li><a href="#section-SDLFileManagerError">SDLFileManagerError</a></li>
<li><a href="#section-SDLTextAndGraphicManagerError">SDLTextAndGraphicManagerError</a></li>
<li><a href="#section-SDLSoftButtonManagerError">SDLSoftButtonManagerError</a></li>
+ <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-SDLSystemCapabilityManagerError">SDLSystemCapabilityManagerError</a></li>
<li><a href="#section-SDLTransportError">SDLTransportError</a></li>
<li><a href="#section-SDLRPCStoreError">SDLRPCStoreError</a></li>
<li><a href="#section-SDLCacheFileManagerError">SDLCacheFileManagerError</a></li>
+ <li><a href="#section-SDLAudioStreamManagerError">SDLAudioStreamManagerError</a></li>
<li><a href="#section-SDLSecondaryTransports">SDLSecondaryTransports</a></li>
<li><a href="#section-SDLLockScreenConfigurationDisplayMode">SDLLockScreenConfigurationDisplayMode</a></li>
<li><a href="#section-SDLLogBytesDirection">SDLLogBytesDirection</a></li>
@@ -34,6 +35,7 @@
<li><a href="#section-SDLRPCMessageType">SDLRPCMessageType</a></li>
<li><a href="#section-SDLCarWindowRenderingType">SDLCarWindowRenderingType</a></li>
<li><a href="#section-SDLStreamingEncryptionFlag">SDLStreamingEncryptionFlag</a></li>
+ <li><a href="#section-SDLTouchIdentifier">SDLTouchIdentifier</a></li>
</ul>
<h3>Overview</h3>
@@ -61,25 +63,6 @@
- <h3 id="section-SDLAudioStreamManagerError">
- SDLAudioStreamManagerError
- </h3>
-
- <p>AudioStreamManager errors</p>
-
- <a href="Enums/SDLAudioStreamManagerError.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">SDLAudioStreamManagerError</span> <span class="p">{}</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">SDLAudioStreamManagerError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
-
-
-
-
<h3 id="section-SDLChoiceSetLayout">
SDLChoiceSetLayout
</h3>
@@ -179,7 +162,7 @@
SDLSoftButtonManagerError
</h3>
- <p>Errors associated with the ScreenManager class</p>
+ <p>Errors associated with the Soft Button Manager class</p>
<a href="Enums/SDLSoftButtonManagerError.html" class="slightly-smaller">See more</a>
@@ -194,6 +177,25 @@
+ <h3 id="section-SDLSubscribeButtonManagerError">
+ SDLSubscribeButtonManagerError
+ </h3>
+
+ <p>Errors associated with the Subscribe Button Manager class</p>
+
+ <a href="Enums/SDLSubscribeButtonManagerError.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">SDLSubscribeButtonManagerError</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">SDLSubscribeButtonManagerError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
+
+
+
+
<h3 id="section-SDLMenuManagerError">
SDLMenuManagerError
</h3>
@@ -236,17 +238,13 @@
SDLSystemCapabilityManagerError
</h3>
- <p>Undocumented</p>
+ <p>Errors associated with the system capability manager</p>
<a href="Enums/SDLSystemCapabilityManagerError.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="n">NS_ENUM</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">,</span> <span class="n">SDLSystemCapabilityManagerError</span><span class="p">)</span> <span class="p">{</span>
- <span class="n">SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span>
- <span class="n">SDLSystemCapabilityManagerErrorHMINone</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span><span class="p">,</span>
- <span class="n">SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span>
-<span class="p">}</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">enum</span> <span class="n">SDLSystemCapabilityManagerError</span> <span class="p">{}</span></code></pre>
<h4>Swift</h4>
@@ -297,18 +295,13 @@
SDLCacheFileManagerError
</h3>
- <p>Undocumented</p>
+ <p>Errors related to the cache file manager</p>
<a href="Enums/SDLCacheFileManagerError.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="n">NS_ENUM</span><span class="p">(</span><span class="n">NSInteger</span><span class="p">,</span> <span class="n">SDLCacheFileManagerError</span><span class="p">)</span> <span class="p">{</span>
- <span class="cm">/**
- * Failed to update archive file
- */</span>
- <span class="n">SDLCacheManagerErrorUpdateIconArchiveFileFailure</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span>
-<span class="p">}</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">enum</span> <span class="n">SDLCacheFileManagerError</span> <span class="p">{}</span></code></pre>
<h4>Swift</h4>
@@ -317,6 +310,25 @@
+ <h3 id="section-SDLAudioStreamManagerError">
+ SDLAudioStreamManagerError
+ </h3>
+
+ <p>Errors related to the audio stream manager</p>
+
+ <a href="Enums/SDLAudioStreamManagerError.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">SDLAudioStreamManagerError</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">SDLAudioStreamManagerError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
+
+
+
+
<h3 id="section-SDLSecondaryTransports">
SDLSecondaryTransports
</h3>
@@ -646,4 +658,23 @@
+ <h3 id="section-SDLTouchIdentifier">
+ SDLTouchIdentifier
+ </h3>
+
+ <p>Identifies finger touch</p>
+
+ <a href="Enums/SDLTouchIdentifier.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">SDLTouchIdentifier</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">SDLTouchIdentifier</span> <span class="p">:</span> <span class="kt">UInt</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Enums/SDLAudioStreamManagerError.html b/docs/Enums/SDLAudioStreamManagerError.html
index af59570d6..1189964c1 100644
--- a/docs/Enums/SDLAudioStreamManagerError.html
+++ b/docs/Enums/SDLAudioStreamManagerError.html
@@ -9,7 +9,7 @@
<h3>Overview</h3>
-<p>AudioStreamManager errors</p>
+<p>Errors related to the audio stream manager</p>
<section class="section task-group-section">
diff --git a/docs/Enums/SDLCacheFileManagerError.html b/docs/Enums/SDLCacheFileManagerError.html
index 464fb1a14..e5949d4f9 100644
--- a/docs/Enums/SDLCacheFileManagerError.html
+++ b/docs/Enums/SDLCacheFileManagerError.html
@@ -8,7 +8,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>Errors related to the cache file manager</p>
<section class="section task-group-section">
diff --git a/docs/Enums/SDLSoftButtonManagerError.html b/docs/Enums/SDLSoftButtonManagerError.html
index 5d8b06214..1f837568d 100644
--- a/docs/Enums/SDLSoftButtonManagerError.html
+++ b/docs/Enums/SDLSoftButtonManagerError.html
@@ -8,7 +8,7 @@
<h3>Overview</h3>
-<p>Errors associated with the ScreenManager class</p>
+<p>Errors associated with the Soft Button Manager class</p>
<section class="section task-group-section">
diff --git a/docs/Enums/SDLSubscribeButtonManagerError.html b/docs/Enums/SDLSubscribeButtonManagerError.html
new file mode 100644
index 000000000..949a0432b
--- /dev/null
+++ b/docs/Enums/SDLSubscribeButtonManagerError.html
@@ -0,0 +1,33 @@
+<h1>SDLSubscribeButtonManagerError Enumeration Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLSubscribeButtonManagerErrorNotSubscribed">SDLSubscribeButtonManagerErrorNotSubscribed</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Errors associated with the Subscribe Button Manager class</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLSubscribeButtonManagerErrorNotSubscribed">
+ SDLSubscribeButtonManagerErrorNotSubscribed
+ </h3>
+
+ <p>Attempting to unsubscribe to a subscribe button that has not yet been subscribed to yet.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLSubscribeButtonManagerErrorNotSubscribed</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">notSubscribed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLSystemCapabilityManagerError.html b/docs/Enums/SDLSystemCapabilityManagerError.html
index 4ea52a97c..5262f82ac 100644
--- a/docs/Enums/SDLSystemCapabilityManagerError.html
+++ b/docs/Enums/SDLSystemCapabilityManagerError.html
@@ -10,7 +10,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>Errors associated with the system capability manager</p>
<section class="section task-group-section">
@@ -18,7 +18,7 @@
SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities
</h3>
- <p>Undocumented</p>
+ <p>The connected head unit does not support any system capabilities</p>
@@ -36,7 +36,7 @@
SDLSystemCapabilityManagerErrorHMINone
</h3>
- <p>Undocumented</p>
+ <p>You must be in an HMI Level other than NONE to request or subscribe to capabilites other than DISPLAYS</p>
@@ -54,7 +54,7 @@
SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays
</h3>
- <p>Undocumented</p>
+ <p>You may not update the system capability type DISPLAYS because it is always subscribed</p>
diff --git a/docs/Type Definitions/SDLTouchIdentifier/.html b/docs/Enums/SDLTouchIdentifier.html
index af17753af..4e4247cc1 100644
--- a/docs/Type Definitions/SDLTouchIdentifier/.html
+++ b/docs/Enums/SDLTouchIdentifier.html
@@ -1,4 +1,4 @@
-<h1> Enumeration Reference</h1>
+<h1>SDLTouchIdentifier Enumeration Reference</h1>
<h3>Section Contents</h3>
@@ -25,6 +25,9 @@
<pre class="highlight objective_c"><code><span class="n">SDLTouchIdentifierFirstFinger</span> <span class="o">=</span> <span class="mi">0</span></code></pre>
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">firstFinger</span> <span class="o">=</span> <span class="mi">0</span></code></pre>
+
@@ -40,6 +43,9 @@
<pre class="highlight objective_c"><code><span class="n">SDLTouchIdentifierSecondFinger</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">secondFinger</span> <span class="o">=</span> <span class="mi">1</span></code></pre>
+
diff --git a/docs/Protocols/SDLManagerDelegate.html b/docs/Protocols/SDLManagerDelegate.html
index 3e783b49f..893450d6a 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:">-managerShouldUpdateLifecycleToLanguage:</a></li>
+ <li><a href="#section--managerShouldUpdateLifecycleToLanguage:hmiLanguage:">-managerShouldUpdateLifecycleToLanguage:hmiLanguage:</a></li>
</ul>
<h3>Overview</h3>
@@ -169,4 +170,35 @@
<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--managerShouldUpdateLifecycleToLanguage:hmiLanguage:">
+ -managerShouldUpdateLifecycleToLanguage:hmiLanguage:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Classes/SDLLifecycleConfigurationUpdate.html">SDLLifecycleConfigurationUpdate</a></span> <span class="o">*</span><span class="p">)</span>
+ <span class="nf">managerShouldUpdateLifecycleToLanguage</span><span class="p">:(</span><span class="n">nonnull</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">hmiLanguage</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage">SDLLanguage</a></span><span class="p">)</span><span class="nv">hmiLanguage</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">managerShouldUpdateLifecycle</span><span class="p">(</span><span class="n">toLanguage</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">hmiLanguage</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="o">-&gt;</span> <span class="kt"><a href="../Classes/SDLLifecycleConfigurationUpdate.html">SDLLifecycleConfigurationUpdate</a></span><span class="p">?</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>language</dt>
+ <dd><p>The VR+TTS language of the connected head unit the manager is trying to update the configuration.</p></dd>
+ <dt>hmiLanguage</dt>
+ <dd><p>The HMI display language of the connected head unit the manager is trying to update the configuration.</p></dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An object of SDLLifecycleConfigurationUpdate if the head unit language is supported, otherwise nil to indicate that the language is not supported.</p>
+ </div>
+
</section>
diff --git a/docs/Type Definitions.html b/docs/Type Definitions.html
index 4de8845bc..2e1e1fa22 100644
--- a/docs/Type Definitions.html
+++ b/docs/Type Definitions.html
@@ -95,6 +95,7 @@
<li><a href="#section-SDLPermissionRPCName">SDLPermissionRPCName</a></li>
<li><a href="#section-SDLPermissionObserverIdentifier">SDLPermissionObserverIdentifier</a></li>
<li><a href="#section-SDLPermissionsChangedHandler">SDLPermissionsChangedHandler</a></li>
+ <li><a href="#section-SDLRPCPermissionStatusChangedHandler">SDLRPCPermissionStatusChangedHandler</a></li>
<li><a href="#section-SDLPermissionStatus">SDLPermissionStatus</a></li>
<li><a href="#section-SDLPowerModeQualificationStatus">SDLPowerModeQualificationStatus</a></li>
<li><a href="#section-SDLPowerModeStatus">SDLPowerModeStatus</a></li>
@@ -102,6 +103,7 @@
<li><a href="#section-SDLPrerecordedSpeech">SDLPrerecordedSpeech</a></li>
<li><a href="#section-SDLPrimaryAudioSource">SDLPrimaryAudioSource</a></li>
<li><a href="#section-SDLRPCFunctionName">SDLRPCFunctionName</a></li>
+ <li><a href="#section-SDLRPCMessageTypeName">SDLRPCMessageTypeName</a></li>
<li><a href="#section-SDLRadioBand">SDLRadioBand</a></li>
<li><a href="#section-SDLRadioState">SDLRadioState</a></li>
<li><a href="#section-SDLRequestType">SDLRequestType</a></li>
@@ -109,6 +111,7 @@
<li><a href="#section-SDLSamplingRate">SDLSamplingRate</a></li>
<li><a href="#section-SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></li>
<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-SDLServiceUpdateReason">SDLServiceUpdateReason</a></li>
<li><a href="#section-SDLSoftButtonType">SDLSoftButtonType</a></li>
@@ -130,7 +133,6 @@
<li><a href="#section-SDLTextAlignment">SDLTextAlignment</a></li>
<li><a href="#section-SDLTextFieldName">SDLTextFieldName</a></li>
<li><a href="#section-SDLTimerMode">SDLTimerMode</a></li>
- <li><a href="#section-SDLTouchIdentifier">SDLTouchIdentifier</a></li>
<li><a href="#section-SDLTouchEventHandler">SDLTouchEventHandler</a></li>
<li><a href="#section-SDLTouchType">SDLTouchType</a></li>
<li><a href="#section-SDLTriggerSource">SDLTriggerSource</a></li>
@@ -2126,7 +2128,7 @@ c = character <br></p>
SDLPermissionsChangedHandler
</h3>
- <p>The PermissionObserver is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>
+ <p>This is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>
@@ -2143,10 +2145,37 @@ c = character <br></p>
<h4>Parameters</h4>
<dl>
- <dt>change</dt>
- <dd><p>A dictionary of permission changes containing <key(String): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed></p></dd>
+ <dt>updatedPermissionStatuses</dt>
+ <dd><p>A dictionary of the new current status of all subscription items; containing <key(String): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed></p></dd>
<dt>status</dt>
- <dd><p>The change made to all of the RPCs in the changedDict. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed</p></dd>
+ <dd><p>The unified group status of the RPCs in the updatedPermissionStatuses dictionary. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed</p></dd>
+ </dl>
+
+ <h3 id="section-SDLRPCPermissionStatusChangedHandler">
+ SDLRPCPermissionStatusChangedHandler
+ </h3>
+
+ <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>
+
+
+
+ <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">SDLRPCPermissionStatusChangedHandler</span><span class="p">)(</span>
+ <span class="n">NSDictionary</span><span class="o">&lt;</span><span class="n"><a href="Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span><span class="p">,</span> <span class="n"><a href="Classes/SDLRPCPermissionStatus.html">SDLRPCPermissionStatus</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span><span class="p">,</span>
+ <span class="n"><a href="Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span><span class="p">)</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">typealias</span> <span class="kt">SDLRPCPermissionStatusChangedHandler</span> <span class="o">=</span> <span class="p">([</span><span class="kt"><a href="Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName">SDLRPCFunctionName</a></span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCPermissionStatus.html">SDLRPCPermissionStatus</a></span><span class="p">],</span> <span class="kt"><a href="Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Void</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>updatedPermissionStatuses</dt>
+ <dd><p>A dictionary of the new current status of all subscription items; containing <key(String): SDLPermissionRPCName, object(SDLRPCPermissionStatus)></p></dd>
+ <dt>status</dt>
+ <dd><p>The unified group status of the RPCs in the updatedPermissionStatuses dictionary. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed</p></dd>
</dl>
<h3 id="section-SDLPermissionStatus">
@@ -2279,6 +2308,24 @@ c = character <br></p>
+ <h3 id="section-SDLRPCMessageTypeName">
+ SDLRPCMessageTypeName
+ </h3>
+
+ <p>A type of RPC message</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">SDLRPCMessageTypeName</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">struct</span> <span class="kt">SDLRPCMessageTypeName</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-SDLRadioBand">
SDLRadioBand
</h3>
@@ -2419,6 +2466,35 @@ c = character <br></p>
<dd><p>The error if one occurred</p></dd>
</dl>
+ <h3 id="section-SDLSubscribeButtonHandler">
+ SDLSubscribeButtonHandler
+ </h3>
+
+ <p>A handler run when the subscribe button has been selected</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">SDLSubscribeButtonHandler</span><span class="p">)(</span><span class="n"><a href="Classes/SDLOnButtonPress.html">SDLOnButtonPress</a></span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">,</span>
+ <span class="n"><a href="Classes/SDLOnButtonEvent.html">SDLOnButtonEvent</a></span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">,</span>
+ <span class="n">NSError</span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">)</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">typealias</span> <span class="kt">SDLSubscribeButtonHandler</span> <span class="o">=</span> <span class="p">(</span><span class="kt"><a href="Classes/SDLOnButtonPress.html">SDLOnButtonPress</a></span><span class="p">?,</span> <span class="kt"><a href="Classes/SDLOnButtonEvent.html">SDLOnButtonEvent</a></span><span class="p">?,</span> <span class="kt">Error</span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Void</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>buttonPress</dt>
+ <dd><p>Indicates whether this is a long or short button press event</p></dd>
+ <dt>buttonEvent</dt>
+ <dd><p>Indicates that the button has been depressed or released</p></dd>
+ <dt>error</dt>
+ <dd><p>The error if one occurred</p></dd>
+ </dl>
+
<h3 id="section-SDLSeatMemoryActionType">
SDLSeatMemoryActionType
</h3>
@@ -2826,22 +2902,6 @@ c = character <br></p>
- <h3 id="section-SDLTouchIdentifier">
- SDLTouchIdentifier
- </h3>
-
- <p>Undocumented</p>
-
- <a href="Type%20Definitions/SDLTouchIdentifier.html" class="slightly-smaller">See more</a>
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">typedef</span> <span class="k">enum</span> <span class="n">SDLTouchIdentifier</span> <span class="n">SDLTouchIdentifier</span></code></pre>
-
-
-
-
-
<h3 id="section-SDLTouchEventHandler">
SDLTouchEventHandler
</h3>
diff --git a/docs/Type Definitions/SDLTouchIdentifier.html b/docs/Type Definitions/SDLTouchIdentifier.html
deleted file mode 100644
index 17e1e5c6f..000000000
--- a/docs/Type Definitions/SDLTouchIdentifier.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<h1>SDLTouchIdentifier Type Definition Reference</h1>
-
-<h3>Section Contents</h3>
-
-<ul>
- <li><a href="#section-"></a></li>
-</ul>
-
-<h3>Overview</h3>
-
-<p>Undocumented</p>
-
-
-<section class="section task-group-section">
- <h3 id="section-">
-
- </h3>
-
- <p>Identifies finger touch</p>
-
- <a href="../Type%20Definitions/SDLTouchIdentifier/.html" class="slightly-smaller">See more</a>
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">enum</span> <span class="p">{}</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">struct</span> <span class="kt"><a href="../Type%20Definitions/SDLTouchIdentifier.html">SDLTouchIdentifier</a></span> <span class="p">:</span> <span class="kt">Equatable</span><span class="p">,</span> <span class="kt">RawRepresentable</span></code></pre>
-
-
-
-
-</section>
diff --git a/docs/badge.svg b/docs/badge.svg
index bfac05268..a096feca8 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="128" height="20">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="136" 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="128" height="20" rx="3" fill="#fff"/>
+ <rect width="136" height="20" rx="3" fill="#fff"/>
</clipPath>
<g clip-path="url(#a)">
<path fill="#555" d="M0 0h93v20H0z"/>
- <path fill="#4c1" d="M93 0h35v20H93z"/>
- <path fill="url(#b)" d="M0 0h128v20H0z"/>
+ <path fill="#4c1" d="M93 0h43v20H93z"/>
+ <path fill="url(#b)" d="M0 0h136v20H0z"/>
</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="1095" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="250">
- 99%
+ <text x="1135" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="330">
+ 100%
</text>
- <text x="1095" y="140" transform="scale(.1)" textLength="250">
- 99%
+ <text x="1135" y="140" transform="scale(.1)" textLength="330">
+ 100%
</text>
</g>
</svg>
diff --git a/docs/index.html b/docs/index.html
index 8e4b2b0cd..1c1ba65a7 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -358,6 +358,8 @@
url: Classes/SDLPerformInteraction.html
- name: SDLPerformInteractionResponse
url: Classes/SDLPerformInteractionResponse.html
+ - name: SDLPermissionElement
+ url: Classes/SDLPermissionElement.html
- name: SDLPermissionItem
url: Classes/SDLPermissionItem.html
- name: SDLPermissionManager
@@ -386,6 +388,8 @@
url: Classes.html#/c:objc(cs)SDLRPCNotification
- name: SDLRPCNotificationNotification
url: Classes/SDLRPCNotificationNotification.html
+ - name: SDLRPCPermissionStatus
+ url: Classes/SDLRPCPermissionStatus.html
- name: SDLRPCRequest
url: Classes/SDLRPCRequest.html
- name: SDLRPCRequestNotification
@@ -1172,6 +1176,8 @@
url: Constants.html#/c:@SDLDidReceiveSystemRequestNotification
- name: SDLDidReceiveSystemRequestRequest
url: Constants.html#/c:@SDLDidReceiveSystemRequestRequest
+ - name: SDLDidReceiveSystemRequestResponse
+ url: Constants.html#/c:@SDLDidReceiveSystemRequestResponse
- name: SDLDidReceiveTouchEventNotification
url: Constants.html#/c:@SDLDidReceiveTouchEventNotification
- name: SDLDidReceiveUnpublishAppServiceRequest
@@ -1290,8 +1296,6 @@
url: Constants.html#/c:@SDLEmergencyEventTypeRollover
- name: SDLEmergencyEventTypeSide
url: Constants.html#/c:@SDLEmergencyEventTypeSide
- - name: SDLErrorDomainAudioStreamManager
- url: Constants.html#/c:@SDLErrorDomainAudioStreamManager
- name: SDLFileTypeAAC
url: Constants.html#/c:@SDLFileTypeAAC
- name: SDLFileTypeBMP
@@ -2086,6 +2090,18 @@
url: Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints
- name: SDLRPCFunctionNameUpdateTurnList
url: Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList
+ - name: SDLRPCMessageTypeNameNotification
+ url: Constants.html#/c:@SDLRPCMessageTypeNameNotification
+ - name: SDLRPCMessageTypeNameRequest
+ url: Constants.html#/c:@SDLRPCMessageTypeNameRequest
+ - name: SDLRPCMessageTypeNameResponse
+ url: Constants.html#/c:@SDLRPCMessageTypeNameResponse
+ - name: SDLRPCServiceConnectionDidError
+ url: Constants.html#/c:@SDLRPCServiceConnectionDidError
+ - name: SDLRPCServiceDidConnect
+ url: Constants.html#/c:@SDLRPCServiceDidConnect
+ - name: SDLRPCServiceDidDisconnect
+ url: Constants.html#/c:@SDLRPCServiceDidDisconnect
- name: SDLRadioBandAM
url: Constants.html#/c:@SDLRadioBandAM
- name: SDLRadioBandFM
@@ -3070,10 +3086,14 @@
url: Enums/SDLSoftButtonManagerError.html
- name: SDLStreamingEncryptionFlag
url: Enums/SDLStreamingEncryptionFlag.html
+ - name: SDLSubscribeButtonManagerError
+ url: Enums/SDLSubscribeButtonManagerError.html
- name: SDLSystemCapabilityManagerError
url: Enums/SDLSystemCapabilityManagerError.html
- name: SDLTextAndGraphicManagerError
url: Enums/SDLTextAndGraphicManagerError.html
+ - name: SDLTouchIdentifier
+ url: Enums/SDLTouchIdentifier.html
- name: SDLTransportError
url: Enums/SDLTransportError.html
- name: Protocols
@@ -3310,6 +3330,10 @@
url: Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler
- name: SDLRPCFunctionName
url: Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName
+ - name: SDLRPCMessageTypeName
+ url: Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName
+ - name: SDLRPCPermissionStatusChangedHandler
+ url: Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler
- name: SDLRPCUpdatedBlock
url: Type%20Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock
- name: SDLRadioBand
@@ -3336,6 +3360,8 @@
url: Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities
- name: SDLStaticIconName
url: Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName
+ - name: SDLSubscribeButtonHandler
+ url: Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler
- name: SDLSupportedSeat
url: Type%20Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat
- name: SDLSystemAction
@@ -3358,8 +3384,6 @@
url: Type%20Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode
- name: SDLTouchEventHandler
url: Type%20Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler
- - name: SDLTouchIdentifier
- url: Type%20Definitions/SDLTouchIdentifier.html
- name: SDLTouchType
url: Type%20Definitions.html#/c:SDLTouchType.h@T@SDLTouchType
- name: SDLTriggerSource
diff --git a/docs/search.json b/docs/search.json
index a1136060f..474ab899d 100644
--- a/docs/search.json
+++ b/docs/search.json
@@ -1 +1 @@
-{"Type%20Definitions/SDLTouchIdentifier/.html#/c:@EA@SDLTouchIdentifier@SDLTouchIdentifierFirstFinger":{"name":"SDLTouchIdentifierFirstFinger","abstract":"<p>Touch was first finger</p>"},"Type%20Definitions/SDLTouchIdentifier/.html#/c:@EA@SDLTouchIdentifier@SDLTouchIdentifierSecondFinger":{"name":"SDLTouchIdentifierSecondFinger","abstract":"<p>Touch was second finger</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: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: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>Character sets supported by SDL. Used to describe text field capabilities.</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: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 filed. 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:SDLLockScreenStatus.h@T@SDLLockScreenStatus":{"name":"SDLLockScreenStatus","abstract":"<p>Describes what the status of the lock screen should be</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>The PermissionObserver 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: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: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: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/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"<p>Undocumented</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: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:":{"name":"-managerShouldUpdateLifecycleToLanguage:","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:completionHandler:":{"name":"-updateAutocompleteWithInput:completionHandler:","abstract":"<p>Implement this if you wish to update the KeyboardProperties.autoCompleteText 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)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/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/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>Undocumented</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorHMINone":{"name":"SDLSystemCapabilityManagerErrorHMINone","abstract":"<p>Undocumented</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays":{"name":"SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays","abstract":"<p>Undocumented</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/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/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/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/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"<p>AudioStreamManager errors</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 ScreenManager 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>Undocumented</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>Undocumented</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>"},"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:@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:@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:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"<p>Error relates to AudioStreamManager</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:@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>Character Set Type 2</p>"},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"<p>Character Set Type 5</p>"},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"<p>Character Set CID1</p>"},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"<p>Character Set CID2</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:@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:@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:@SDLLockScreenStatusOff":{"name":"SDLLockScreenStatusOff","abstract":"<p>LockScreen is Not Required</p>"},"Constants.html#/c:@SDLLockScreenStatusOptional":{"name":"SDLLockScreenStatusOptional","abstract":"<p>LockScreen is Optional</p>"},"Constants.html#/c:@SDLLockScreenStatusRequired":{"name":"SDLLockScreenStatusRequired","abstract":"<p>LockScreen is Required</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:@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:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"<p>Name for a SyncPData 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 ubscribeWayPoints 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 EncodedData 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:@SDLDidChangeLockScreenStatusNotification":{"name":"SDLDidChangeLockScreenStatusNotification","abstract":"<p>Name for a LockScreenStatus 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:@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:@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:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"<p>Second gear</p>"},"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:@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:@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:@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:@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:@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:@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:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</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:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</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:@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:@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:@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:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"<p>GPS vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"<p>Vehicle speed data</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:@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:@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/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/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:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:","abstract":"<p>Convenience init for creating a video streaming capability.</p>","parent_name":"SDLVideoStreamingCapability"},"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)initWithSyncMsgVersion:":{"name":"-initWithSyncMsgVersion:","abstract":"<p>Deprecated convenience init to set version using SDLSyncMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSyncMsgVersion:":{"name":"+versionWithSyncMsgVersion:","abstract":"<p>Deprecated convenience init to set version using SDLSyncMsgVersion</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(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>The result of requesting to unsubscribe to the PRNDL status.</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)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)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)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:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure: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)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation: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: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)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(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>If true, unsubscribes from PRNDL</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)wiperStatus":{"name":"wiperStatus","abstract":"<p>If true, unsubscribes from Wiper Status</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)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>@abstract","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>@abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)movementTimeThreshold":{"name":"movementTimeThreshold","abstract":"<p>@abstract","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 and <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)movementTimeThreshold\">movementTimeThreshold</a></code> will be used. Defaults to YES.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"<p>@abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"<p>@abstract","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:":{"name":"-initWithHitTester:","abstract":"<p>Initialize a touch manager with a hit tester if available</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 character set that is supported in this field.</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)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:withBlock:":{"name":"-subscribeToCapabilityType:withBlock:","abstract":"<p>Subscribe to a particular capability type using a block callback.</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(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/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"<p>Convenience init to describe the SDL version</p>","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"<p>The major version indicates versions that is not-compatible to previous versions</p>","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(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":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"<p>Allows backward-compatible fixes to the API without increasing the minor version of the interface</p>","parent_name":"SDLSyncMsgVersion"},"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>The result of requesting to subscribe to the PRNDL status.</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)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)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)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:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure: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)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation: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: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)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(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>A boolean value. If true, subscribes PRNDL data.</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)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)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)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:":{"name":"-initWithConnectionManager:configuration:","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)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)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/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)startAudioWithProtocol:":{"name":"-startAudioWithProtocol:","abstract":"<p>Start the audio feature of 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)startVideoWithProtocol:":{"name":"-startVideoWithProtocol:","abstract":"<p>Start the video feature of 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/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"<p>Set security managers which could be used. This is primarily used with video streaming applications to authenticate and perhaps encrypt traffic data.</p>","parent_name":"SDLStreamingMediaConfiguration"},"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)initWithSecurityManagers:encryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithSecurityManagers:encryptionFlag: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: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)initWithSecurityManagers:":{"name":"-initWithSecurityManagers:","abstract":"<p>Create a secure configuration for each of the security managers provided.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfigurationWithSecurityManagers:":{"name":"+secureConfigurationWithSecurityManagers:","abstract":"<p>Create a secure configuration for each of the security managers provided.</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)autostreamingSecureConfigurationWithSecurityManagers:initialViewController:":{"name":"+autostreamingSecureConfigurationWithSecurityManagers:initialViewController:","abstract":"<p>Create a CarWindow secure configuration with a view controller and security managers</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/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:hours:minutes:seconds:audioStreamingIndicator:":{"name":"-initWithUpdateMode:hours:minutes:seconds:audioStreamingIndicator:","abstract":"<p>Convenience init to create a SDLSetMediaClockTimer object</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:hours:minutes:seconds:":{"name":"-initWithUpdateMode:hours:minutes:seconds:","abstract":"<p>Convenience init to create a SDLSetMediaClockTimer object</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","abstract":"<p>Convenience init to create a SDLSetMediaClockTimer object</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:":{"name":"-initWithHelpText:timeoutText:","abstract":"<p>Initialize SetGlobalProperties with help text and timeout text</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:","abstract":"<p>Initialize SetGlobalProperties with help text, timeout text, help title, and help items</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:","abstract":"<p>Initialize SetGlobalProperties with all possible items</p>","parent_name":"SDLSetGlobalProperties"},"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(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(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)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:":{"name":"-initWithName:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with moduleName</p>","parent_name":"SDLSeatControlCapabilities"},"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:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with given parameters</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(im)initWithMessage:timeout:softButtons:":{"name":"-initWithMessage:timeout:softButtons:","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</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</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</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</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>Update text fields with new text set into the text field properties. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"<p>Update text fields with new text set into the text field properties. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</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)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:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:","abstract":"<p>Constructs a newly allocated SDLRemoteControlCapabilities object</p>","parent_name":"SDLRemoteControlCapabilities"},"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)syncMsgVersion":{"name":"syncMsgVersion","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)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:languageDesired:isMediaApp:appTypes:shortAppName:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:","abstract":"<p>Convenience init for registering the application with an app name, app id, desired language, whether or not the app is a media app, app types, and the short app name.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:","abstract":"<p>Convenience init for registering the application with an app name, app id, desired language, whether or not the app is a media app, app types, the short app name, tts name, voice recognition synonyms, the hmi display language desired, and the resume hash.</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)syncMsgVersion":{"name":"syncMsgVersion","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)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:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"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:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable: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(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName: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(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/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)getFunctionName":{"name":"-getFunctionName","abstract":"<p>Returns the function name.</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)getParameters:":{"name":"-getParameters:","abstract":"<p>Returns the value associated with the provided key. If the key does not exist, null is returned.</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:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:","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: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)syncFileName":{"name":"syncFileName","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)isRPCAllowed:":{"name":"-isRPCAllowed:","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)groupStatusOfRPCs:":{"name":"-groupStatusOfRPCs:","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)statusOfRPCs:":{"name":"-statusOfRPCs:","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)addObserverForRPCs:groupType:withHandler:":{"name":"-addObserverForRPCs:groupType:withHandler:","abstract":"<p>Add an observer for specified RPC names, with a callback that will be called whenever the value changes, as well as immediately with the current status.</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)rpcRequiresEncryption:":{"name":"-rpcRequiresEncryption:","abstract":"<p>Check whether or not an RPC needs encryption.</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/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(im)initWithInteractionChoiceSetId:":{"name":"-initWithInteractionChoiceSetId:","abstract":"<p>Convenience init for setting the a single visual or voice-recognition menu choice.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInteractionChoiceSetIdList:":{"name":"-initWithInteractionChoiceSetIdList:","abstract":"<p>Convenience init for setting the a visual or voice-recognition menu choices.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu with one choice.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu with one choice and VR help items.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu using the default display layout and VR help items. Prompts are created from the passed strings.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu using the default display layout. Prompts are created from the passed strings.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu using the default display layout.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:","abstract":"<p>Convenience init for setting all parameters of a visual 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(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>The current gear shift state of the user&rsquo;s vehicle</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)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</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)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/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/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)driverDistractionStatus":{"name":"driverDistractionStatus","abstract":"<p>Get the current driver distraction status(i.e. whether driver distraction rules are in effect, or not)</p>","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)userSelected":{"name":"userSelected","abstract":"<p>Get user selection status for the application (has the app been selected via hmi or voice command)</p>","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)lockScreenStatus":{"name":"lockScreenStatus","abstract":"<p>Indicates if the lockscreen should be required, optional or off</p>","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>Get HMILevel in effect for the application</p>","parent_name":"SDLOnLockScreenStatus"},"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:subCells:":{"name":"-initWithTitle: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:icon:subCells:":{"name":"-initWithTitle:icon: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: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:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType: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(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(py)proxy":{"name":"proxy","abstract":"<p>Deprecated internal proxy object. This should only be accessed when the Manager is READY. This property may go to nil at any time.","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 only enables the ASL logger.</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)showInOptionalState":{"name":"showInOptionalState","abstract":"<p>Whether or not the lock screen should be shown in the &ldquo;lock screen optional&rdquo; state. Defaults to NO.</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)enableAutomaticLockScreen":{"name":"enableAutomaticLockScreen","abstract":"<p>If YES, the lock screen should be managed by SDL and automatically engage when necessary. If NO, then the lock screen will never be engaged. 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:supportedLights:":{"name":"-initWithModuleName:supportedLights:","abstract":"<p>Constructs a newly allocated SDLLightControlCapabilities object with given parameters</p>","parent_name":"SDLLightControlCapabilities"},"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:appId:":{"name":"+defaultConfigurationWithAppName:appId:","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)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:appId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:appId: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(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:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:","abstract":"<p>Create a Keyboard Properties RPC object</p>","parent_name":"SDLKeyboardProperties"},"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:":{"name":"-initWithName:ofType:","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: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:":{"name":"-initWithName:","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:":{"name":"-initWithModuleName:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName</p>","parent_name":"SDLHMISettingsControlCapabilities"},"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:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName: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(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(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/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(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>The current gear shift state of the user&rsquo;s vehicle</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)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</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(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:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure: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)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation: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: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)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(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>A boolean value. If true, requests PRNDL data.</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)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)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(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(im)initWithModuleType:":{"name":"-initWithModuleType:","abstract":"<p>Convenience init to get information of a particular module type.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:":{"name":"-initAndSubscribeToModuleType:","abstract":"<p>Convenience init to get information and subscribe to a particular module type.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:":{"name":"-initAndUnsubscribeToModuleType:","abstract":"<p>Convenience init to unsubscribe from particular module type.</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/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(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:":{"name":"-initWithConnectionManager:","abstract":"<p>Creates a new file manager with a specified connection manager</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/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:windowTypeSupported:windowCapabilities:":{"name":"-initWithDisplayName:windowTypeSupported:windowCapabilities:","abstract":"<p>This method is broken (the types don&rsquo;t match the parameter names) and will always return nil. Use initWithDisplayName:windowCapabilities:windowTypeSupported: instead.</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:":{"name":"-initWithLifecycle:lockScreen:logging:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</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(cm)configurationWithLifecycle:lockScreen:logging:":{"name":"+configurationWithLifecycle:lockScreen:logging:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager 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/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager 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:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:","abstract":"<p>Convenience init for climate control data.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:","abstract":"<p>Convenience init for climate control data.</p>","parent_name":"SDLClimateControlData"},"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:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities.</p>","parent_name":"SDLClimateControlCapabilities"},"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(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(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:":{"name":"-initWithButtonName:moduleType:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:moduleId:":{"name":"-initWithButtonName:moduleType:moduleId:","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:":{"name":"-initWithModuleName:","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:":{"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:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName: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(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:rpcSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"<p>Convenience init for a media service manifest.</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:rpcSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"<p>Convenience init for a weather 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:rpcSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"<p>Convenience init for a navigation 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:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"<p>Convenience init for all parameters.</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)rpcSpecVersion":{"name":"rpcSpecVersion","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)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(im)initWithAlertText1:alertText2:duration:":{"name":"-initWithAlertText1:alertText2:duration:","abstract":"<p>Convenience init for creating an alert with two lines of text and a timeout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:":{"name":"-initWithAlertText1:alertText2:alertText3:","abstract":"<p>Convenience init for creating an alert with three lines of text.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:","abstract":"<p>Convenience init for creating an alert with three lines of text and a timeout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:softButtons:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:softButtons:","abstract":"<p>Convenience init for creating an alert with three lines of text and a timeout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:playTone:":{"name":"-initWithTTS:playTone:","abstract":"<p>Convenience init for creating a speech-only alert.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:playTone:duration:","abstract":"<p>Convenience init for creating an alert with two lines of text, optional sound cues, and a timout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:alertText3:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:alertText3:playTone:duration:","abstract":"<p>Convenience init for creating an alert with three lines of text, optional sound cues, and a timout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:","abstract":"<p>Convenience init for creating an alert with three lines of text, soft buttons, and optional sound cues.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:","abstract":"<p>Convenience init for creating an alert with three lines of text, soft buttons, optional sound cues, and a timout.</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)initWithId:menuName:":{"name":"-initWithId:menuName:","abstract":"<p>Convenience init for creating an add submenu</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:position:":{"name":"-initWithId:menuName:position:","abstract":"<p>Convenience init for creating an add submenu</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:menuIcon:position:":{"name":"-initWithId:menuName:menuIcon:position:","abstract":"<p>Convenience init for creating an add submenu</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:menuLayout:menuIcon:position:":{"name":"-initWithId:menuName:menuLayout:menuIcon:position:","abstract":"<p>Convenience init for creating an add submenu with all properties.</p>","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/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:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType: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: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/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.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/SDLOnLockScreenStatus.html":{"name":"SDLOnLockScreenStatus","abstract":"<p>To help prevent driver distraction, any SmartDeviceLink application is required to implement a lockscreen that must be enforced while the application is active on the system while the vehicle is in motion.</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/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/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/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/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/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/SDLSyncMsgVersion.html":{"name":"SDLSyncMsgVersion","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.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/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/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: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: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>Character sets supported by SDL. Used to describe text field capabilities.</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: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 filed. 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:SDLLockScreenStatus.h@T@SDLLockScreenStatus":{"name":"SDLLockScreenStatus","abstract":"<p>Describes what the status of the lock screen should be</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: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:":{"name":"-managerShouldUpdateLifecycleToLanguage:","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)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:completionHandler:":{"name":"-updateAutocompleteWithInput:completionHandler:","abstract":"<p>Implement this if you wish to update the KeyboardProperties.autoCompleteText 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)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:@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:@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:@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>Character Set Type 2</p>"},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"<p>Character Set Type 5</p>"},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"<p>Character Set CID1</p>"},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"<p>Character Set CID2</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:@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:@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:@SDLLockScreenStatusOff":{"name":"SDLLockScreenStatusOff","abstract":"<p>LockScreen is Not Required</p>"},"Constants.html#/c:@SDLLockScreenStatusOptional":{"name":"SDLLockScreenStatusOptional","abstract":"<p>LockScreen is Optional</p>"},"Constants.html#/c:@SDLLockScreenStatusRequired":{"name":"SDLLockScreenStatusRequired","abstract":"<p>LockScreen is Required</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:@SDLDidChangeLockScreenStatusNotification":{"name":"SDLDidChangeLockScreenStatusNotification","abstract":"<p>Name for a LockScreenStatus notification RPC</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:@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 ubscribeWayPoints 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:@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:@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:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"<p>Second gear</p>"},"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:@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:@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:@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:@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:@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:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</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:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</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:@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:@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:@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:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"<p>GPS vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"<p>Vehicle speed data</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:@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:@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/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/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:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:","abstract":"<p>Convenience init for creating a video streaming capability.</p>","parent_name":"SDLVideoStreamingCapability"},"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)initWithSyncMsgVersion:":{"name":"-initWithSyncMsgVersion:","abstract":"<p>Deprecated convenience init to set version using SDLSyncMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSyncMsgVersion:":{"name":"+versionWithSyncMsgVersion:","abstract":"<p>Deprecated convenience init to set version using SDLSyncMsgVersion</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(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>The result of requesting to unsubscribe to the PRNDL status.</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)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)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)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:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure: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)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation: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: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)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(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>If true, unsubscribes from PRNDL</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)wiperStatus":{"name":"wiperStatus","abstract":"<p>If true, unsubscribes from Wiper Status</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)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)movementTimeThreshold":{"name":"movementTimeThreshold","abstract":"<p>Time (in seconds) between movement events to register panning or pinching callbacks.</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 and <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)movementTimeThreshold\">movementTimeThreshold</a></code> will be used. 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:":{"name":"-initWithHitTester:","abstract":"<p>Initialize a touch manager with a hit tester if available</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 character set that is supported in this field.</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)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:withBlock:":{"name":"-subscribeToCapabilityType:withBlock:","abstract":"<p>Subscribe to a particular capability type using a block callback.</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(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/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"<p>Convenience init to describe the SDL version</p>","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"<p>The major version indicates versions that is not-compatible to previous versions</p>","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(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":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"<p>Allows backward-compatible fixes to the API without increasing the minor version of the interface</p>","parent_name":"SDLSyncMsgVersion"},"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>The result of requesting to subscribe to the PRNDL status.</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)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)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)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:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure: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)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation: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: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)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(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>A boolean value. If true, subscribes PRNDL data.</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)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)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)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:":{"name":"-initWithConnectionManager:configuration:","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)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/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startAudioWithProtocol:":{"name":"-startAudioWithProtocol:","abstract":"<p>Start the audio feature of 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)startVideoWithProtocol:":{"name":"-startVideoWithProtocol:","abstract":"<p>Start the video feature of 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/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"<p>Set security managers which could be used. This is primarily used with video streaming applications to authenticate and perhaps encrypt traffic data.</p>","parent_name":"SDLStreamingMediaConfiguration"},"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)initWithSecurityManagers:encryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithSecurityManagers:encryptionFlag: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: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)initWithSecurityManagers:":{"name":"-initWithSecurityManagers:","abstract":"<p>Create a secure configuration for each of the security managers provided.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfigurationWithSecurityManagers:":{"name":"+secureConfigurationWithSecurityManagers:","abstract":"<p>Create a secure configuration for each of the security managers provided.</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)autostreamingSecureConfigurationWithSecurityManagers:initialViewController:":{"name":"+autostreamingSecureConfigurationWithSecurityManagers:initialViewController:","abstract":"<p>Create a CarWindow secure configuration with a view controller and security managers</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/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:hours:minutes:seconds:audioStreamingIndicator:":{"name":"-initWithUpdateMode:hours:minutes:seconds:audioStreamingIndicator:","abstract":"<p>Convenience init to create a SDLSetMediaClockTimer object</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:hours:minutes:seconds:":{"name":"-initWithUpdateMode:hours:minutes:seconds:","abstract":"<p>Convenience init to create a SDLSetMediaClockTimer object</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","abstract":"<p>Convenience init to create a SDLSetMediaClockTimer object</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:":{"name":"-initWithHelpText:timeoutText:","abstract":"<p>Initialize SetGlobalProperties with help text and timeout text</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:","abstract":"<p>Initialize SetGlobalProperties with help text, timeout text, help title, and help items</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:","abstract":"<p>Initialize SetGlobalProperties with all possible items</p>","parent_name":"SDLSetGlobalProperties"},"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(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(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)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:":{"name":"-initWithName:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with moduleName</p>","parent_name":"SDLSeatControlCapabilities"},"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:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with given parameters</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(im)initWithMessage:timeout:softButtons:":{"name":"-initWithMessage:timeout:softButtons:","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</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</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</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</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>Update text fields with new text set into the text field properties. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"<p>Update text fields with new text set into the text field properties. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</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:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:","abstract":"<p>Constructs a newly allocated SDLRemoteControlCapabilities object</p>","parent_name":"SDLRemoteControlCapabilities"},"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)syncMsgVersion":{"name":"syncMsgVersion","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)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:languageDesired:isMediaApp:appTypes:shortAppName:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:","abstract":"<p>Convenience init for registering the application with an app name, app id, desired language, whether or not the app is a media app, app types, and the short app name.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:","abstract":"<p>Convenience init for registering the application with an app name, app id, desired language, whether or not the app is a media app, app types, the short app name, tts name, voice recognition synonyms, the hmi display language desired, and the resume hash.</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)syncMsgVersion":{"name":"syncMsgVersion","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)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:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"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:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable: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(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName: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(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)getFunctionName":{"name":"-getFunctionName","abstract":"<p>Returns the function name.</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)getParameters:":{"name":"-getParameters:","abstract":"<p>Returns the value associated with the provided key. If the key does not exist, null is returned.</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:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:","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: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)syncFileName":{"name":"syncFileName","abstract":"<p>File reference name</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)isRPCAllowed:":{"name":"-isRPCAllowed:","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)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)groupStatusOfRPCs:":{"name":"-groupStatusOfRPCs:","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)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)statusOfRPCs:":{"name":"-statusOfRPCs:","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)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)addObserverForRPCs:groupType:withHandler:":{"name":"-addObserverForRPCs:groupType:withHandler:","abstract":"<p>Add an observer for specified RPC names, with a callback that will be called whenever the value changes, as well as immediately with the current status.</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. Unlike addObserverForRPCs:groupType:withHandler:, 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)rpcRequiresEncryption:":{"name":"-rpcRequiresEncryption:","abstract":"<p>Check whether or not an RPC needs encryption.</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(im)initWithInteractionChoiceSetId:":{"name":"-initWithInteractionChoiceSetId:","abstract":"<p>Convenience init for setting the a single visual or voice-recognition menu choice.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInteractionChoiceSetIdList:":{"name":"-initWithInteractionChoiceSetIdList:","abstract":"<p>Convenience init for setting the a visual or voice-recognition menu choices.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu with one choice.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu with one choice and VR help items.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu using the default display layout and VR help items. Prompts are created from the passed strings.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu using the default display layout. Prompts are created from the passed strings.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:","abstract":"<p>Convenience init for creating a visual or voice-recognition menu using the default display layout.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:","abstract":"<p>Convenience init for setting all parameters of a visual 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(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>The current gear shift state of the user&rsquo;s vehicle</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)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</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)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/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/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)driverDistractionStatus":{"name":"driverDistractionStatus","abstract":"<p>Get the current driver distraction status(i.e. whether driver distraction rules are in effect, or not)</p>","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)userSelected":{"name":"userSelected","abstract":"<p>Get user selection status for the application (has the app been selected via hmi or voice command)</p>","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)lockScreenStatus":{"name":"lockScreenStatus","abstract":"<p>Indicates if the lockscreen should be required, optional or off</p>","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>Get HMILevel in effect for the application</p>","parent_name":"SDLOnLockScreenStatus"},"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:subCells:":{"name":"-initWithTitle: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:icon:subCells:":{"name":"-initWithTitle:icon: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: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:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType: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(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 only enables the ASL logger.</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)showInOptionalState":{"name":"showInOptionalState","abstract":"<p>Whether or not the lock screen should be shown in the &ldquo;lock screen optional&rdquo; state. Defaults to NO.</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)enableAutomaticLockScreen":{"name":"enableAutomaticLockScreen","abstract":"<p>If YES, the lock screen should be managed by SDL and automatically engage when necessary. If NO, then the lock screen will never be engaged. 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:supportedLights:":{"name":"-initWithModuleName:supportedLights:","abstract":"<p>Constructs a newly allocated SDLLightControlCapabilities object with given parameters</p>","parent_name":"SDLLightControlCapabilities"},"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:appId:":{"name":"+defaultConfigurationWithAppName:appId:","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)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:appId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:appId: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(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:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:","abstract":"<p>Create a Keyboard Properties RPC object</p>","parent_name":"SDLKeyboardProperties"},"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:":{"name":"-initWithName:ofType:","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: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:":{"name":"-initWithName:","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:":{"name":"-initWithModuleName:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName</p>","parent_name":"SDLHMISettingsControlCapabilities"},"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:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName: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(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(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/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(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>The current gear shift state of the user&rsquo;s vehicle</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)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</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(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:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure: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)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation: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: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)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(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>A boolean value. If true, requests PRNDL data.</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)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)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(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(im)initWithModuleType:":{"name":"-initWithModuleType:","abstract":"<p>Convenience init to get information of a particular module type.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:":{"name":"-initAndSubscribeToModuleType:","abstract":"<p>Convenience init to get information and subscribe to a particular module type.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:":{"name":"-initAndUnsubscribeToModuleType:","abstract":"<p>Convenience init to unsubscribe from particular module type.</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/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(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:":{"name":"-initWithConnectionManager:","abstract":"<p>Creates a new file manager with a specified connection manager</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/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:windowTypeSupported:windowCapabilities:":{"name":"-initWithDisplayName:windowTypeSupported:windowCapabilities:","abstract":"<p>This method is broken (the types don&rsquo;t match the parameter names) and will always return nil. Use initWithDisplayName:windowCapabilities:windowTypeSupported: instead.</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/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:":{"name":"-initWithLifecycle:lockScreen:logging:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:":{"name":"+configurationWithLifecycle:lockScreen:logging:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging 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:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:","abstract":"<p>Convenience init for climate control data.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:","abstract":"<p>Convenience init for climate control data.</p>","parent_name":"SDLClimateControlData"},"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:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities.</p>","parent_name":"SDLClimateControlCapabilities"},"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(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(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:":{"name":"-initWithButtonName:moduleType:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:moduleId:":{"name":"-initWithButtonName:moduleType:moduleId:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"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:":{"name":"-initWithModuleName:","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:":{"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:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName: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(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:rpcSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"<p>Convenience init for a media service manifest.</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:rpcSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"<p>Convenience init for a weather 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:rpcSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"<p>Convenience init for a navigation 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:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"<p>Convenience init for all parameters.</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)rpcSpecVersion":{"name":"rpcSpecVersion","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)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(im)initWithAlertText1:alertText2:duration:":{"name":"-initWithAlertText1:alertText2:duration:","abstract":"<p>Convenience init for creating an alert with two lines of text and a timeout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:":{"name":"-initWithAlertText1:alertText2:alertText3:","abstract":"<p>Convenience init for creating an alert with three lines of text.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:","abstract":"<p>Convenience init for creating an alert with three lines of text and a timeout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:softButtons:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:softButtons:","abstract":"<p>Convenience init for creating an alert with three lines of text and a timeout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:playTone:":{"name":"-initWithTTS:playTone:","abstract":"<p>Convenience init for creating a speech-only alert.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:playTone:duration:","abstract":"<p>Convenience init for creating an alert with two lines of text, optional sound cues, and a timout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:alertText3:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:alertText3:playTone:duration:","abstract":"<p>Convenience init for creating an alert with three lines of text, optional sound cues, and a timout.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:","abstract":"<p>Convenience init for creating an alert with three lines of text, soft buttons, and optional sound cues.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:","abstract":"<p>Convenience init for creating an alert with three lines of text, soft buttons, optional sound cues, and a timout.</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)initWithId:menuName:":{"name":"-initWithId:menuName:","abstract":"<p>Convenience init for creating an add submenu</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:position:":{"name":"-initWithId:menuName:position:","abstract":"<p>Convenience init for creating an add submenu</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:menuIcon:position:":{"name":"-initWithId:menuName:menuIcon:position:","abstract":"<p>Convenience init for creating an add submenu</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:menuLayout:menuIcon:position:":{"name":"-initWithId:menuName:menuLayout:menuIcon:position:","abstract":"<p>Convenience init for creating an add submenu with all properties.</p>","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/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:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType: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: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/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.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/SDLOnLockScreenStatus.html":{"name":"SDLOnLockScreenStatus","abstract":"<p>To help prevent driver distraction, any SmartDeviceLink application is required to implement a lockscreen that must be enforced while the application is active on the system while the vehicle is in motion.</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/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/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/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/SDLSyncMsgVersion.html":{"name":"SDLSyncMsgVersion","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.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/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/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 d8ed30950..eedb39d58 100644
--- a/docs/undocumented.json
+++ b/docs/undocumented.json
@@ -1,61 +1,6 @@
{
"warnings": [
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 155,
- "symbol": "SDLSystemCapabilityManagerError",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.enum",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 155,
- "symbol": "SDLSystemCapabilityManagerError",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.typedef",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 156,
- "symbol": "SDLSystemCapabilityManagerError.SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 157,
- "symbol": "SDLSystemCapabilityManagerError.SDLSystemCapabilityManagerErrorHMINone",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 158,
- "symbol": "SDLSystemCapabilityManagerError.SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 196,
- "symbol": "SDLCacheFileManagerError",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.enum",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLErrorConstants.h",
- "line": 196,
- "symbol": "SDLCacheFileManagerError",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.typedef",
- "warning": "undocumented"
- },
- {
- "file": "/Users/joelfischer/Development/livio/sdl/sdl_ios/SmartDeviceLink/SDLTouch.h",
- "line": 14,
- "symbol": "SDLTouchIdentifier",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.typedef",
- "warning": "undocumented"
- }
+
],
"source_directory": "/Users/joelfischer/Development/livio/sdl/sdl_ios"
} \ No newline at end of file
diff --git a/generator/templates/base_struct_function.m.jinja2 b/generator/templates/base_struct_function.m.jinja2
index 30bb2e976..ee17b5ccf 100644
--- a/generator/templates/base_struct_function.m.jinja2
+++ b/generator/templates/base_struct_function.m.jinja2
@@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
{%- endif %}
- (instancetype)initWith{{c.init}} {
- self = [{{ 'self' if c.self else 'super' }} init{{ 'With' + c.self if c.self and c.self is string }}];
+ self = [self init{{ 'With' + c.self if c.self and c.self is string }}];
if (!self) {
return nil;
}
diff --git a/generator/transformers/common_producer.py b/generator/transformers/common_producer.py
index ac7bc6167..59dbac4c3 100644
--- a/generator/transformers/common_producer.py
+++ b/generator/transformers/common_producer.py
@@ -147,7 +147,7 @@ class InterfaceProducerCommon(ABC):
return name[:1].lower() + name[1:]
@staticmethod
- def extract_description(data, length: int = 113) -> list:
+ def extract_description(data, length: int = 2048) -> list:
"""
Evaluate, align and delete @TODO
:param data: list with description